自我托管(编译器)

计算机编程中,自我托管是将程序用作工具链或操作系统的一部分,该工具炼或操作系统生产了同一程序的新版本,例如,可以编译其自己的源代码编译器。自托管软件个人计算机和较大的系统上很普遍。通常是自我托管的其他程序包括内核汇编器命令行解释器修订控制软件

作业系统

当工具链构建操作系统在同一操作系统上运行时,操作系统是自托管的。例如,可以在运行窗口的计算机上构建窗口。

在系统成为自托管之前,需要另一个系统来开发它,直到达到可能的自我托管阶段为止。在为新计算机或操作系统开发时,需要运行开发软件的系统,但是用于编写和构建操作系统的开发软件也是必需的。这称为自举问题,或者更普遍地是鸡肉或鸡蛋困境。

解决此问题的一种解决方案是交叉编译器(或使用汇编语言时交叉组装程序)。交叉编译器允许为另一个机器或操作系统编译一个平台上的源代码,从而为自托管编译器尚不存在的机器创建操作系统。书写后,可以使用EPROM软盘闪存(例如USB拇指驱动器)或JTAG设备等均值将软件部署到目标系统。这类似于为游戏机编写软件的方法,或用于蜂窝电话或平板电脑等手持设备的方法,而手机或平板电脑没有托管自己的开发工具。

一旦系统成熟到足以编译自己的代码,跨开发依赖性结束了。在这一点上,据说操作系统是自托管的。

编译器

当编译器能够编译本身时,使用编译器或口译人员的软件开发也可以自托管。

由于自我托管编译器与操作系统遇到了相同的自举问题,因此需要用现有语言编写新的编程语言的编译器。因此,开发人员可以使用汇编语言,c/c ++,甚至诸如python或lua之类的脚本语言来构建编译器的第一个版本。一旦语言足够成熟,编译器的开发就可以转移到编译器的母语,从而使编译器可以构建自身。

历史

1962年,Hart和Levin在MIT上为LISP编写了第一个自我托管编译器(不包括汇编程序)。他们在LISP中撰写了LISP编译器,在现有的LISP解释器中对其进行了测试。一旦他们将编译器改进到可以编译自己的源代码的地步,它就会自我托管。

它存在于标准编译器磁带上的编译器是一种机器语言程序,是通过将编译器的S-表达定义通过解释器来获得的。

- AI备忘录39

通常,只有当解释器已经存在与要编译的相同语言的说法时,这种技术通常是可行的。尽管可能有可能,但与自身进行人类编译的编译器非常罕见。该概念直接借用,这是一个本身运行程序的更广泛概念的一个示例,它也用于理论计算机科学的各种证明中,例如停止问题是不可避免的。

例子

肯·汤普森(Ken Thompson)于1968年通过在GE-635上编写和编写程序,并将其运送到PDP-7进行测试,从而开始在UNIX上开发。在最初的UNIX内核,命令解释器,编辑器,汇编程序和一些实用程序完成后,UNIX操作系统是自托管的 - 可以在PDP-7本身上编写和测试程序。

道格拉斯·麦克罗伊(Douglas McIlroy )在一张纸上用TMG写了TMG编译器),并“决定将他的纸放在他的纸上”,然后自己进行计算,从而将TMG编译器编译为组装中,并将其键入它,他输入了该纸张。并在Ken Thompson的PDP-7上组装。

GNU系统的开发在很大程度上依赖于GCC (GNU编译器收集)和GNU EMACS (一个受欢迎的编辑),这使得为GNU项目的自由,维护和持续开发了自由软件

许多编程语言具有自托管的实现:相同语言的编译器。一种方法是引导程序,该方法最初使用其他高级语言,汇编器甚至机器语言实现了该语言的核心版本;然后,将最终的编译器用于开始构建自身的连续扩展版本。

具有自主编译器的语言列表

以下编程语言具有自托管编译器:

也可以看看