lisp - 自托管的概念

标签 lisp

所以我正在开发一种小型编程语言,并试图理解“自托管”的概念。

维基百科指出:

The first self-hosting compiler (excluding assemblers) was written for Lisp by Hart and Levin at MIT in 1962. They wrote a Lisp compiler in Lisp, testing it inside an existing Lisp interpreter. Once they had improved the compiler to the point where it could compile its own source code, it was self-hosting.

由此,我了解到有人有一个 Lisp 解释器(比如 Python)。
然后,Python 程序读取 Lisp 程序,而 Lisp 程序又可以读取 Lisp 程序。

就术语“自托管”而言,这肯定并不意味着 Python 程序可以停止使用,因为删除该术语将消除运行读取其他 Lisp 程序的 Lisp 程序的能力!

这样一来,程序如何能够直接在操作系统上托管自己呢?也许我只是没有正确理解它。

最佳答案

在这种情况下,术语“自托管”适用于他们编写的 Lisp 编译器,而不是解释器。

Python Lisp 解释器(如您的示例中)会将 Lisp 源代码作为输入,并直接执行它。

Lisp 编译器(用 lisp 编写)可以将任何 Lisp 源代码作为输入,并生成 native 机器二进制文件 [1] 作为输出(然后可以在没有解释器的情况下运行)。

有了这两部分,消除 Python 就变得可行了。该过程如下:

python.exe lispinterpret.py lispcompiler.lisp -i lispcompiler.lisp -o lispcompiler.exe

我们要求 Python 从源代码 (lispcompiler.lisp) 解释 Lisp 程序,然后将 lispcompiler.lisp 本身作为输入传递。然后 lispcompiler.lisp 输出 lispcompiler.exe 作为输出,这是一个 native 机器二进制文件(并且不依赖于 Python)。

下次要编译编译器时,命令是:

lispcompiler.exe -i lispcompiler.lisp -o lispcompiler2.exe

您将拥有一个不使用 Python 的新编译器。

[1] 或者您可以生成汇编代码,并将其传递给汇编器。

关于lisp - 自托管的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37316302/

相关文章:

emacs - Elisp 函数返回标记而不是正确的值

functional-programming - Funcall 在 Common Lisp 中如何工作?

lisp - 比较 lisp 中的字符串

lisp - Common Lisp 中的条件变量绑定(bind)

sorting - 在交换过程中无法获得我想要的最终列表

emacs - 为什么人们说 "emacs is good for writing lisp program because it' 是用 emacs lisp 编写的”?

recursion - sbcl 在第二次调用函数时永远运行

scheme - 理解Scheme中的表达式

Lisp:原子和字符串

lisp - 一个函数需要多少个参数?