Compiler construction 为新语言编写引导编译器的第一步是什么?

Compiler construction 为新语言编写引导编译器的第一步是什么?,compiler-construction,Compiler Construction,假设你正在为一种新语言创建一个编译器,比如说Big Lang。如果你要为Big Lang启动一个编译器,你将为Big Lang lite编写一个编译器,Big Lang lite是Big Lang的最小可能子集。现在,我想知道Big Lang lite的编译器可以用Big Lang编写,或者我们将不得不使用其他语言,如果我们正在制作一个引导编译器 以下是引导的常用方法 设计语言X 用另一种语言为X内核编写编译器 在X内核中为X内核编写编译器 从3编译编译器。使用2中的编译器。(你大部分都是自举的

假设你正在为一种新语言创建一个编译器,比如说Big Lang。如果你要为Big Lang启动一个编译器,你将为Big Lang lite编写一个编译器,Big Lang lite是Big Lang的最小可能子集。现在,我想知道Big Lang lite的编译器可以用Big Lang编写,或者我们将不得不使用其他语言,如果我们正在制作一个引导编译器

以下是引导的常用方法

  • 设计语言X
  • 用另一种语言为X内核编写编译器
  • 在X内核中为X内核编写编译器
  • 从3编译编译器。使用2中的编译器。(你大部分都是自举的)
  • 在内核X中编写完整的X编译器
  • 用3编译编译器
  • 你是自举的 从技术上讲,您可以跳过内核语言,只实现完整的语言。我不建议这样做,因为它通常比较慢(数量级)

    (这是一个非常有趣的问题,但可能stackoverflow上的边界线;可能是解决该问题的更好地方)

    此外,我还想补充一点,在实践中,这些步骤相当于一个循环:

  • 您设计了一个“小型”语言X
  • 您在PC上用不同的语言Y为上述X语言的子集编写了一个糟糕的编译器(一个原始编译器,概念上只使用一次);这个编译器PC应该是一个快速而肮脏的工作,因为您将在概念上使用它一次,并且您将是PC的单一用户:您不介意良好的诊断(所以在第一个错误时中止是可以的);你不在乎表现;而且你不太关心目标机器(你可以让电脑处理一些可怜的C++生成代码,或者你喜欢的任何东西)。顺便说一句,个人电脑可以做翻译

  • 您可以在X中编写更好的编译器BC来编译X(这里目标语言T很重要)。在这一点上,您可能意识到您的X语言设计缺少一些功能;在这种情况下,转到步骤1(通过增强X的设计)

  • 您还可以向BC中添加更多功能,尤其是更好的诊断、更好的生成代码等。同样,您可以转到步骤3(改进BC代码)或甚至转到步骤1(设计更好的X),然后转到步骤3(改进BC代码,特别是让它处理X的新功能,然后再使用X的新功能)
  • 您可以通过使用BC编译BC来测试您的工作
  • 您可能希望通过利用X的新特性在BC中重写一些代码。同样,在步骤1和3中进行迭代
  • 此外,您还可以通过先生成该语言的解释器,然后编写编译器(首先在该解释器上运行)来引导该语言

    您可能(或不)希望在各种版本的PC和BC上工作。特别是,BC可能无法编译当前版本的BC(相同或之前的版本);然后你必须临时使用不同的版本,甚至在BC中添加临时黑客

    一旦你有一个BC能够编译自己,你可以抛出PC

    重点在于设计和实现语言是一项循环工作(通过实现语言,您可以更好地理解您想要的内部功能以及如何实现它们)

    当然,您需要保持BC的工作版本。这意味着,例如,您备份(甚至版本控制)由BC编译的BC“目标”代码的快照。其中是字节码文件
    bootstrap/ocamlc
    (事实上,Ocaml有一个可移植的字节码VM帮助很大);类似的方法可能是由和;在(一个LISP类特定领域的语言中,我正在致力于扩展和定制GCC编译器),它是生成的C++文件<代码>熔体/生成/*.cc;Ocaml和MELT都将“编译的编译器”置于版本控制之下(并分发它…)。在熔体中,原始编译器PC是一个常见的LISP程序(接受当前熔体语言的一个非常小的子集),而BC是引导的熔体编译器(文件<代码>熔体/Wal熔体*。熔体<代码> >熔体源代码和<代码>熔体/生成/华融*.cc<代码>代码>生成的C++代码)。请随时询问有关其上的MELT bootstrap的问题。该语言有一个稍微不同的方法:它的引导构建在Web上获取一些可执行文件(一些较旧版本的编译器)

    引导一门语言与其说是一门科学,不如说是一门艺术。根据经验,小步走通常是值得的。你可能想读J.Pitrat(J.Pitrat最喜欢的主题是强大的人工智能是一个过程:你需要强大的AI来实现强大的AI,另请参见)。您还可以阅读C.Queinnec(如果您阅读法语,请阅读最新版本)解释如何引导类似Lisp的实现

    附加参考
    你当然也应该读一读(因为J.Pitrat的一半职业生涯都是在引导人工智能方面工作的)。

    所以基本上我们需要先用其他语言为X编写编译器,然后再用X编写。这不是我们加倍努力的结果吗?这并不是真的加倍努力(这是一个必要的步骤,除非你能用目标语言编写整个编译器)。特别是,它能让你理解X编译器实现的细节(邪恶就在细节中)@苏里亚想一想,如果没有一种语言的实现,然后你用这种语言编写一个程序,你将如何运行这种语言。你必须用另一种现有语言实现一种语言,或者将它硬连接到计算机上