去年的这个时候一直在探索如何用 AI 实现编程语言,当时 Agent
和工具链还不够齐全,所以尝试一段时间就断更了,有兴趣的可以再回忆这两篇用 Prompt
实现的词法解析器:
- 《ChatGPT|AI自制编程语言-从0开始》mp.weixin.qq.com/s/1ULqllAE0...
- 《ChatGPT|AI自制编程语言-词法解析》mp.weixin.qq.com/s/wbUU25oRJ...
随着当前各种编程 Agent
,MCP
的层出不穷,大模型的正在加速进化,于是又开始探索,不过这次的目标是用 golang
实现 JavaScript
引擎(目标是完成 ES5.1 的全部功能)。
1. 回顾 JS 编译器的实现过程

如上是总结的 V8
大体的实现方式,编程语言的实现已经经历了几十年的发展,包括 V8,Lua等语言基本都采用类似实现步骤:
- 词法分析
- 语法分析
- 语义解析和优化
- 虚拟机
- 通过 JIT 实现性能优化
- ...
2. 如何选择工具链和知识库

2.1 AI 编码助手
AI 编码助手有很多,但是用的顺手的却不多,我个人经常使用如下:
- Trae 海外版本,使用 Builer 模式
-
- 优点:各种模型免费(不过有时候需要排队),对于 web 开发友好,调试器比较方便
- 缺点:界面与 VSCode 差异大,代码提示不太友好,合并代码经常会出现 bug,工具链不齐全
- Windsurf,使用 Cascade:
-
- 优点:有些模型会现实免费,基于 VSCode 实现,使用习惯差异不大,界面清晰,代码提示和 bugfix 可以让 AI 自动执行
- 缺点:提示有时候有点乱,如果思考时间过长,会经常超时,不能添加自定义模型
- Cursor:
-
- 优点:社区完善,自由选择模型,支持 MCP 市场,方便添加各种 rules
- 缺点:太贵,功能太多导致新手了解有一定的门槛,多文件之前上下文切换不太流畅
2.2 知识库
要实现 JavaScript 编译器,首先开发者要了解编译器实现方案(参考上图),然后让 AI 了解实现方案(虽然 AI 本身已经有编译器的实现原理,但是开发者需要按照场景提示 AI 按照哪种方案实现),最好要有简单的样例给到 AI 编码助手,这里提供一些知识库的资料:
- github.com/linkxzhou/m... 非常简单的 JS 编译器实现
- github.com/wren-lang/w... wren 脚本语言源码,大约 4000 行代码
- 书籍:《用 Go 语言自制解释器》和《用 Go 语言自制编译器》
- 书籍:《编译器设计(第二版)》和《自己动手构建编程语言》
- JS 测试用例集合:github.com/tc39/test26...
如果您实现的不是 JS 编译器,也可以作为知识库,让 AI 参考源码按照你想要的方式实现(比如:用 Rust 实现 JS ...)。
3. 解决思路
针对 simplejs
实现的项目总结如下:
- 制定明确的项目规则,我们要实现
Javascript
引擎,从以往的经验上看,项目至少超过 3000 行,所以先要将功能拆解为规则(各种 Prompt),而不是直接输入[实现Javascript引擎] - 在提示词中明确指出技术栈、期望行为和约束条件,就像提供规范说明书,约束模型的边界
- 让 AI 拆解功能,以小型、功能为单位划分文件来生产,测试和功能验证
- 测试驱动开发:先可以根据你描述的功能,生成测试用例,验证 AI 是否遵循了你的功能要求,然后生产功能逻辑后,尽可能多的再生产测试用例,最后保证测试用例100% 通过
- 控制质量:AI 输出的任何功能,要了解边界条件,并且提示 AI,输出的代码需要保持可读性,甚至可以让 AI 不断重构当前的功能,以保证按照最少代码实现
- 控制上下文:如果上下文很多,我们不需要按照整个工程提问,而是按照某个文件,或者某个文件的某些行扩展
- 有时候需要人工:报错比较明确,或者歧义的代码,建议开发者直接上手改代码修复
- 必要时候切换模型:有些问题用 DeepSeek 可以快速回答,就不需要用 Claude-3.7,当某些模型不能解决当前问题时,建议手动切换不同模型尝试(模型的边界比较模糊,有些时候 Claude-3.7 不能解决,GPT-4o 却可以解决)
- 如果有文档,可以单独建立 docs 目录,记录你想要的功能或者 API,甚至需要链接的知识库等
- 调试代码多加日志:打印比较多的日志,基于日志的上下文让 AI 修复 bug,能更快的分析问题并解决问题,而不是依赖 AI 对整个功能分析
4. 总结(完成第一个版本)
代码已经开源(simplejs): github.com/linkxzhou/m...
通过 AI 实现代码详细如下:
- 测试用例:
2316
行 - 功能代码:
3556
行 - 代码覆盖率:
coverage: 74.9% of statements

后续需要完成的工作:
- 测试完整的 JS 测试集:tc39github.com/tc39/test26...
- 增加性能优化:
-
- 解决尾递归问题
- 编译预计算
- 尝试通过 AI 实现少量的
JIT
功能 - ...
- 执行
Benchmark
,运行压测,让AI 分析
profile,找到性能优化点。