什么是可以编译自身的*概念*最小*编译器*?

时间:2009-10-27 12:16:52

标签: compiler-construction

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

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

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

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

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

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

  1. 图灵完成。
  2. 能够自行编译。
  3. 我对此感兴趣,因为

    1. 这将是一个有趣的案例研究和
    2. 它可以作为引导编译器的起点。
    3. 如果它不存在,我可能会自己写。 :)

4 个答案:

答案 0 :(得分:13)

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

在comp.compilers新闻组上有一段时间interesting discussion,值得一试。

答案 1 :(得分:7)

您没有说目标机器是什么,或者编译器是否必须存在或只是想象。

在想象的世界里,我会说约翰麦卡锡的元气体LISP翻译的改编非常接近。您可能还想看看John Reynold的论文高阶语言的定义解释器虽然密集是一种简单的模型。

在现实世界中,我打赌Chez Scheme,但不幸的是,本机代码编译器是专有的和封闭源代码。不过,你可以从学习翻译中学习。另一个值得研究的系统是Oberon编译器,它被设计为由一个人构建和理解,并且非常干净。

答案 2 :(得分:5)

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

我所知道的最小的自编译编译器是Val Schorre's 1963 MetaII compiler。是的,从十九六三。 (该页面上有关于该主题的技术论文的链接)。 如果您喜欢编译器,运行来获取本文;它是一种气体,只有10页。

这不是理论;这很实用。他的论文提供了编译器源代码(大约20-30行IIRC),元编译机器的描述,以及一个元编译程序处理源代码并重新生成完全相同的元编译程序。你可以在1-2天内自己复制这个结果非常有趣,如果不介意实现metamachine的令人难以置信的代码。 [我在1970年通过这样做学会了从本文构建编译器]。 或者,您可以使用a modern tutorial on MetaII进行游戏,并使用JavaScript预先构建它。

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

你可以采取另一种方式:你可以开始解决问题,看看你可以删除多少,仍然能够提升到MetaII级别。我这样做了一次,并设法摆脱了大约30%而没有失去能力甚至很多表现力;它下降到大约20行文本,显然是一个更简单的元机器。

一位名叫道格·米歇尔斯的聪明人,很久以前就与20世纪80年代(Unix供应商)Santa Cruz Operation联系,告诉我他已经走得更远,并将元编译器自我描述简化为极少数字符。我从来没有看过这部作品,所以我真的不知道他有多远。

[编辑]挖掘,挖掘,挖掘......发现这个宝石(在Linkedin上):

达特茅斯兼职教授Bill McKeeman说:

Doug是我的本科生;他的高级论文作业很简单:编写最短,可扩展,自编译的编译器。前端 27个字符;整个事情花了63.这一切都适合一张IBM卡。他发表了结果。

挖掘,挖掘,挖掘更多:This seems to be Doug's 27 character paper。参见图2.通过“前端”,McKeeman显然意味着“只是解析器”;这篇论文包含更大的翻译。

除非他们 “概念上简单”,否则你无法让编译器变小。

答案 3 :(得分:0)

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

简而言之:

  1. 只有一个可执行文件。
  2. 启动可执行文件时,会生成自己的源代码。
  3. 再次启动可执行文件时,它会编译此源代码并执行它,显示相同的用户界面!
  4. 一个不错的测试是删除可执行文件并使用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