首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

手寫 C++ 腳本編譯器心路歷程:從虛擬機到單遍掃描編譯

     編輯:關於C語言
 

緣起:虛擬機就緒,缺語言

腳本虛擬機早已完成,但沒有跑在上面的語言,虛擬機便無用武之地。於是著手開發腳本編譯器。中間因赴上海參加 C++ 大會、成都招聘而中斷數周,近日才回歸投入。

關於編譯器的幾個認知

  • 編譯原理課程大學本科常有,但筆者非科班,僅中學時旁聽過,當時 C 語言未精通,對編譯原理理解有限。
  • 業界觀點:寫編譯器不代表比寫 UI 更強,各領域深耕皆有難度。
  • 傳統編譯器分詞法、語法、語義多階段,多為多人協作或腦力有限所致。筆者嘗試單遍掃描、多階段融合,減少中間資料與重複運算,提升 CPU 快取命中率。
  • 傳奇編譯器 Turbo Pascal 即為單遍掃描、組合語言編寫,速度極快、佔用極小。

實戰挑戰與突破

語言設計

  • 類 C 風格,移除三元運算符、複雜指標解析,保留右結合運算(如函數調用先算參數再算函數引用,函數可回傳函數引用)。
  • 引入 Lua 風格多返回值:無指標類型時提升虛擬機效率,避免臨時 table 分配觸發 GC 導致代碼重定位開銷。目標效率超越 Lua。
  • 尾調用優化:僅尾部調用保留真實返回值,否則強制單返回值,實現過程折騰數晚。

開發過程

  • 未寫 BNF,直接遞歸下降分析。初期代碼極其醜陋、Bug 多、功能不全。
  • 兩周斷檔導致舊代碼難以接手,高難度演算法需思維連續性。連續奮戰數日,核心編譯部分重構三次。
  • 重構策略:先用醜代碼跑通有限功能,再針對簡單情況重寫,逐步取代舊版。函數非逐個修改,設計演變導致功能合併遷移。
  • 最終代碼量縮減至高峰期 70%,功能卻增加,程式結構清晰,腦中「嗡嗡聲」消失,豁然開朗。

現況與展望

表達式解析已完成,百行代碼一氣呵成,能解析極複雜表達式。此前僅支援 table 操作。未來將加入各類控制語句,並構思語言新特性。擁有自主代碼實現想法,確實令人愉悅。

ps. 到最後我都沒有把 BNF 列出來 (._.!)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved