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

Compiler construction 什么是概念上最小的编译器,可以自己编译?,compiler-construction,Compiler Construction,本着的精神,我想问一个类似的问题,但是关于编译器,而不是关于口译员 从概念上讲,能够编译自己代码的最小编译器是什么 当我说“概念上最小”时,我的意思是它只使用非常基本的概念,并从中构建,而不是它包含非常短的代码。为什么这是一个重要区别的一个例子是一个非常小的C编译器,它之所以小是因为它是模糊的,不一定是因为它在概念上很简单(它在概念上也可能很简单,但我不知道;它是模糊的) 我还想补充一点,以下内容在概念上也可能是一个非常小的程序,但它实际上并没有告诉我们正在发生什么,所以它也不是我想要的: (w

本着的精神,我想问一个类似的问题,但是关于编译器,而不是关于口译员

从概念上讲,能够编译自己代码的最小编译器是什么

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

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

(writefile argv[2] (generate (parse (readfile argv[1]))))
我真正想要的是一种语言:

  • 图灵完成
  • 能够自行编译
  • 我对这个感兴趣是因为

  • 这将是一个有趣的案例研究
  • 它可以作为引导编译器的起点

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

    我不太清楚你所说的“概念上最小”是什么意思。想必你对这件事不感兴趣?如果你说的是物理编译器实现,那么你实际上是在说生成机器代码指令的编译器,正如Anthony Mills评论中提到的,这是相关的。另一个有实际应用价值的有趣讨论是这个细节


    有一段时间,comp.compilers新闻组值得一看。

    在想象的世界里,我想说约翰·麦卡锡的元循环LISP解释器的改编将非常接近。你可能还想看看约翰·雷诺德(John Reynold)的论文《高阶语言的定义解释器》(Definition Translators for Higher Order Languages),尽管稠密是一个简单的模型


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

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

    我所知道的最小的自编译编译器是。是的,从1963年开始。 (该页面上有一个链接,指向他关于该主题的技术论文)。 如果你喜欢编译器,跑去拿这篇论文;这是一种气体,只有10页

    这不是理论;这是切实可行的。他的论文提供了编译器源代码(大约20-30行IIRC)、元编译机制的描述,元编译程序处理源代码并重新生成完全相同的元编译程序。如果你不介意用令人难以置信的代码来实现元机器,你可以自己在1-2天的时间里复制这个结果。[早在1970年,我就通过这样做,从这篇论文中学会了构建编译器]。 或者,您也可以使用预先构建在JavaScript中的功能

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

    你可以走另一条路:你可以开始把东西拿出来,看看你能移除多少,并且仍然能够提升到MetaII级别。我这样做过一次,并设法摆脱了约30%,而没有失去灵活性,甚至很多表达能力;它减少到了大约20行文本,而且,值得注意的是,它是一个更简单的元机器

    一位名叫道格·米歇尔(Doug Michels)的聪明人很久以前就参与了20世纪80年代(Unix供应商)的圣克鲁斯(Santa Cruz)操作,他告诉我,他已经走得更远,将元编译器的自我描述减少到了非常少的字符数。我从来没有看过这部作品,所以我真的不知道他走了多远

    [编辑]挖,挖,挖。。。找到此宝石(在Linkedin上):

    达特茅斯大学的副教授比尔·麦基曼说:

    道格是我的本科生;他的毕业论文作业很简单:编写最短、可扩展、自编译的编译器。前端使用了27个字符;整件事花了63分钟。所有这些都可以放在一张IBM卡上。他公布了结果

    挖,挖,再挖一些:。参见图2。通过“前端”,McKeeman显然意味着“只是解析器”;这篇论文包含了一些较大的完整翻译人员


    除非编译器“概念上很简单”,否则您无法获得这么小的编译器。

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

    简而言之:

  • 只有一个可执行文件
  • 启动可执行文件时,它会生成自己的源代码
  • 当再次启动可执行文件时,它编译并执行此源代码,显示相同的用户界面 一个很好的测试是使用Visual Studio或命令行C#编译器删除可执行文件并编译生成的源代码:

     del SelfReplication.exe
     csc SelfReplication.cs
     move SelfReplication.cs SelfReplication-old.cs
     SelfReplication.exe
    
    最后一条语句生成SelfReplication.cs文件。 旧的和新生成的文件完全相同!! 这个程序的一个特点是你可以改变(变异)源代码