看这篇文章之前可以看看我之前写的,《程序员的自我修养》笔记一,读完那篇文章,就可以真正明白(从最底层明白)这篇文章里面的意思。
传统意义上的所谓编译与解释,区别在于代码是在什么时候被翻译成目标CPU的指令。——虽然这种解释从科学上说不通,但这却是一直以来大家更认可的更约定俗成的定义。
对 C、C++ 语言或者其他编译型语言来说,编译生成了目标文件(.exe),而这个目标文件是针对特定的 CPU 体系的,为 ARM 指令集生成的目标文件,不能被用于 MIPS指令集 的 CPU。这段代码在编译过程中就已经被翻译成了目标 CPU 指令(把所有的指令都翻译完我再执行)。所以,如果这个程序需要在另外一种 CPU 上面运行,这个代码就必须重新编译。( 这里解释一下,ARM、MIPS、X86,是最常用的CPU指令集)
对于各种解释型语言(例如python/java)来说,同样也可能存在某种编译过程,但他们编译生成的通常是一种平台无关的中间代码,在运行过程中才被翻译成目标 CPU 指令的(翻译一条我执行一条),因而,在 ARM CPU 上能执行,换到 MIPS 也能执行,换到 X86 也能执行,不需要重新对源代码进行编译。但需要解释器。
PS:还不理解?
再大白话一点,你吃火锅的时候,是把所有东西一次性都放锅里煮熟,然后一起吃(编译型),还是说,你是一个一个放进去煮,煮熟一个你吃一个(解释型)?
其实到这里已经可以完了,但又确实觉得不太严谨。
这里多说两句:
随着Java等基于虚拟机的语言的兴起,笔者认为,我们实际上又不能把语言纯粹地分成解释型和编译型这两种。
用Java来举例,Java源代码首先是通过编译器编译成字节码文件(相当于上边提到的中间代码).class文件,然后在运行时通过解释器(也就是常说的JAVA虚拟机)翻译成目标机器指令。Python也如此,也需要先编译成与平台无关的字节码文件(编译过程完全感受不到),然后再用解释器解释执行。你说他们没编译么?他们编译了。你说他们是编译型语言?他们实际上又是每次运行都是解释一条指令然后执行一条。。。
所以说,笔者认为,你只要理解程序运行的过程就好,没必要纠结JAVA、Python到底是不是解释型语言。
如果想更深入了解程序运行过程的,可以点击此~
简单总结:
编译型语言在编译过程中生成目标平台的指令,解释型语言在运行过程中才生成目标平台的指令。