这种区别具有深远的意义,因为编译的语言不一定以解释的语言来限制语义。有些解释技术很难(实际上是不可能)进行编译的。
解释后的代码可以执行类似的操作,例如在运行时生成代码,并使该代码对现有范围的词法绑定具有可见性。那是一个例子。另一个是,解释器可以使用解释后的代码扩展,这些代码可以控制代码的评估方式。这是古老的Lisp“ fexprs”的基础:使用未评估的参数调用并决定如何处理这些函数(可以完全访问必要的环境以遍历代码和评估变量等)。在编译语言中,您不能真正使用该技术。您改用宏:在编译时使用未经评估的参数调用的函数,然后翻译代码而不是解释。
围绕这些技术构建了一些语言实现。他们的作者拒绝将编译视为重要目标,而是接受这种灵活性。
作为引导编译器的一种技术,解释将始终是有用的。作为一个具体的例子,请看CLISP(Common Lisp的流行实现)。CLISP具有本身编写的编译器。当您构建CLISP时,将在早期构建步骤中解释该编译器。它用于自身编译,然后在编译后使用编译后的编译器进行编译。
没有解释器内核,您将需要使用一些现有的Lisp进行引导,就像SBCL一样。
通过解释,您可以从汇编语言开始,从头开始开发一种语言。开发基本的I / O和核心例程,然后编写一种评估的静态机器语言。评估后,请使用高级语言进行写作;机器代码内核进行评估。使用此功能可以使用更多例程来扩展库,并还可以编写编译器。使用编译器来编译那些例程和编译器本身。
解释:通往编译之路的重要垫脚石!