gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:07:36 26 4
gpt4 key购买 nike

我在大学里修了一个编译器类(class),内容非常丰富,很有趣,尽管也很多工作。既然给了我们要实现的语言规范,所以我学不到的一件事就是语言设计。我现在正在考虑创建一种有趣的简单玩具语言,以便我可以玩耍并尝试不同的语言设计原则。

到目前为止,我还没有决定的一件事就是我希望编译器输出哪种语言或格式。理想情况下,我想为虚拟机输出字节码,该虚拟机易于使用并且还具有一些调试功能(例如,能够暂停执行并随时查看堆栈)。不过,我还很喜欢。为了让您大致了解我要寻找的东西,以下是我考虑过的一些选项,以及它们在我看来的优缺点:

  • 我可以输出文本x86汇编语言,然后调用诸如NASM或FASM之类的汇编器。这将给我一些实际硬件编译的经验,因为我以前的编译器工作是在VM上完成的。我可能可以使用gdb调试生成的程序,尽管它可能不如使用具有调试支持的VM那样容易。主要缺点是我对x86汇编的经验有限,作为CISC指令集,这有点令人生畏。
  • 我可以为流行的虚拟机(例如JVM或Lua虚拟机)输出字节码。这些的优缺点可能会根据我选择的特定VM的不同而有所不同,但是总的来说,我在这里看到的缺点是必须学习一个字节码,而该字节码可能对我 future 的项目适用性有限。我也不确定哪个虚拟机最适合我的需求。
  • 我可以使用在我的编译器类(class)中使用的同一虚拟机,这是我的大学专门为此目的设计的。我已经熟悉它的设计和指令集,并且它具有不错的调试功能,所以这是一个巨大的优势。但是,它的功能极其有限,我觉得如果我尝试做任何适度的高级工作,我都会很快遇到这些限制。
  • 我可以使用LLVM并输出LLVM Intermediate Representation LLVM IR似乎非常强大,对它的熟悉将来肯定会对我有用。另一方面,我真的不知道使用和调试有多容易,所以我非常感谢该领域经验丰富的人的建议。
  • 我可以设计并实现自己的虚拟机。 这有一个巨大而明显的缺点:实际上,我将把我的项目变成两个项目,大大降低了我实际上完成任何事情的可能性。但是,它仍然有些吸引人,因为它使我能够使VM对我想要的语言功能具有“一流”的支持-例如,Lua VM对表具有一流的支持,这使得易于实现用Lua字节码与他们一起工作。

  • 因此,总而言之,我正在寻找一个我可以针对的VM或汇编器,它相对易于学习和使用,并且易于调试。由于这是一个业余项目,理想情况下,我还要尽量减少花大量时间学习一些我将不再使用的工具或语言的机会。我希望从此练习中获得的主要好处是,对语言设计的复杂性有一些第一手的了解,因此,有助于相对快速实现的任何内容都是不错的选择。

    最佳答案

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

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

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

    输出JVM,lua或.NET的字节码是另一种合理的方法,尽管这样做会使您自己依赖于VM所做的假设。而且,正如您所说,这将需要对VM的详细了解。任何流行的VM都有可能具有您所需的功能,因此选择实际上只是优先考虑的问题,而不是功能。

    LLVM是一个不错的选择。它功能强大并且越来越受欢迎。如果输出LLVM IR,则您更有可能与他人的代码进行交互,并使其与您的代码进行交互。如果您希望在编译器或语言设计领域找到一份工作,那么一定要知道LLVM的工作原理。

    我不建议您设计和实现自己的虚拟机,然后再获得其他VM的更多经验,以便您可以看到并了解它们在实现过程中所进行的权衡。如果走这条路,您将最终学习JVM,lua,.NET和许多其他VM。我并不是说不这样做,而是这样做会使您脱离探索语言设计的既定目标。

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

    在您的选择中,我认为您的大学的虚拟机已退出。我要说的是,设计自己的VM也已完成。在其他三个中,我可能会选择LLVM。但是后来,我对x86汇编非常熟悉,因此学习LLVM的想法颇具吸引力。

    关于assembly - 玩具编译器的输出语言/格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473824/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com