“解释执行”的理解-《Java核心技术》笔记

编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的。而解释是对源程序的翻译与执行一步到位完成,不生成可存储的目标代码。最大的区别在于控制权:对于解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,程序运行时的控制权在用户。

根据程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言,可以分为两大类:编译型语言和解释型语言。

由编译型语言编写的源程序需要经过编译、汇编和链接才能生成目标代码,然后机器执行目标代码得出结果。目标代码由机器指令组成,一般不能独立运行;

解释型语言中,翻译器并不生成目标代码,而是产生易于执行的中间代码,中间代码的解释由软件执行,不能直接使用硬件。用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。解释程序的任务是逐一讲源程序的语句解释成机器可执行的机器指令。

java很特殊。java也需要编译,但是不是直接编译为目标代码,而是编译为字节码,然后在java虚拟机上用解释方式执行字节码。但是常见的JVM,都提供了JIT编译器,能够在运行时将热点代码编译成机器码,这种时候就编译执行而不是解释执行了。

在运行时,JVM会通过类加载器加载字节码,解释或编译执行。主流java版本中,如JDK8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通常运行在server端的jvm,会进行上万次调用以收集足够的信息进行代码的编译,client端是1500次。

程序从源代码到运行的阶段:编码-编译-运行-调试。java在编译阶段体现了跨平台的特性。编译过程大概是这样:首先将java源代码转换为.class字节码,这是第一次编译。然后jvm把字节码转换为目标机器代码,即java的第二次编译。

comments powered by Disqus