解释器和编译器最终代码产品
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/,它将向您展示解析器如何体现在编译器或解释器中。
我正在尝试了解编译器和解释器之间的区别。
我了解编译器将高级语言直接翻译成机器代码,一次完成,查看整个代码。
而且我知道解释器 - 而不是翻译成机器代码 - 它直接执行命令,一次一个。
我不明白解释器是怎么做到的?难道它最终也必须生成机器代码才能执行吗?
所以我的问题是 - 编译器和解释器不是都生成机器代码,而解释器只是执行额外的步骤并逐行执行它(然后丢弃执行的机器代码)吗?
编译器解析语言并生成机器码。
解释器通过调用专门的函数直接解析语言并执行程序,它不会生成代码。
例如,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/,它将向您展示解析器如何体现在编译器或解释器中。