amacc
1.0.0
AMACC是從頭開始建造的32位ARM架構編譯器。它是C的脫衣版本,設計為用於學習編譯器,鏈接器和裝載機的教學工具。
有兩種執行模式AMACC實施:
值得一提的是,AMACC旨在編譯以上述執行模式自助宿主所必需的C子集。例如,它支持全局變量,尤其是全局數組。
一個簡單的基於堆棧的抽象語法樹(AST)是通過合作stmt()和expr()解析函數生成的,均由令牌生成功能提供。 expr()函數執行一些字面恆定的優化。使用gen()函數將AST轉換為基於堆棧的VM中間表示(IR)。可以通過命令行選項對IR進行檢查。最後, codegen()函數生成了IR的ARM32指令,該指令可以通過jit()或elf32()可執行生成執行
AMACC結合了經典的遞歸下降和操作員的優先解析。事實證明,運算符優先級解析器比遞歸下降解析器(RDP)要快得多,而當使用語法生產定義操作員優先級時,否則將將操作員優先定義為否則將變成方法。
AMACC能夠編譯以下語法編寫的C源文件:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };該體系結構用Linux ABI靶向ARMV7HF,並已在Raspberry Pi 2/3/4上使用GNU/Linux進行了驗證。
AMACC中的代碼生成器依賴於幾種GNU/Linux行為,並且有必要在構建環境中安裝ARM/Linux。
為A型架構安裝GNU工具鏈
arm-linux-none-gnueabihf (用硬浮子的Aarch32目標)安裝QEMU用於手臂用戶仿真
sudo apt-get install qemu-user運行make check ,您應該看到以下內容:
[ C to IR translation ] Passed
[ JIT compilation + execution ] Passed
[ ELF generation ] Passed
[ nested/self compilation ] Passed
[ Compatibility with GCC/Arm ] ........................................
----------------------------------------------------------------------
Ran 52 tests in 8.842s
OK
檢查通過make help以了解更多信息而產生的消息。
AMACC能夠非常快速地生成機器代碼,並提供gcc -O0性能的70%。
測試環境:
輸入源文件: amacc.c
| 編譯器驅動程序 | 二進制尺寸(KIB) | 編譯時間 |
|---|---|---|
與-O0 -ldl (編譯+鏈接)的GCC | 56 | 0.5683 |
與-O0 -c海灣合作委員會(僅編譯) | 56 | 0.4884 |
| amacc | 100 | 0.0217 |
檢查中間表示(IR)中的AMACC彙編。
AMACC基於C4的基礎架構。