Compilation 解释器与编译器';s最终代码产品
我试图理解编译器和解释器之间的区别 我知道编译器会将一种高级语言直接翻译成机器代码,一气呵成,看到整个代码 我知道解释器——而不是翻译成机器代码——直接执行命令,一次一个 我不明白的是翻译是怎么做到的?它不是也必须生成机器代码才能执行吗Compilation 解释器与编译器';s最终代码产品,compilation,operating-system,interpreter,Compilation,Operating System,Interpreter,我试图理解编译器和解释器之间的区别 我知道编译器会将一种高级语言直接翻译成机器代码,一气呵成,看到整个代码 我知道解释器——而不是翻译成机器代码——直接执行命令,一次一个 我不明白的是翻译是怎么做到的?它不是也必须生成机器代码才能执行吗 所以我的问题是——编译器和解释器不是都在生成机器代码,而解释器只是执行额外的步骤,逐行执行(然后丢弃执行的机器代码)?编译器解析语言并生成机器代码 解释器解析语言并通过调用专用函数直接执行程序,它不会生成代码 例如,A=B+C使编译器生成 Load R0, $B
所以我的问题是——编译器和解释器不是都在生成机器代码,而解释器只是执行额外的步骤,逐行执行(然后丢弃执行的机器代码)?编译器解析语言并生成机器代码 解释器解析语言并通过调用专用函数直接执行程序,它不会生成代码 例如,
A=B+C
使编译器生成
Load R0, $B;
Load R1, $C;
Add R1, R0;
Store $A, R1;
解释器在解析时直接调用其运行时例程
....
Push("B");
....
Push("C");
....
Add();
....
Pop("A");
....
通常情况下,实际情况更为复杂,因为可能存在预解析的中间形式以及被解释或及时编译的中间代码,但您明白了这一点
我强烈推荐,它将向您展示如何在编译器或解释器中实现解析器。但是机器如何理解Push()、Add()和Pop()?为了让机器能够执行它们,必须有二进制的机器代码版本,不是吗?必须有人将推送、添加和弹出转换为二进制?当然,这些例程只是被调用,它们不会被复制到任何地方以进行“流式”执行。这个程序是隐式翻译的。我明白了。所以主要的区别是编译器会为整个程序生成机器代码,然后我们可以随意执行。然而,解释器也会产生机器代码,但只是同时执行它,我们不能在没有再次解释的情况下获得它并在以后执行它?你不应该说解释器“产生”机器代码。它在解析时不时调用其运行时库的函数。没有存储任何指令。事实上,编译后的程序是独立的,而解释后的程序只能在解释器的控制下执行。