ChatGPT | AI自制編程語(yǔ)言-實(shí)現(xiàn)JavaScript編譯器
隨著當(dāng)前各種編程 ??Agent?
??,??MCP?
?? 的層出不窮,大模型的正在加速進(jìn)化,于是又開(kāi)始探索,不過(guò)這次的目標(biāo)是用 ??golang?
?? 實(shí)現(xiàn) ??JavaScript?
? 引擎(目標(biāo)是完成 ES5.1 的全部功能)。
1. 回顧 JS 編譯器的實(shí)現(xiàn)過(guò)程
如上是總結(jié)的 ??V8?
? 大體的實(shí)現(xiàn)方式,編程語(yǔ)言的實(shí)現(xiàn)已經(jīng)經(jīng)歷了幾十年的發(fā)展,包括 V8,Lua等語(yǔ)言基本都采用類(lèi)似實(shí)現(xiàn)步驟:
- 詞法分析
- 語(yǔ)法分析
- 語(yǔ)義解析和優(yōu)化
- 虛擬機(jī)
- 通過(guò) JIT 實(shí)現(xiàn)性能優(yōu)化
- ...
2. 如何選擇工具鏈和知識(shí)庫(kù)
2.1 AI 編碼助手
AI 編碼助手有很多,但是用的順手的卻不多,我個(gè)人經(jīng)常使用如下:
- Trae 海外版本,使用 Builer 模式
優(yōu)點(diǎn):各種模型免費(fèi)(不過(guò)有時(shí)候需要排隊(duì)),對(duì)于 web 開(kāi)發(fā)友好,調(diào)試器比較方便
缺點(diǎn):界面與 VSCode 差異大,代碼提示不太友好,合并代碼經(jīng)常會(huì)出現(xiàn) bug,工具鏈不齊全
- Windsurf,使用 Cascade:
優(yōu)點(diǎn):有些模型會(huì)現(xiàn)實(shí)免費(fèi),基于 VSCode 實(shí)現(xiàn),使用習(xí)慣差異不大,界面清晰,代碼提示和 bugfix 可以讓 AI 自動(dòng)執(zhí)行
缺點(diǎn):提示有時(shí)候有點(diǎn)亂,如果思考時(shí)間過(guò)長(zhǎng),會(huì)經(jīng)常超時(shí),不能添加自定義模型
- Cursor:
優(yōu)點(diǎn):社區(qū)完善,自由選擇模型,支持 MCP 市場(chǎng),方便添加各種 rules
缺點(diǎn):太貴,功能太多導(dǎo)致新手了解有一定的門(mén)檻,多文件之前上下文切換不太流暢
2.2 知識(shí)庫(kù)
要實(shí)現(xiàn) JavaScript 編譯器,首先開(kāi)發(fā)者要了解編譯器實(shí)現(xiàn)方案(參考上圖),然后讓 AI 了解實(shí)現(xiàn)方案(雖然 AI 本身已經(jīng)有編譯器的實(shí)現(xiàn)原理,但是開(kāi)發(fā)者需要按照?qǐng)鼍疤崾?AI 按照哪種方案實(shí)現(xiàn)),最好要有簡(jiǎn)單的樣例給到 AI 編碼助手,這里提供一些知識(shí)庫(kù)的資料:
- https://github.com/linkxzhou/mylib/tree/master/c%2B%2B/simplejs 非常簡(jiǎn)單的 JS 編譯器實(shí)現(xiàn)
- https://github.com/wren-lang/wren wren 腳本語(yǔ)言源碼,大約 4000 行代碼
- 書(shū)籍:《用 Go 語(yǔ)言自制解釋器》和《用 Go 語(yǔ)言自制編譯器》
- 書(shū)籍:《編譯器設(shè)計(jì)(第二版)》和《自己動(dòng)手構(gòu)建編程語(yǔ)言》
- JS 測(cè)試用例集合:https://github.com/tc39/test262
如果您實(shí)現(xiàn)的不是 JS 編譯器,也可以作為知識(shí)庫(kù),讓 AI 參考源碼按照你想要的方式實(shí)現(xiàn)(比如:用 Rust 實(shí)現(xiàn) JS ...)。
3. 解決思路
針對(duì) ??simplejs?
? 實(shí)現(xiàn)的項(xiàng)目總結(jié)如下:
- 制定明確的項(xiàng)目規(guī)則,我們要實(shí)現(xiàn)?
?Javascript?
? 引擎,從以往的經(jīng)驗(yàn)上看,項(xiàng)目至少超過(guò) 3000 行,所以先要將功能拆解為規(guī)則(各種 Prompt),而不是直接輸入[實(shí)現(xiàn)Javascript引擎] - 在提示詞中明確指出技術(shù)棧、期望行為和約束條件,就像提供規(guī)范說(shuō)明書(shū),約束模型的邊界
- 讓 AI 拆解功能,以小型、功能為單位劃分文件來(lái)生產(chǎn),測(cè)試和功能驗(yàn)證
- 測(cè)試驅(qū)動(dòng)開(kāi)發(fā):先可以根據(jù)你描述的功能,生成測(cè)試用例,驗(yàn)證 AI 是否遵循了你的功能要求,然后生產(chǎn)功能邏輯后,盡可能多的再生產(chǎn)測(cè)試用例,最后保證測(cè)試用例100% 通過(guò)
- 控制質(zhì)量:AI 輸出的任何功能,要了解邊界條件,并且提示 AI,輸出的代碼需要保持可讀性,甚至可以讓 AI 不斷重構(gòu)當(dāng)前的功能,以保證按照最少代碼實(shí)現(xiàn)
- 控制上下文:如果上下文很多,我們不需要按照整個(gè)工程提問(wèn),而是按照某個(gè)文件,或者某個(gè)文件的某些行擴(kuò)展
- 有時(shí)候需要人工:報(bào)錯(cuò)比較明確,或者歧義的代碼,建議開(kāi)發(fā)者直接上手改代碼修復(fù)
- 必要時(shí)候切換模型:有些問(wèn)題用 DeepSeek 可以快速回答,就不需要用 Claude-3.7,當(dāng)某些模型不能解決當(dāng)前問(wèn)題時(shí),建議手動(dòng)切換不同模型嘗試(模型的邊界比較模糊,有些時(shí)候 Claude-3.7 不能解決,GPT-4o 卻可以解決)
- 如果有文檔,可以單獨(dú)建立 docs 目錄,記錄你想要的功能或者 API,甚至需要鏈接的知識(shí)庫(kù)等
- 調(diào)試代碼多加日志:打印比較多的日志,基于日志的上下文讓 AI 修復(fù) bug,能更快的分析問(wèn)題并解決問(wèn)題,而不是依賴(lài) AI 對(duì)整個(gè)功能分析
4. 總結(jié)(完成第一個(gè)版本)
代碼已經(jīng)開(kāi)源(simplejs): https://github.com/linkxzhou/mylib/tree/master/go/simplejs
通過(guò) AI 實(shí)現(xiàn)代碼詳細(xì)如下:
- 測(cè)試用例:?
?2316?
? 行 - 功能代碼:?
?3556?
? 行 - 代碼覆蓋率:?
?coverage: 74.9% of statements?
?
后續(xù)需要完成的工作:
- 測(cè)試完整的 JS 測(cè)試集:tc39https://github.com/tc39/test262。
- 增加性能優(yōu)化:
解決尾遞歸問(wèn)題
編譯預(yù)計(jì)算
嘗試通過(guò) AI 實(shí)現(xiàn)少量的 `JIT` 功能
...
- 執(zhí)行?
?Benchmark?
??,運(yùn)行壓測(cè),讓??AI 分析 ?
?profile,找到性能優(yōu)化點(diǎn)。
本文轉(zhuǎn)載自??周末程序猿??,作者:周末程序猿
