玩具编译器的输出语言/格式

时间:2012-05-06 20:03:32

标签: assembly compiler-construction language-design vm-implementation

我参加了大学的编译课程,虽然也做了很多工作,但它非常有用,而且非常有趣。由于我们有一个语言规范要实现,我没有学到很多东西的是语言设计。我现在正在考虑创造一种简单的玩具语言,这样我就可以玩游戏并尝试不同的语言设计原则。

我还没有决定的一件事是我希望编译器输出什么语言或格式。理想情况下,我想输出一个易于使用的虚拟机的字节码,并且还具有一些调试功能(例如,能够在任何时候暂停执行并查看堆栈。)我没有找到一个触发的但是,我很喜欢。为了让你了解我在寻找什么,这里有一些我考虑过的选项,以及我看到它们的优点和缺点:

  • 我可以输出文本x86汇编语言,然后调用汇编程序,如NASM或FASM。这将为我提供一些编译实际硬件的经验,因为我以前的编译器工作是在VM上完成的。我可以使用gdb调试生成的程序,尽管它可能不如使用具有调试支持的VM那么容易。这方面的主要缺点是我对x86汇编的经验有限,而作为CISC指令集,它有点令人生畏。

  • 我可以输出流行虚拟机的字节码,如JVM或Lua虚拟机。这些的优点和缺点可能会根据我选择的特定VM而有所不同,但总的来说,我在这里看到的缺点是可能需要学习字节码,这可能对我未来的项目的适用性有限。我也不确定哪种VM最适合我的需求。

  • 我可以使用我的编译器课程中使用的相同VM ,这是我大学专门为此目的而设计的。我已经熟悉它的设计和指令集,它具有不错的调试功能,所以这是一个巨大的优势。但是,它的能力非常有限,我觉得如果我尝试做任何适度的事情,我会很快遇到这些限制。

  • 我可以使用LLVM并输出LLVM Intermediate Representation LLVM IR似乎非常强大,熟悉它对我来说绝对有用。另一方面,我真的不知道使用和调试是多么容易,所以我非常感谢那个地区有经验的人的建议。

  • 我可以设计和实现我自己的虚拟机。这有一个巨大而明显的缺点:我基本上将我的项目转变为两个项目,显着降低了我实际完成任务的可能性。但是,它仍然有点吸引人,因为它允许我创建一个对我想要的语言功能具有“一流”支持的VM - 例如,Lua VM拥有对表的一流支持,这使得它很容易在Lua字节码中使用它们。

因此,总而言之,我正在寻找一个我可以定位的VM或汇编程序,它相对容易学习和使用,并且易于调试。由于这是一个爱好项目,理想情况下我也希望尽量减少花费大量时间学习一些我永远不会再使用的工具或语言的机会。我希望从这个练习中获得的主要内容是对语言设计复杂性的第一手理解,所以任何有助于相对快速实现的东西都会很棒。

3 个答案:

答案 0 :(得分:6)

这实际上取决于您想要构建的语言的完整程度,以及您想要用它做什么。如果您想为与其他语言交互的真实项目创建一个完整的语言,那么您的需求将远远超过您想要尝试编译特定语言功能的复杂性。

输出到汇编语言文件是一种流行的选择。您可以使用程序中的实际代码(在注释中)注释汇编语言文件。这样,您可以准确地看到编译器为每种语言构造做了什么。有可能(我使用这些工具已经很长时间了)以一种使源级调试成为可能的方式来注释ASM文件。

如果您打算从事语言设计工作,那么您几乎肯定需要了解x86汇编语言。所以你花在学习上的时间不会浪费。 CISC指令集确实不是问题。如果你已经使用过其他汇编语言(看起来你已经有了),那么你需要花几个小时的时间来学习寄存器和不同的寻址模式,并且可能只需不到一周的时间就能熟练掌握。

输出JVM,lua或.NET的字节代码是另一种合理的方法,尽管如果你这样做,你可以将自己与VM做出的假设联系起来。而且,正如您所说,它需要详细了解VM。任何流行的虚拟机都可能拥有您需要的功能,因此选择实际上是一个偏好而不是功能。

LLVM是一个不错的选择。它功能强大,越来越受欢迎。如果您输出LLVM IR,则您更有可能与其他人的代码进行交互,并让他们与您的代码进行交互。如果你想在编译器或语言设计领域找到一份工作,那么了解LLVM的运作是一个明确的优势。

在您与其他虚拟机获得更多经验之前,我不建议您设计和实施自己的虚拟机,以便您可以查看和了解他们在实施过程中所做的权衡。如果沿着这条路走下去,你最终将学习JVM,lua,.NET和许多其他虚拟机。我不是说不这样做,而是这样做会让你远离你所说的探索语言设计的目的。

知识很少无用。无论你决定使用什么,都需要你学习新东西。这就是好事。但是,如果您想集中进行语言设计,请选择需要最少量工作的输出格式,而不是专门的语言设计。当然,与能力一致。

在您的选择中,我认为您的大学的VM已经出局了。我会说设计你自己的虚拟机也不行。在其他三个中,我可能会使用LLVM。但是,我对x86汇编非常熟悉,因此学习LLVM的想法有点吸引人。

答案 1 :(得分:5)

看看我的Programming Languages ZOO。它有许多语言的玩具实现,包括一些虚拟机和组装组件(堆栈机器)。它应该可以帮助你开始。

答案 2 :(得分:1)

如果您只是在玩语言设计,那么解释语言会是什么?让整个AST在运行时保持不变可以让你做一些非常酷的事情。