假设你正在使用的语言是某种语言,比如 Lisp,尽管这并不重要。(可以是 C++、Java、Ruby 等等。)
那么你有一个 Lisp 的实现。将此实现称为 Imp(只是 IMPlementation 的一些虚构名称)。由于 Imp 本身就是一个程序,因此您的计算机可以运行它。现在你为用 Lisp 编写的 Lisp 编写你自己的实现,你称之为 Circ。Circ 只是一个从 Lisp 代码编译(或解释)的程序。您的代码是这样编写的,因此它会读入一个文件,对其进行解析(将其处理为有意义的数据),然后对数据进行一些处理。这是什么东西?在 Circ 的情况下,它执行数据。
但它是如何做到的呢?
好吧,假设对于一个简单的情况,Circ 读取并解析的代码很简单,比如做一些数学运算并输出结果。Circ 将代码处理成易于使用的数据(对于像 Lisp 这样的语言来说,它很容易开始,但这已经超出了重点)并存储它。在 Lisp 中你可以编写代码来处理数字,所以为 Circ 编写的代码也可以这样做,因为它是用 Lisp 编写的。因此,处理后的数据被插入到一些附加处理代码中......瞧!你有数字结果!然后你的 Circ 程序输出结果。
同样的事情也可以用比简单数学更复杂的事情来完成。事实上,您可以编译/解释该语言的其他方面。编写足够多的这些“其他方面”并将它们粘合在一起,您将获得一个用 Lisp 编写的 Lisp 编译器。
由于编译器是 Imp 编译的,所以它可以在你的机器上运行,并且 presto!你完成了。