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