所以我正在开发一种小型编程语言,并试图抓住“自托管”的概念。
维基百科声明:
第一个自托管编译器(不包括汇编程序)是由Hart和Levin于1962年在麻省理工学院为Lisp编写的。他们在Lisp中编写了一个Lisp编译器,在现有的Lisp解释器中测试它。一旦他们将编译器改进到可以编译自己的源代码的程度,它就是自托管的。
据此,我知道有人有一个Lisp解释器,(比方说Python) 然后Python程序读取一个Lisp程序,该程序又可以读取Lisp程序。
通过术语“自托管”,这肯定不能说Python程序可以停止使用,因为删除它会删除运行读取其他Lisp程序的Lisp程序的能力!
因此,程序如何能够直接在操作系统上托管自己?也许我只是没有正确理解它。
答案 0 :(得分:2)
在这种情况下,术语自托管适用于他们编写的Lisp编译器,而不是解释器。
Python Lisp解释器(在您的示例中)将Lisp源作为输入,并直接执行它。
Lisp编译器(用lisp编写)可以将任何Lisp源作为输入,并生成本机二进制[1]作为输出(然后可以在没有解释器的情况下运行)。
有了这两部分,消除Python变得可行。该过程如下:
python.exe lispinterpret.py lispcompiler.lisp -i lispcompiler.lisp -o lispcompiler.exe
我们要求Python从源代码解释lisp程序(lispcompiler.lisp),并将lispcompiler.lisp本身作为输入传递。 lispcompiler.lisp然后输出lispcompiler.exe作为输出,这是一个本地机器二进制文件(并且不依赖于Python)。
下次要编译编译器时,命令为:
lispcompiler.exe -i lispcompiler.lisp -o lispcompiler2.exe
你将有一个不使用Python的新编译器。
[1]或者您可以生成汇编代码,并将其传递给汇编程序。