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的基础架构。