那么,让我看看我是否清楚明白了。
我们说编译器和解释器之间的区别在于解释器将高级指令翻译成中间形式,然后执行它。 [我认为编译器也将高级指令翻译成中间形式,但此时它生成的是目标代码而不是执行它,对吗?]
解释器一次读取一个指令或一行源代码,将其转换为机器码并执行。 [解释器本身并不将代码转换为机器码,它使用自己预编译的函数来评估指令(在解析后)。例如,高级语言中的Add表达式将使用解释器的add函数进行评估,该函数已经被预先编译了,对吗?]
那么,让我看看我是否清楚明白了。
我们说编译器和解释器之间的区别在于解释器将高级指令翻译成中间形式,然后执行它。 [我认为编译器也将高级指令翻译成中间形式,但此时它生成的是目标代码而不是执行它,对吗?]
解释器一次读取一个指令或一行源代码,将其转换为机器码并执行。 [解释器本身并不将代码转换为机器码,它使用自己预编译的函数来评估指令(在解析后)。例如,高级语言中的Add表达式将使用解释器的add函数进行评估,该函数已经被预先编译了,对吗?]
我同意第一个观点,尽管解释器不一定在一次处理一行代码(它可以根据整个代码的知识进行优化)。
我认为第二个观点略有偏差:编译器确实会创建“机器码”(可能是JVM的字节码)。解释器根据输入执行其自身程序的部分(到目前为止与编译器相同),这些执行的部分执行描述输入中的计算(而不是执行计算以计算所需的机器码)。
通过编译器生成将在执行时被解释的代码(以基于编译时不可用的因素提供运行时优化),两者之间的界限是可以模糊的。
关于(1),你是对的。
至于(2),解释器不需要逐条读取源代码,因为当解释包含循环的代码时,这样做太昂贵了。更有可能的是,它会读取整个表达式、语句、函数甚至源文件,将其转换为中间格式并进行评估。
请注意,编译器和解释器都不需要在任何时候生成机器代码;许多编程语言,包括Java、Python以及旧的语言如Prolog,通常被编译成虚拟机字节码。在Python和Prolog中,“解释器”通常是一个组合的字节码编译器/字节码解释器。
我所知道的关于编译和解释的最好介绍是SICP的第4章和第5章,它从讨论一个非常简单的解释器开始,并逐步改进直到成为一个完整的编译器。