首页 / 知识
关于编译器构造:自举仍然需要外部支持
2023-04-12 08:38:00

Bootstrapping still requires outside support我听说过引导语言的想法,即为语言本身编写编译器/解释器。 我想知道如何做到这一点,环顾四周,看到有人说这只能由任何一个人来完成
在我看来,这两者似乎都不是在引导语言,因为它们都需要外部支持。 有没有办法用自己的语言实际编写编译器?
您必须使用某种现有语言来编写新的编译器。如果要编写新的C ++编译器,则只需用C ++编写,然后首先使用现有的编译器进行编译。另一方面,如果要为一种新语言创建编译器,我们称其为Yazzleof,则需要首先使用另一种语言编写新的编译器。通常,这将是另一种编程语言,但并非必须如此。它可以是汇编代码,也可以是机器代码。 如果您要为Yazzleof引导编译器,则通常最初不会为完整语言编写编译器。相反,您将为Yazzle-lite(Yazzleof的最小可能子集)(至少是一个很小的子集)编写一个编译器。然后,在Yazzle-lite中,您将编写完整语言的编译器。 (显然,这可以迭代而不是一次跳转。)因为Yazzle-lite是Yazzleof的适当子集,所以您现在有了一个可以自行编译的编译器。 关于从最低级别引导编译器(在现代计算机上基本上是十六进制编辑器)进行引导的文章非常不错,标题为"从零开始引导简单的编译器"。可以在https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html上找到。 您阅读的说明是正确的。在《编译器:原理,技巧和工具》(《龙书》)中对此进行了讨论:
在Unix联合创建者Ken Thompson的Turing Award演讲中,对此进行了非常有趣的讨论。 他开始时:
并继续说明他如何编写Unix C编译器的版本,该版本始终允许他不用密码登录,因为C编译器会识别登录程序并添加特殊代码。
我听说过的方法是用另一种语言编写极其有限的编译器,然后使用该语言编译使用新语言编写的更复杂的版本。然后可以使用第二个版本进行自身编译,也可以使用下一个版本进行编译。每次编译时都使用最新版本。 这是自举的定义:
编辑:有关编译器引导的Wikipedia文章比我更好地介绍了该概念。 Donald E. Knuth实际上是通过在其中编写编译器来构建WEB的,然后将其手工编译为汇编或机器代码。 查阅Podcast软件工程电台第61集(2007-07-06),其中讨论了GCC编译器的内部以及GCC引导过程。 据我了解,第一个Lisp解释器是通过手工编译构造函数和令牌读取器来引导的。然后从源中读取了其余的解释器。 您可以通过阅读原始的麦卡锡论文《符号表达式的递归函数及其由机器进行的计算》(第一部分)来进行检查。 另一种选择是为您的语言创建一个字节码机器(或者,如果功能不是很特殊,则使用现有的字节码机器),然后使用字节码或所需的语言使用另一种中间语言(例如a)将编译器写入字节码。解析器工具包,将AST输出为XML,然后使用XSLT(或另一种模式匹配语言和基于树的表示形式)将XML编译为字节码。它不会消除对另一种语言的依赖,但是可能意味着更多的引导工作最终会在最终系统中完成。 这是鸡和蛋悖论的计算机科学版本。我想不出一种不用汇编器或其他语言编写初始编译器的方法。如果可以做到,我应该Lisp可以做到。 实际上,我认为Lisp几乎可以胜任。查看其Wikipedia条目。根据这篇文章,Lisp eval函数可以在IBM 704上用机器代码实现,而完整的编译器(由Lisp自己编写)于1962年在麻省理工学院诞生。 自举一种我能想到的语言(C,PyPy)的示例都是在有一个可用的编译器之后完成的。您必须从某个地方开始,重新实现一种语言本身首先需要用另一种语言编写编译器。 否则它将如何工作?我不认为在其他方面也没有可能。 一些自举的编译器或系统会将源表单和对象表单都保留在其存储库中:
|
最新内容
相关内容
python支持r语言吗?
python支持r语言吗?,代码,名称,培训,官网,第一,语言,对象,字符串,方法,后缀,python中可以支持r语言。python提供了一个模块rpy2,可以较好地完Python语言中mod表示什么意思
Python语言中mod表示什么意思,环境,培训,表示,语言,结果,负数,语法,符号,两者,规律,python语言中mod表示取模运算符。语法MOD(a,b)通常情况下python到底是什么样的语言
python到底是什么样的语言,教育,软件,人工智能,培训,代码,简介,语言,类型,程序,动态,python是一种面向对象、解释型、动态类型计算机程序设计python语言受欢迎吗
python语言受欢迎吗,代码,工作,业务,活跃,设计,发展,人工智能,培训,数据,语言,python因其简单易用的语法而获得了很多赞誉。该语言强调代码的python支持多继承吗
python支持多继承吗,培训,代码,不了,上边,函数,属性,例子,父亲,定义,母亲,python多继承单继承有时候可能满足不了我们所需的所以我们就会遇到pythonc语言取余和python取余的区
pythonc语言取余和python取余的区别,培训,资料,语言,负数,区别,被除数,符号,除数,规定,余数,今天看书发现python与C的负数取余运算结果不同,python是否支持字符串
python是否支持字符串,培训,数据,字符串,字符,引号,中文,内容,也就是,源程序,比如说,python要求,字符串必须使用引号括起来,可以使用单引号或者pythonPython和r语言的区别
pythonPython和r语言的区别,数据,分析,流程,培训,工具,系统,服务,平台,代码,语言,Python与R语言的共同特点1.Python和R在数据分析和数据挖掘pythonpython是函数式语言吗
pythonpython是函数式语言吗,培训,代码,函数,概念,指数,状态,语言,变量,计算机,程度,函数是Python内建支持的一种封装,我们通过把大段代码拆成python为什么叫胶水语言
python为什么叫胶水语言,标准,代码,培训,数据,一致,环境,周期性,软件,服务,胶水,什么是胶水语言?胶水语言(gluelanguage)是用来连接软件组件python支持哪些数据类型
python支持哪些数据类型,数字,标准,指数,培训,系统,浮点,布尔,表示,类型,个位,python基本数据类型一般分为:数字、字符串、列表、元组、字典、python编程语言有什么用途
python编程语言有什么用途,设计,大规模,软件,培训,数据,平台,工具,生产,面临,通用,Python是一门简单易学的编程语言。阅读好的Python程序感觉