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