部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ChatGPT|AI自制编程语言-实现JavaScript编译器

ChatGPT|AI自制编程语言-实现JavaScript编译器

作者头像
用户1904552
发布2025-04-27 12:59:10
发布2025-04-27 12:59:10
1420
举报
文章被收录于专栏:周末程序猿周末程序猿

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

  • 《ChatGPT|AI自制编程语言-从0开始》
  • 《ChatGPT|AI自制编程语言-词法解析》

随着当前各种编程 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 编码助手,这里提供一些知识库的资料:

  • https://github.com/linkxzhou/mylib/tree/master/c%2B%2B/simplejs 非常简单的 JS 编译器实现
  • https://github.com/wren-lang/wren wren 脚本语言源码,大约 4000 行代码
  • 书籍:《用 Go 语言自制解释器》和《用 Go 语言自制编译器》
  • 书籍:《编译器设计(第二版)》和《自己动手构建编程语言》
  • JS 测试用例集合:https://github.com/tc39/test262

如果您实现的不是 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): https://github.com/linkxzhou/mylib/tree/master/go/simplejs

通过 AI 实现代码详细如下:

  • 测试用例:2316
  • 功能代码:3556
  • 代码覆盖率:coverage: 74.9% of statements

后续需要完成的工作:

  • 测试完整的 JS 测试集:tc39https://github.com/tc39/test262。
  • 增加性能优化:
    • 解决尾递归问题
    • 编译预计算
    • 尝试通过 AI 实现少量的 `JIT` 功能
    • ...
  • 执行 Benchmark,运行压测,让 AI 分析 profile,找到性能优化点。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 周末程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 回顾 JS 编译器的实现过程
  • 2. 如何选择工具链和知识库
    • 2.1 AI 编码助手
    • 2.2 知识库
  • 3. 解决思路
  • 4. 总结(完成第一个版本)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档