我在大学里学习了编译器课程,它内容丰富,很有趣,虽然也有很多工作。由于我们获得了要实现的语言规范,因此我没有学到太多的一件事是语言设计。我现在正在考虑创建一种简单的玩具语言来获得乐趣,这样我就可以玩耍并尝试不同的语言设计原则。
我还没有决定的一件事是我希望我的编译器输出什么语言或格式。理想情况下,我想为易于使用且具有一些调试功能的虚拟机输出字节码(例如,能够暂停执行并随时查看堆栈。)我还没有找到一个令人震惊的不过,我的幻想呢。为了让您了解我在寻找什么,以下是我考虑过的一些选项,以及我所看到的它们的优缺点:
我可以输出文本 x86 汇编语言,然后调用像 NASM 或 FASM 这样的汇编程序。这会给我一些为实际硬件编译的经验,因为我之前的编译器工作是在 VM 上完成的。我可能可以使用 gdb 调试生成的程序,尽管它可能不像使用具有调试支持的 VM 那样简单。这样做的主要缺点是我对 x86 汇编的经验有限,而且作为一个 CISC 指令集,它有点令人生畏。
我可以为流行的虚拟机(如 JVM 或 Lua 虚拟机)输出字节码。这些的优缺点可能会根据我选择的特定 VM 而有所不同,但总的来说,我在这里看到的缺点可能是必须学习可能对我未来项目的适用性有限的字节码。我也不确定哪个 VM 最适合我的需求。
我可以使用在我的编译器课程中使用的相同 VM,它是在我的大学专门为此目的而设计的。我已经熟悉它的设计和指令集,并且它具有不错的调试功能,所以这是一个巨大的优势。但是,它的功能极其有限,我觉得如果我尝试做任何即使是中等程度的高级操作,我也会很快遇到这些限制。
我可以使用 LLVM 并输出LLVM Intermediate Representation。 LLVM IR 看起来非常强大,熟悉它肯定对我将来有用。另一方面,我真的不知道使用和调试有多容易,所以我非常感谢在该领域有经验的人的建议。
我可以设计和实现自己的虚拟机。 这有一个巨大而明显的缺点:我实际上是将我的项目变成了两个项目,大大降低了我实际完成任何事情的可能性。然而,它仍然有点吸引人,因为它可以让我制作一个对我想要的语言功能具有“一流”支持的 VM——例如,Lua VM 对表具有一流的支持,这使得它很容易在 Lua 字节码中使用它们。
所以,总而言之,我正在寻找一个我可以定位的 VM 或汇编程序,它相对容易学习和使用,并且易于调试。由于这是一个爱好项目,理想情况下,我还想尽量减少我花大量时间学习一些我永远不会再使用的工具或语言的机会。不过,我希望从这个练习中获得的主要内容是对语言设计的复杂性有一些第一手的了解,所以任何有助于相对快速实现的东西都会很棒。