AI自制编程语言-用 Trae 实现JavaScript编译器

去年的这个时候一直在探索如何用 AI 实现编程语言,当时 Agent 和工具链还不够齐全,所以尝试一段时间就断更了,有兴趣的可以再回忆这两篇用 Prompt 实现的词法解析器:

随着当前各种编程 AgentMCP 的层出不穷,大模型的正在加速进化,于是又开始探索,不过这次的目标是用 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 编码助手,这里提供一些知识库的资料:

如果您实现的不是 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,找到性能优化点。
相关推荐
java叶新东老师7 分钟前
goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
开发语言·后端·golang
码事漫谈2 小时前
C++模板元编程从入门到精通
后端
_風箏2 小时前
Java【代码 14】一个用于判断磁盘空间和分区表是否需要清理的工具类
后端
_風箏2 小时前
Java【代码 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)
后端
_風箏2 小时前
Java【代码 12】判断一个集合是否包含另一个集合中的一个或多个元素 retainAll() 及其他方法
后端
Java中文社群2 小时前
Coze开源版?别吹了!
人工智能·后端·开源
懂得节能嘛.2 小时前
【SpringAI实战】ChatPDF实现RAG知识库
java·后端·spring
站大爷IP2 小时前
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
后端
小杰来搬砖3 小时前
在 Java 的 MyBatis 框架中,# 和 $ 的区别
后端
量子位3 小时前
拆箱开源版Coze:Agent核心三件套大公开,48小时揽下9K Star
agent·ai编程·coze