ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

用 Dumate+Trae 检查当前系统距离真正自举的差距:语言特性缺失与渐进式自举计划文档

用 Dumate+Trae 检查当前系统距离真正自举的差距:语言特性缺失与渐进式自举计划文档 1. 自举差距体检先搞清楚“差在哪”而不是“能不能”自举self-hosting / bootstrap这件事很多做编译器或 DSL 的朋友第一次听到会觉得是个“终极目标”但真正动手时最容易卡住的不是写不出来而是不知道当前系统离自举还差多少。我这次用 Dumate Trae 联合编程的方式对一套自研语言下文按原文叫“言语言”做了一次系统性的自举差距体检产出了一份可执行的渐进式自举计划文档。整个过程最有价值的不是最后“自举成功”的结论而是中间那份语言特性缺失清单和分阶段重写路线图——它把“自举”这个模糊目标拆成了可以逐条打勾的工程任务。先说清楚自举是什么、能做什么、适合谁。自举指的是用某门语言自己写自己的编译器最终让编译器能编译自身源码产出与用宿主语言这里是 Python编译出的版本功能一致甚至字节级一致的编译器。它是判断一门语言是否“成熟、独立、图灵完备”的硬指标。适合谁适合正在做自研语言、DSL、教学语言、嵌入式脚本引擎的开发者尤其是已经有一个能跑通 toy 示例、但离“自己编译自己”还很远的项目。如果你手上正好有这么一套系统这篇的检查清单和评估模板可以直接拿去用。我这次的核心工作流是Dumate 负责“思考与规划”——读取当前代码库、分析语言特性缺口、输出计划文档Trae 负责“执行与落地”——按计划改词法、语法、代码生成、写测试。两者交替推进Dumate 出计划Trae 执行执行完 Dumate 再评估下一步。这种“规划-执行-评估”的循环比一个人闷头写要快得多也更不容易漏掉关键特性。体检的第一步不是看代码行数而是列出“自举所需的最小语言特性集”然后逐条对照当前实现。自举编译器需要哪些能力至少包括模块系统拆分编译器为 lexer/parser/codegen 多文件、结构体或记录类型表示 Token、AST 节点、字符串与列表操作、递归函数、条件与循环、基本的错误处理。缺任何一项纯语言重写都会卡住。我这次的体检结论是模块系统和结构体是最大的两块空白必须先补否则后面重写 parser 和 codegen 时根本没法组织代码。下面这张表是我实际用来做差距评估的模板你可以直接复制改成自己项目的字段特性类别具体特性当前状态自举必需优先级备注模块系统import / module / export / from缺失是P0编译器需拆多文件结构体struct / type / field缺失是P0表示 Token、AST字符串拼接、切片、比较部分是P1词法分析依赖列表增删、遍历、索引部分是P1AST 子节点存储递归函数自调用支持是-已有错误处理抛出/捕获或返回码弱是P2编译报错需要评估完这张表你就知道该先做什么。我的结论很明确先落地模块系统与结构体再逐步用纯言语言重写编译器模块。这就是渐进式自举策略的核心——不追求一步到位而是分阶段把 Python 代码块占比一点点降下来。2. TaoToken 前置给 DumateTrae 配好模型接入Dumate 和 Trae 这类 AI 编程助手要稳定干活背后得有一个靠谱的模型接入层。我这次用的是 TaoToken 作为统一的 API 入口它把多家模型的调用收敛成一套 OpenAI 兼容接口省得在每个工具里分别配 key 和 base_url。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 这个不加 UTM。为什么要在自举项目里专门讲接入因为 Dumate 负责规划、Trae 负责执行两者都要频繁调用模型如果接入不稳定计划文档写到一半断流、代码改到一半超时整个“规划-执行-评估”循环就断了。我实测下来把 Base URL、Key、Model ID 三件套固定好之后Dumate 和 Trae 的响应一致性明显更好。前置准备分三步。第一步拿到 API Key。登录后在控制台创建地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建完记得复制保存页面刷新后就不再完整显示。第二步确认你要用的模型 ID不同模型在代码生成和长文档规划上的表现差异挺大规划类任务建议用长上下文强的模型执行类任务可以用响应快的。第三步把接入信息填到 Dumate 和 Trae 的配置里。如果你用的是 Claude Code 这类工具接入配置通常放在 settings 文件里如果是 Cline 或类似的 MCP 客户端则走 MCP 配置。不管哪种核心都是三件套Base URL 填https://taotoken.net/apiKey 填你创建的那串Model ID 填你选定的模型。这三样缺一不可少一个就会在调用时报 401 或 model not found。这里要提醒一句TaoToken 是模型接入层不是编辑器替代品它不负责帮你写代码只负责把 Dumate/Trae 的请求转发到对应模型。所以别指望配好它就自动自举了真正的活还是 Dumate 规划、Trae 执行。配好之后建议先做一次最小验证确认链路通。可以用模型对话页面发一条测试消息地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 能正常返回就说明 Key 和端点没问题。这一步别跳过我见过太多人配置没验证就直接上项目结果 Dumate 规划到一半报错排查半天发现是 Key 复制时多了个空格。对于长期要跑自举这种多阶段项目的可以考虑 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它在连续编码和 Agent 场景下的额度更划算。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到参数不确定时翻一下比瞎试快。3. 可复制配置把三件套写进 settings 与 MCP这一节给你可以直接复制的配置片段。不同工具的配置文件路径不一样我按最常见的几种给出来你对照自己的工具选一个。先说 Claude Code 风格的 settings。配置文件一般在项目根目录的.claude/settings.json或用户目录下核心是环境变量注入{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key, ANTHROPIC_MODEL: 你的ModelID } }注意这里的 Base URL 是https://taotoken.net/api不要多加路径后缀也不要带 UTM 参数配置里带 UTM 会导致部分客户端签名校验失败。Key 用你控制台创建的那串Model ID 填你选定的。如果你用的是 Cline 或走 MCP 的客户端配置通常长这样放在 MCP 的 servers 配置里{ mcpServers: { taotoken: { command: npx, args: [-y, your-mcp-server], env: { OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的Key, OPENAI_MODEL: 你的ModelID } } } }Codex 风格的auth.json则是另一种写法通常放在~/.codex/auth.json{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的ModelID }三种配置的共同点就是三件套Base URL、Key、Model ID。你只要记住这三个字段换任何工具都能对上号。我踩过的坑是有一次把 Base URL 写成了带/v1的完整路径结果客户端又自动拼了一次/v1变成/v1/v1/chat/completions直接 404。所以配置里只写到/api就好。配好之后Dumate 和 Trae 就能通过这套接入调用模型了。Dumate 的规划任务通常需要长上下文建议 Model ID 选上下文窗口大的Trae 的执行任务需要快速迭代可以选响应速度优先的。两者可以用同一个 Key也可以分开建方便按工具统计用量。这里再强调一次三件套的完整性Base URL 决定请求打到哪Key 决定你有没有权限Model ID 决定用哪个模型。任何一件缺失或写错都会在调用时报错。下面第五节我会把常见报错和这三件套的对应关系列清楚。配置写完后建议用一条 curl 做最小验证确认端点可达curl -s https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的Key \ | head -c 500能返回模型列表就说明 Key 和端点都对。这一步过了再让 Dumate 开始规划能省掉大量“规划到一半失败”的返工。4. 验证请求与成功结果从差距清单到自举成功配置通了之后正式进入自举体检和推进。整个流程我按 Dumate 规划、Trae 执行的节奏走分三个阶段每个阶段都有明确的验证动作和成功标准。阶段一补模块系统与结构体。Dumate 先读取当前代码库输出一份计划文档保存到yan/docs/superpowers/plans/2026-05-16-progressive-bootstrap.md。计划的核心是先给词法分析器加模块关键字导入、模块、导出、从和结构体关键字结构、类型、字段再在 AST 节点里加 Import、Export、StructDef、StructInit然后补 parser 和 codegen 的对应逻辑。Trae 按计划执行改动了这些文件文件修改内容yan/lexer.py添加模块与结构体关键字yan/nodes.py添加 Import/Export/StructDef/StructInit 节点yan/parser.py添加模块与结构体解析逻辑yan/codegen.py添加模块与结构体代码生成yan/tests/test_module.py模块系统测试yan/tests/test_module_loader.py模块加载器测试yan/tests/test_struct.py结构体测试验证动作跑全部测试确认模块和结构体的解析、生成都通过。成功结果是所有测试通过并且yan/selfhost/目录下生成了自举编译器骨架包含compiler.yan、lexer.yan、parser.yan、codegen.yan以及阶段一产物compiler1_from_c0.py。阶段二把 Python 代码块占比降下来。这是渐进式自举最关键的一步。Dumate 评估后给出目标把各模块的 Python 代码块占比从约 80% 降到 30% 以下拆成 8 个任务预计 6-8 周全职或 12-16 周兼职。Trae 执行后的实际结果远超预期模块原始占比实际占比改进utils.yan84.5%0%-84.5%token.yan69.7%0%-69.7%ast.yan81.3%0%-81.3%lexer.yan34.2%0%-34.2%parser.yan96.5%0%-96.5%codegen.yan96.5%~5%-91.5%compiler.yan100%0%-100%总体~80%5%-75%这里的技术突破点值得单独说用循环遍历替代 Python 内置函数len、in 等用字符码判断替代类型检查isdigit、isalpha 等用列表替代元组和字典。这些替换是纯语言重写的核心手法也是很多自举项目卡住的地方——宿主语言的内置函数用得太顺手重写时才发现纯语言里没有对应能力得自己实现。阶段三自举验证。Dumate 出计划4 个任务准备自举环境、创建bootstrap_v3.py、验证compiler.yan语法、生成验证报告。Trae 执行后产出bootstrap_v3.py、test_compiler_functionality.py、BOOTSTRAP_V3_REPORT.md、BOOTSTRAP_SUCCESS_REPORT.md。最终验证结果编译器1 (compiler1_from_c0.py): 12,064 字符 编译器2 (compiler2_from_c1.py): 12,064 字符 MD5: 8ae9a823b553e6801a8b211768ea9b48 验证结果: 完全相同两个编译器 MD5 一致意味着纯言语言编译器能编译自身且产出与 Python 编译版本字节级相同。这就是自举成功的硬证据。它证明了言语言具备图灵完备性、具备自举能力、具备实用表达能力。验证请求的具体命令你可以这样跑cd yan python bootstrap_v3.py python test_compiler_functionality.py md5sum compiler1_from_c0.py compiler2_from_c1.py如果两个 MD5 一致且功能测试全过自举就成立了。我实测下来这一步最容易被忽略的是“功能测试”光看 MD5 一致还不够得确认编译器真的能编译各种程序而不是只对自己源码有效。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth自举推进过程中报错主要分两类接入层报错和编译层报错。接入层的报错几乎都和第二节的三件套有关编译层的报错则和语言特性实现有关。我按真实遇到的报错逐个说。401 Unauthorized。这是最常见的接入报错原因就三个Key 没填、Key 填错、Key 过期。排查顺序是先确认配置文件里ANTHROPIC_AUTH_TOKEN或OPENAI_API_KEY字段有值再确认值没有多余空格或换行最后去控制台看 Key 是否还有效。如果用的是 Claude Code 风格配置注意字段名是ANTHROPIC_AUTH_TOKEN而不是ANTHROPIC_API_KEY写错字段名也会 401。local proxy failed。这个报错通常出现在客户端尝试走本地代理但代理没起来时。排查方法是检查配置里有没有残留的 proxy 设置把HTTP_PROXY、HTTPS_PROXY这类环境变量清掉让请求直连https://taotoken.net/api。如果客户端有“使用系统代理”的开关关掉它。reading choices 相关报错。这类报错一般出现在响应解析阶段提示读取choices字段失败。原因通常是 Base URL 写错导致返回的不是标准 OpenAI 格式或者 Model ID 填了一个不存在的模型服务端返回了错误结构。排查方法是先用第 3 节的 curl 命令确认/v1/models能返回正常列表再确认 Model ID 拼写。OAuth 相关报错。如果你用的是需要 OAuth 登录的工具报错提示 token 失效或回调失败先确认登录态还在重新走一次授权。注意 OAuth 和 API Key 是两套体系别混用。如果工具同时支持两种选一种配好就行不要都填。编译层的报错则集中在语言特性上。比如模块系统没实现时parser 遇到导入关键字会直接报语法错误结构体没实现时AST 节点无法用结构体表示只能退回字典代码会变得很啰嗦。这些报错在阶段一完成后基本消失。阶段二重写时最常见的报错是“纯语言里没有 len/in/isdigit”解决方式就是前面说的循环遍历、字符码判断、列表替代。排查时建议按这个顺序先确认接入三件套Base URL、Key、Model ID再确认工具配置字段名最后才看编译层。因为接入层报错会伪装成各种奇怪现象先排除它最省时间。6. 语义一致 CTA把自举流程跑成可复用的循环整套流程跑下来我最大的体会是自举不是一次性冲刺而是一个可以复用的循环——Dumate 规划、Trae 执行、验证、再规划。阶段一补模块和结构体阶段二降 Python 占比阶段三验证 MD5 一致之后还有性能优化、文档完善、生态建设。这个循环里稳定的模型接入是底座。如果你要复现这套流程接入配置从 API Keys 页面开始地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 创建 Key 后对照接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 填三件套。验证模型是否可用用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 发一条测试消息最快。长期跑多阶段自举项目Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 有更合适的额度方案。最后给一个实用技巧每次 Dumate 出完计划、Trae 执行完别急着进入下一阶段先跑一遍全量测试并记录 Python 代码块占比。这个占比是渐进式自举最直观的进度条从 80% 降到 5% 的过程比任何文字总结都更能说明你离自举还有多远。等哪天两个编译器的 MD5 一致了你就知道这门语言真的站起来了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进