我正在用 F# 编写一个Tiger编译器,我终于到了不能再推迟对目标体系结构的决定的地步。
这是我的第一个编译器,但绝对不会是我的最后一个。那么......对于第一个编译器来说,一个好的目标架构是什么?
我曾考虑过以 CIL (.NET) 为目标,但书中的中间代码 似乎更适合注册机。
我也想知道当我完成这个编译器后我应该去哪里。我应该尝试针对其他架构吗?我应该关注编译器的另一部分吗?为什么?
对于纯粹的个人满意度,没有什么可以替代您拥有的硬件并在裸机上运行您的编译代码。但是,有一些合理的选择:
MIPS 是一个非常干净的指令集,并且像SPIM这样的模拟器很容易获得。你的编译器会很简单,你的调试体验也会相对愉快。
根据您编写编译器的原因,您可能会乐于以LLVM或C--等低级编译器目标语言为目标。但是,为什么其他人会乐于为您编写后端呢?
如果您有 Intel 或 AMD 硬件,我强烈建议您使用带有 SSE 扩展的 64 位指令集。您将有两倍多的寄存器可供使用,并且您的浮点代码(如果有)将是理智的。
如果您使用 F# 编写编译器,发出 CIL 听起来确实是一个不错的决定,因为您将能够使用 CodeDOM 等的所有内置功能。
或者,您可以设计自己的输出格式并编写一个在 .NET 中运行的 VM,如果这样可以使输出更容易(因为它是一个更合适的架构)。调试起来可能更容易——尽管它当然也意味着编写 VM :)
您是否考虑过以 x86 程序集为目标?几年前我自己做了一个 Tiger 编译器,汇编发射器虽然很难写,但却是整个项目中最有价值的东西之一。用 C 语言编写自己的小型 VM 也是一个好主意(如果不是更好的话)。
如果您正在创建一种生产语言,则以现有 VM 为目标是务实的,但会从练习中消除许多学习可能性。
如果我是你,我会在项目后期仔细研究不同的优化技术。