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()?为了让机器能够执行它们,必须有二进制的机器代码版本,不是吗?必须有人将推送、添加和弹出转换为二进制?当然,这些例程只是被调用,它们不会被复制到任何地方以进行“流式”执行。这个程序是隐式翻译的。我明白了。所以主要的区别是编译器会为整个程序生成机器代码,然后我们可以随意执行。然而,解释器也会产生机器代码,但只是同时执行它,我们不能在没有再次解释的情况下获得它并在以后执行它?你不应该说解释器“产生”机器代码。它在解析时不时调用其运行时库的函数。没有存储任何指令。事实上,编译后的程序是独立的,而解释后的程序只能在解释器的控制下执行。