【问题标题】:What is the *conceptually* smallest *compiler* that can compile itself?可以自行编译的*概念上*最小的*编译器*是什么?
【发布时间】:2009-10-27 12:16:52
【问题描述】:

本着this question 的精神,我想问一个类似的问题,但关于编译器,而不是关于解释器

什么是概念上最小的编译器,可以编译自己的代码?

当我说“概念上最小”时,我的意思是它只使用非常基本的概念并从那里构建,而不是它包含非常短的代码。为什么这是一个重要区别的一个例子是OTCC 一个非常小的 C 编译器,它很小是因为它被混淆了,不一定因为它在概念上很简单(它也可能在概念上很简单,但我不知道;它被混淆了) .

我还想补充一点,以下也可能是一个概念上非常小的程序,但它实际上并没有告诉我们发生了什么,所以它也不是我真正想要的:

(writefile argv[2] (generate (parse (readfile argv[1]))))

我真正想要的是一种语言:

  1. 图灵完成。
  2. 能够自行编译。

我对此很感兴趣,因为

  1. 这将是一个有趣的案例研究,并且
  2. 它可以作为引导编译器的起点。

如果它不存在,我可以自己写。 :)

【问题讨论】:

标签: compiler-construction


【解决方案1】:

我不太清楚你所说的“概念上最小”是什么意思。大概您对minimal Turing machinesLambda calculus 中的表示不感兴趣?如果您在谈论物理编译器实现,那么您实际上是在谈论生成机器代码指令的编译器。正如 Anthony Mills 的评论所提到的,TCC 是相关的。另一个应该有实际应用的有趣讨论是这个详细的description of a bootstrapping compiler written from scratch

不久前在 comp.compilers 新闻组上有一个 interesting discussion 值得一试。

【讨论】:

    【解决方案2】:

    你没有说目标机器是什么,或者编译器是必须存在还是只是想象出来的。

    在想象的世界中,我会说改编自 John McCarthy 的元循环 LISP 解释器会非常接近。您可能还想看看 John Reynold 的论文Definitional Interpreters for Higher-Order Languages,虽然内容很密集,但它是一种简单的模型。

    在现实世界中,我敢打赌Chez Scheme,但不幸的是,本机代码编译器是专有且封闭源代码的。不过,您可以通过学习口译员来学习。另一个值得研究的系统是Oberon编译器,它被设计成一个人就能构建和理解,而且非常干净。

    【讨论】:

      【解决方案3】:

      [我知道这是一个很晚的条目,但我认为这真的很相关]。

      我所知道的最小的自编译编译器是Val Schorre's 1963 MetaII compiler。是的,从十九点六十三开始。 (该页面上有一个指向他关于该主题的技术论文的链接)。 如果你喜欢编译器,run 来获取这篇论文;它是一种气体,只有 10 页。

      这不是理论;这是实用的。他的论文提供了编译器源代码(IIRC 大约 20-30 行),元编译机制的描述,元编译程序处理源代码并重新生成完全相同的元编译程序。如果不介意编写代码来实现元机器,您可以在 1-2 天内自己复制这个结果,这真的很有趣。 [我早在 1970 年就通过这样做,从这篇论文中学会了构建编译器]。 或者,你可以去玩 a modern tutorial on MetaII,它已经全部预置在 JavaScript 中。

      一旦你运行了这个元编译器,你就可以轻松地扩展语法和元机器,以引导到具有更多功能的更大的元编译器,和/或为实际应用程序生成编译器。 (我在 70 年代初以这种方式构建了类似 Pascal 的 BASIC 编译器)。

      您可以采取另一种方式:您可以开始取出东西,看看您可以移除多少,并且仍然能够将 boostrap 恢复到 MetaII 级别。我这样做了一次,并设法摆脱了大约 30% 的问题,而不会失去电缆甚至很多表现力;它减少到大约 20 行文本,而且,值得注意的是,一个更简单的元机器。

      一位名叫 Doug Michels 的聪明人,很久以前与 1980 年代(Unix 供应商)Santa Cruz Operation 有联系,他告诉我他已经走得更远,并将元编译器的自我描述减少到很少的字符。我从来没有看过作品,所以我真的不知道他能走多远。

      [编辑] 挖,挖,挖...找到这个宝石(在 Linkedin 上):

      达特茅斯学院的兼职教师 Bill McKeeman 说:

      道格是我的本科生;他的毕业论文任务很简单:编写最短、可扩展、自编译的编译器。前端占用27个字符;整个过程花了 63 块。它都装在一张 IBM 卡上。他公布了结果。

      挖,挖,再挖:This seems to be Doug's 27 character paper。参见图 2。对于“前端”,McKeeman 显然意味着“只是解析器”;论文包含完整的译者,略大一些。

      除非它们“在概念上很简单”,否则你无法得到这么小的编译器。

      【讨论】:

        【解决方案4】:

        背景 有一次,我想要一个小程序来编译一些记事本编辑的脚本并即时运行它们。有一个名为“C# Script: The Missing Puzzle Piece”的好项目。但是,这是针对专业人士的。然后,有一天晚上我去做了一些编码。并想出了一个代码编译器。但是,这还不够。我想将这个程序的源代码存储到程序本身中,最终的规范是从程序中生成相同的源代码。

        简而言之:

        1. 只有一个可执行文件。
        2. 启动可执行文件时,它会生成自己的源代码。
        3. 再次启动可执行文件时,它会编译并执行此源代码,显示相同的用户界面!

        一个不错的测试是删除可执行文件并使用 Visual Studio 或命令行 C# 编译器编译生成的源代码:

         del SelfReplication.exe
         csc SelfReplication.cs
         move SelfReplication.cs SelfReplication-old.cs
         SelfReplication.exe
        

        最后一条语句生成一个 SelfReplication.cs 文件。 新旧生成的文件一模一样!! 该程序的一个特点是您可以更改(变异)源代码,添加新功能并生成全新的可执行文件。新程序将能够以与原始程序相同的方式自我复制,包括您的突变。

        https://www.codeproject.com/Articles/21297/Real-Self-Replicating-Program

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-18
          • 1970-01-01
          • 2015-01-14
          • 1970-01-01
          相关资源
          最近更新 更多