Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C5 編譯器生態系 (v1.0 模組化強化版)

基於知名的 "C in four functions" (c4) 極簡自舉直譯器所深度改造。這個計畫將原本的實驗性腳本直譯器,徹底昇華為了一套具備靜態連結器、物件檔生成、虛擬機器與支援多檔案自舉的完整 C 語言微型工具鏈。

🎯 核心亮點 (Core Features)

  1. 完整工具鏈架構 (c5 + c5tool)
    • c5 編譯器:只專注於解析 C 語言並將其編譯為底層 Bytecode,並將輸出封裝為符合規定的 ELF 目的檔 (.elf)。
    • c5tool:一套集成了「虛擬機器 (VM)」與「靜態連結器 (Linker)」的多功能控制台工具(借鑒了 Git/Docker 的動詞子指令設計)。
  2. 多檔靜態連結 (Static Linking)
    • 突破了原版 c5 只能將所有程式碼塞入單一檔案的限制。現在 c5 支援編譯含有 extern 的檔案,並且能夠透過 c5tool link 將多數 .elf 目的檔合併並解析外部函式。
  3. 全面模組化自舉 (Multi-file Self-Hosting)
    • 編譯器架構已經過重構與拆分,前端與編碼生成留在 c5.c,而龐大的物件檔生成與重定位機制作為後端被抽離至 c5_elf.c。並且能利用自己的 Linker 將這兩塊完美連結為一體。
  4. 浮點數與 POSIX I/O 擴展
    • 虛擬機器補齊了浮點數運算(+, -, *, /, 相等比較等)與基礎 I/O(open, read, write, close),完全擺脫對高階 libc 函數庫 (FILE) 的依賴。

🚀 快速上手 (Quick Start)

1. 初始化編譯 (Bootstrap)

你只需要標準的 C 編譯器(如 gcc)與 make 即可完成第一次建置:

# 一鍵編譯 C5 編譯器與工具鏈
make all

2. 基本編譯與執行

使用 c5 編譯一般的 C 語言原始碼為 ELF 目的檔,然後利用 c5tool run 掛載虛擬機器執行:

./c5 -o fib.elf test/fib.c
./c5tool run fib.elf

3. 多檔案靜態連結

使用 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

🧠 終極測試:自我編譯 (Self-Hosting)

這套系統完美支援自舉,你可以透過虛擬機運行自己,再去編譯下一個程式。為了方更自動化測試,我們已經將所有流程寫入了 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.elf

🏗 資料夾檔案說明

  • c5.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 等)。

📈 未來發展方向

目前的架構已經徹底切斷了原版的單檔限制,未來可考慮之發展方向:

  1. c5.c 前端實作微型的 Preprocessor (前置展開 #include 與解析巨集)。
  2. 將 Custom ELF 重定位 (struct Rela) 規範收斂為標準的 AArch64/x86_64 Rela 標準,與 GNU objdump 相容。
  3. 為 VM 新增記憶體邊界檢查 (Bounds Checking) 或除錯傾印 (Stack Trace Dump) 強健其沙盒能力。

About

c5 是由 c4 延伸修改過來的一個自我編譯器

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages