9

我在大学里学习了编译器课程,它内容丰富,很有趣,虽然也有很多工作。由于我们获得了要实现的语言规范,因此我没有学到太多的一件事是语言设计。我现在正在考虑创建一种简单的玩具语言来获得乐趣,这样我就可以玩耍并尝试不同的语言设计原则。

我还没有决定的一件事是我希望我的编译器输出什么语言或格式。理想情况下,我想为易于使用且具有一些调试功能的虚拟机输出字节码(例如,能够暂停执行并随时查看堆栈。)我还没有找到一个令人震惊的不过,我的幻想呢。为了让您了解我在寻找什么,以下是我考虑过的一些选项,以及我所看到的它们的优缺点:

  • 我可以输出文本 x86 汇编语言,然后调用像 NASM 或 FASM 这样的汇编程序。这会给我一些为实际硬件编译的经验,因为我之前的编译器工作是在 VM 上完成的。我可能可以使用 gdb 调试生成的程序,尽管它可能不像使用具有调试支持的 VM 那样简单。这样做的主要缺点是我对 x86 汇编的经验有限,而且作为一个 CISC 指令集,它有点令人生畏。

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

  • 我可以使用在我的编译器课程中使用的相同 VM,它是在我的大学专门为此目的而设计的。我已经熟悉它的设计和指令集,并且它具有不错的调试功能,所以这是一个巨大的优势。但是,它的功能极其有限,我觉得如果我尝试做任何即使是中等程度的高级操作,我也会很快遇到这些限制。

  • 我可以使用 LLVM 并输出LLVM Intermediate Representation LLVM IR 看起来非常强大,熟悉它肯定对我将来有用。另一方面,我真的不知道使用和调试有多容易,所以我非常感谢在该领域有经验的人的建议。

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

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

4

3 回答 3

6

这实际上取决于您想要构建的语言有多完整,以及您想用它做什么。如果您想为与其他语言交互的实际项目创建一种成熟的语言,那么您的需求将比您只想尝试编译特定语言功能的复杂性要大得多。

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

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

为 JVM、lua 或 .NET 输出字节码是另一种合理的方法,但如果你这样做,你就会将自己与 VM 所做的假设联系在一起。而且,正如您所说,这将需要对 VM 有详细的了解。任何流行的 VM 都可能具有您需要的功能,因此选择实际上是偏好问题,而不是功能问题。

LLVM 是一个不错的选择。它功能强大并且越来越受欢迎。如果您输出 LLVM IR,您更有可能与他人的代码交互,并让他们的代码与您的交互。如果您想在编译器或语言设计领域找到一份工作,那么了解 LLVM 的工作原理无疑是一个加分项。

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

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

在您的选择中,在我看来,您大学的虚拟机已经出局。我会说设计自己的虚拟机也已经过时了。在其他三个中,我可能会选择 LLVM。但是,我对 x86 汇编非常熟悉,所以学习 LLVM 的想法有点吸引人。

于 2012-05-06T20:26:29.617 回答
5

看看我的编程语言动物园。它有许多语言的玩具实现,包括一些虚拟机和组成的程序集(堆栈机器)。它应该可以帮助您入门。

于 2012-05-06T20:45:46.783 回答
1

如果您只是在玩语言设计,那么解释语言呢?让整个 AST 在运行时仍然存在可以让您做一些非常酷的事情。

于 2012-06-19T06:42:56.837 回答