Tiger编译器的目标架构

3

我正在使用F#编写一款Tiger编译器,现在已经到了无法再推迟选择目标架构的时候了。

这是我第一次写编译器,但肯定不会是最后一次。那么...作为第一款编译器,什么是一个好的目标架构呢?

我考虑过以CIL(.NET)为目标,但书中的中间代码似乎更适合寄存器机器。

我还想知道,在完成这个编译器后,我应该去哪里。我应该尝试针对另一个架构吗?还是应该关注编译器的其他部分?为什么?


我决定写一个针对x86的后端,以后可能会写一个针对MIPS的后端。无论如何,我可能会为了练习再次编写整个编译器。 - Jørgen Fogh
3个回答

4

就个人满足感而言,没有什么比针对你拥有的硬件并在裸机上运行编译后的代码更好的替代方案了。

然而,还有一些合理的选择:

  • MIPS是非常干净的指令集,像SPIM这样的模拟器也很容易获得。你的编译器会很简单,你的调试经验也相对愉快。

  • 根据你编写编译器的原因,你可能会喜欢针对低级编译器目标语言,例如LLVMC--。但为什么要让别人来写你的后端呢?

  • 如果你拥有Intel或AMD硬件,我强烈建议使用带有SSE扩展的64位指令集。你将有两倍的寄存器可供使用,你的浮点代码(如果有的话)也会更加稳定。


1

如果你使用F#编写编译器,发出CIL肯定听起来是个好决定,因为你将能够使用CodeDOM等所有内置功能。

或者,您可以设计自己的输出格式并编写在.NET内部运行的VM,如果这样做会使输出更容易(因为它是更合适的架构)。这可能更容易调试 - 当然,这意味着也要编写VM :)


1

你有没有考虑过针对x86汇编进行编程?我几年前自己做了一个Tiger编译器,尽管很难写,但汇编发射器是整个项目中最有成就感的事情之一。在C语言中编写自己的小型虚拟机也是一个好主意(如果不是更好的话)。

如果你正在创建一个生产语言,那么针对现有虚拟机是务实的,但会从练习中删除许多学习机会。

如果我是你,在项目后期会更加关注不同的优化技术。


我确实考虑过x86汇编和编写虚拟机。我只是想知道对于第一次尝试来说,RISC架构是否更好。你有什么想法吗? - Jørgen Fogh
1
我的唯一RISC经验是使用AVR汇编语言,我很喜欢它。它有趣、清晰且易于学习。虽然我不了解ARM或PowerPC的情况,但我猜想,任何东西都比x86好 :) - Wojciech Bederski
+1 for wuub。第一次尝试使用RISC做得非常好,您可以尝试使用MIPS,并使用SPIM进行模拟。 - Eliseo Ocampos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接