解释性语言 ,编译型语言
传统意义上的所谓编译与解释 , 区别在于代码是在什么时候被翻译成目标CPU指令.
编译型语言 :
对C语言或其他编译型语言来说 , 编译生成了目标文件 , 而这个目标文件是针对特定CPU体系的 , 为ARM生成的目标文件 , 不能被用于MIPS的CPU .这段代码在编译过程中就已经被翻译成了目标CPU指令 , 所以 , 如果这个程序要在另外一种CPU上面运行 , 这个代码就必须重新编译.
非编译型语言 :
对于各种非编译型语言 ( Python/Java ) 来说 , 同样也可能存在某种编译过程 , 但他们编译生成的通常是一种平台无关的中间代码 .例如java 的 class文件 .这种代码一般不是针对特定的CPU平台 , 他们是运行过程中才被翻译成目标CPU指令的 , 因而能跨平台 .
源代码直接翻译成机器语言 ,执行效率高 , 依赖编译器 , 跨平台差 .
虚拟机 :
至于为什么会有虚拟机的存在? 就是因为那些非编译型语言生成的并不是目标平台的代码 , 而是中间代码 . 而能够运行这种中间代码的机器并不广泛存在, 所以我们在每个不同的平台中用软件模拟出这个假想平台的虚拟机 , 这个虚拟机执行这种中间代码 , 负责把中间代码转换成最终目标平台上的指令
源代码先翻译成中间代码 , 再由解释器解释运行 . 执行效率低, 依赖解释器 , 跨平台性好
总结 :
1. 编译型语言在编译过程中生成目标平台指令 , 解释型语言在运行过程中才生成目标平台的指令
2. 虚拟机的任务是在运行过程中将中间代码翻译成目标平台的指令
扩展 :
程序语言 & 操作系统 & 编译器
程序语言需要在编译器里面进行编译 , 但是编译器需要运行在操作系统里 .
编译器就是将一种语言( 高级语言 ) 翻译为另一种语言 ( 通常为低级语言) 的程序
现代编译器的主要工作流程 : 源代码 -> 预处理器 -> 编译器 -> 目标代码 -> 链接器 -> 可执行程序