基於知名的 "C in four functions" (c4) 極簡自舉直譯器所深度改造。這個計畫將原本的實驗性腳本直譯器,徹底昇華為了一套具備靜態連結器、物件檔生成、虛擬機器與支援多檔案自舉的完整 C 語言微型工具鏈。
- 完整工具鏈架構 (
c5+c5tool)c5編譯器:只專注於解析 C 語言並將其編譯為底層 Bytecode,並將輸出封裝為符合規定的 ELF 目的檔 (.elf)。c5tool:一套集成了「虛擬機器 (VM)」與「靜態連結器 (Linker)」的多功能控制台工具(借鑒了 Git/Docker 的動詞子指令設計)。
- 多檔靜態連結 (Static Linking)
- 突破了原版 c5 只能將所有程式碼塞入單一檔案的限制。現在
c5支援編譯含有extern的檔案,並且能夠透過c5tool link將多數.elf目的檔合併並解析外部函式。
- 突破了原版 c5 只能將所有程式碼塞入單一檔案的限制。現在
- 全面模組化自舉 (Multi-file Self-Hosting)
- 編譯器架構已經過重構與拆分,前端與編碼生成留在
c5.c,而龐大的物件檔生成與重定位機制作為後端被抽離至c5_elf.c。並且能利用自己的 Linker 將這兩塊完美連結為一體。
- 編譯器架構已經過重構與拆分,前端與編碼生成留在
- 浮點數與 POSIX I/O 擴展
- 虛擬機器補齊了浮點數運算(
+,-,*,/, 相等比較等)與基礎 I/O(open,read,write,close),完全擺脫對高階libc函數庫 (FILE) 的依賴。
- 虛擬機器補齊了浮點數運算(
你只需要標準的 C 編譯器(如 gcc)與 make 即可完成第一次建置:
# 一鍵編譯 C5 編譯器與工具鏈
make all使用 c5 編譯一般的 C 語言原始碼為 ELF 目的檔,然後利用 c5tool run 掛載虛擬機器執行:
./c5 -o fib.elf test/fib.c
./c5tool run fib.elf使用 c5 分別把原始碼編譯為目的檔後,使用 c5tool link 將它們組裝成一個可執行的 ELF:
./c5 -o lib_math.elf test/lib_math.c
./c5 -o main_ext.elf test/main_ext.c
./c5tool link -o run.elf lib_math.elf main_ext.elf
./c5tool run run.elf這套系統完美支援自舉,你可以透過虛擬機運行自己,再去編譯下一個程式。為了方更自動化測試,我們已經將所有流程寫入了 Makefile 中。建議你直接跑一次最完整的整合測試:
make test_all底下的腳本指令展示了這場「自我編譯大車拼 (make selfhost)」背後的發生順序,你會看到它完成以下驚人的循環:
# 1. 讓 c5 編譯自己的源碼模組
./c5 -o c5.elf c5.c
./c5 -o c5_elf.elf c5_elf.c
# 2. 將模組連結起來,形成虛擬化版本的 c5_final 核心編譯器!
./c5tool link -o c5_final.elf c5.elf c5_elf.elf
# 3. 讓虛擬化版本的 c5_final 去編譯 fib.c
./c5tool run c5_final.elf -o fib2.elf test/fib.c
# 4. 把編譯器 c5tool 也虛擬化,並用虛擬化的 c5tool 去執行虛擬化的 fib!
./c5 -o c5tool.elf c5tool.c
./c5tool run c5tool.elf run fib2.elfc5.c:C 語言到 Bytecode 的解析與生成。c5_elf.c:自定義 ELF 64-bit Relocatable Object 寫出模組。c5tool.c:集成了記憶體動態分配載入、多檔 Symbol/Relocation 連結、以及 30+ 條 Stack-Based 指令的高效虛擬機工具。Makefile:專案的核心建置系統,涵蓋了make all,make test_linker,make selfhost與一鍵大滿貫make test_all目標。test/:存放各種基礎 C 程式庫(如fib.c,float.c等)。
目前的架構已經徹底切斷了原版的單檔限制,未來可考慮之發展方向:
- 為
c5.c前端實作微型的 Preprocessor (前置展開#include與解析巨集)。 - 將 Custom ELF 重定位 (
struct Rela) 規範收斂為標準的 AArch64/x86_64 Rela 標準,與 GNUobjdump相容。 - 為 VM 新增記憶體邊界檢查 (Bounds Checking) 或除錯傾印 (Stack Trace Dump) 強健其沙盒能力。