对于像这样的代码A = A + B
,它可以编译为一两个机器指令,每个指令要花费一定的周期。出于简单的原因,没有解释器可以在该数量的循环中执行相同的操作。
解释器还执行自己的指令集(称其为字节码,p码,中间语言等)。每次看到类似ADD的字节码时,都必须以某种方式查找它,然后跳转到执行加法的代码。
在接下来它看到它的时候,它必须重复那个查询,除非它有一个方法来记住事先查询。如果它确实可以记住以前的查找,则不再是我们所说的“解释器”,而是即时编译器或JITter。
另一方面...
对于类似的代码callSomeFunction( ... some args ...)
,在输入该代码和离开该代码之间要花费多少周期?这一切都取决于内部发生了什么callSomeFunction
。即使callSomeFunction
它本身是编译的,也可能是几个,甚至可能是数万亿。如果很多,那么讨论该行代码的解释成本毫无意义-钱就在别处。
请记住,解释型语言具有其自身的价值,例如,无需编译它们。(将表面语法“编译”为字节码需要花费很短的时间。例如以R或MATLAB为例。)
此外,智能编程级别还需要灵活性。在Minsky的“心灵社会”的第6.4章B-大脑中,有A程序与世界打交道,有B程序与A程序打交道,并且可以有更高的层次。编写和管理其他程序的程序可以在解释性系统中更轻松地完成。
在Lisp中,您可以编写(+ A B)
添加A和B的内容,但是一旦编写完成,您只能选择是否运行它。您还可以编写(eval (list '+ 'A 'B))
构造程序然后执行的程序。它可以构造一些不同的东西。
该程序的主题是另一个程序。这更容易用解释性语言编写(尽管正如Jörg所指出的,Lisp的较新版本虽然可以eval
即时编译,所以它们没有解释速度上的损失)。