-
Notifications
You must be signed in to change notification settings - Fork 0
Description
啓動這個項目其實是很偶然的。
我其實不怎麼會 JavaScript 這門語言,因爲平時用不到。
讓我對它產生興趣的是因爲一個很無厘頭的契機:
我以前開發 翻牆軟件 時, 使用過 事件循環庫 libuv, 我給它提過 PR, 但該項目 主理人 Ben Noordhuis 沒有理會我。
這讓我 出離 憤怒, 放棄了 C 語言, 憤而轉投 Rust 語言並奮力學會了它, 編寫了整個 翻牆軟件 工具鏈,
從服務端客戶端到移動端, 都用 Rust 實現,現在運行良好。
後來一時興起, 轉回頭去看看 Ben 在幹什麼, 發現他在折騰 QuickJS,
這個 Bellard Fabrice 大神 編寫的 JavaScript 引擎,
Ben 主要是給它加上了 Windows 平臺的支持,
整個項目大概 五萬 行 C 代碼,
當時也就翻了翻, 沒做多想。
某天,在 crates.io 上閒逛, 無意中發現 JavaScript 這個 crate 竟然不存在,
雖然有一些 JavaScript 相關的 crate, 如 Boa 和 QuickJS 的綁定包 等等,
就是沒有 JavaScript 這個包, 當時就很不解,它們爲什麼不直接佔用 JavaScript 這個名字呢?
我就想, 既然沒人佔, 那我就不客氣了,我來, 我要用純 Rust 編寫一個 JavaScript 引擎。
一開始,我打算用 諸如 C2Rust 之類的工具直接把 QuickJS 的 C 代碼轉換成 Rust 代碼,
投機取巧欺世盜名地實現它, 在多次被 C2Rust 這弱智工具拉胯的表現整得沒脾氣後放棄了。
直到有一天, 我發現, AI 輔助編程 的 能力已經強大到足以 自動生成 整個 複雜 Rust 項目的代碼了,
於是我決定, 乾脆就用 AI 來幫我實現 這個 JavaScript 引擎吧。
這個項目就這樣誕生了。
剛開始, 我讓 AI 通讀 QuickJS 的源代碼, 然後把它轉換成 Rust 代碼。
但是,我發現, 即使強如 ChatGPT-5.2 和 Gemini 3 Pro 這樣的 AI 模型,
依然無法完全理解 QuickJS 的複雜邏輯,
於是 我讓 它們 拋棄所有 QuickJS 代碼, 自己從零開始設計一個 JavaScript 引擎的架構。
於是, 在與 AI 的一次次對話中, 這個 JavaScript 引擎的雛形逐漸成型了起來。
這個過程中,我並沒有給 AI 什麼設計思路、架構藍圖, 完全是讓它自由發揮,
我只是給它提供各種測試用例, 讓它根據測試用例來完善引擎的功能。
某個時刻,我突然意識到,我這個玩笑性質的項目,最終結果竟然是要實現一個當今編程語言流行度排行榜前 5 語言的引擎,
這讓我感到幾分惶恐,好在有 AI 助力, 就硬着頭皮幹了下來。
很自然的, 對於內存管理, 它選擇了 Rust 的 Rc 和 RefCell 來實現引用計數垃圾回收機制;
由於我本人對 JavaScript 語言也是一知半解,
對於 JavaScript 引擎實現使用 Rc 和 RefCell 來實現內存管理這一點,並沒有覺得有什麼不妥。
直到後來, 要實現原型鏈了, 我發現事情大條了,
JavaScript 語言內, 循環引用其實是該語言的一部分, Rc 和 RefCell 根本無法應付這種情況,
這讓我不得不重新審視整個引擎的內存管理機制。
經過一番掙扎, 我決定放棄 Rc 和 RefCell, 改用 與 JavaScript 語言更契合的
標記清除垃圾回收機制 (Mark-and-Sweep Garbage Collection)。
研究了一通 rust-gc, rust-cc, dumpster 等 Rust 生態中的垃圾回收庫後,
我最終選擇了 gc-arena 這個庫來實現引擎的內存管理。
這導致了一個後果, 之前 AI 幫我生成的代碼幾乎全部報廢, 剩下的遺產 只有 Tokenizer 和 Parser 了,
其他的代碼都得重寫。
於是 在 AI 的再一次加持下, 我的 JavaScript 引擎終於走到現在。
我發現, “測試驅動開發” 是這種語言類項目開發的最自然的開發路徑選擇。
目前這個 JavaScript 引擎已經能夠通過大部分的 此前的測試用例,
尚未再次實現 Promise, async/await, Generator 等, 但已經在路上。
本引擎只支持現代 JavaScript 的嚴格模式。
這是因爲, 如果要 兼容 舊的 JavaScript 語言規範, 既縱容壞的 JS 編碼習慣, 也會讓引擎變得極其複雜臃腫不堪。
本項目的最終目標是 通過 Test262 的全部 嚴格模式 測試用例,
簡而言之, 這個 JavaScript 引擎, 將是 一個 嚴格模式 下的,
乾淨利落的, 現代化的, 由純 Rust 實現的 JavaScript 引擎,
它應該可以方便地嵌入到絕大多數需要 使用 JavaScript 腳本的 Rust 項目中。