程序的编译与解释有什么区别?

补充一个回答吧,编译与解释描述的是程序的执行方式,与语言无关。 而且程序的编译与解释并没有太大的区别,详见下面的回答。
关注者
886
被浏览
240,768

34 个回答

取决于你怎么解读这个问题。

从数学的角度,或者从科学的角度来说,王垠的说法是正确的,但这个正确的答案对解答题主的疑问并无帮助。

从工程的角度来说,我们讲究的是一个问题的『实用价值』,把这个问题上升到哲学意义上其实用处不大。

传统意义上的所谓编译与解释,区别在于代码是在什么时候被翻译成目标CPU的指令。——虽然这种解释从科学上说不通(科学上,王垠的那个定义更准确),但这却是一直以来大家更认可的更约定俗成的定义。

对 C 语言或者其他编译型语言来说,编译生成了目标文件,而这个目标文件是针对特定的 CPU 体系的,为 ARM 生成的目标文件,不能被用于 MIPS 的 CPU。这段代码在编译过程中就已经被翻译成了目标 CPU 指令,所以,如果这个程序需要在另外一种 CPU 上面运行,这个代码就必须重新编译

对于各种非编译型语言(例如python/java)来说,同样也可能存在某种编译过程,但他们编译生成的通常是一种『平台无关』的中间代码,这种代码一般不是针对特定的 CPU 平台,他们是在运行过程中才被翻译成目标 CPU 指令的,因而,在 ARM CPU 上能执行,换到 MIPS 也能执行,换到 X86 也能执行,不需要重新对源代码进行编译。

至于为什么会有虚拟机的存在?这个答案也很简单了,因为那些非编译型语言生成的并不是目标平台的代码,而是某种中间代码。而能够运行这种中间代码的机器并不广泛存在,所以我们在每个不同的平台中用软件模拟出这个假想平台的虚拟机,这个虚拟机执行这种中间代码,而虚拟机负责把代码转换成最终的目标平台上的指令。

--

简单总结:

1,编译型语言在编译过程中生成目标平台的指令,解释型语言在运行过程中才生成目标平台的指令。

2,虚拟机的任务是在运行过程中将中间代码翻译成目标平台的指令。