解释器和编译器最终代码产品

interpreter versus compiler's final code product

我正在尝试了解编译器和解释器之间的区别。

我了解编译器将高级语言直接翻译成机器代码,一次完成,查看整个代码。

而且我知道解释器 - 而不是翻译成机器代码 - 它直接执行命令,一次一个。

我不明白解释器是怎么做到的?难道它最终也必须生成机器代码才能执行吗?

所以我的问题是 - 编译器和解释器不是都生成机器代码,而解释器只是执行额外的步骤并逐行执行它(然后丢弃执行的机器代码)吗?

编译器解析语言并生成机器码。

解释器通过调用专门的函数直接解析语言并执行程序,它不会生成代码。

例如,A= B + C 使编译器生成

Load R0, $B; 
Load R1, $C;
Add R1, R0; 
Store $A, R1; 

并且解释器在解析时直接调用其 运行 时间例程

....
Push("B");
....
Push("C");
....
Add();
....
Pop("A");
....

像往常一样,现实情况更复杂,因为可能存在预解析的中间形式以及解释或即时编译的中间代码,但您明白了。

我热烈推荐http://compilers.iecc.com/crenshaw/,它将向您展示解析器如何体现在编译器或解释器中。