1,相关概念
1)编译方式:
编译方式把源程序的执行过程严格地分成两大步:编译和运行。
①把源程序全部翻译成目标代码
②运行目标代码,获取执行结果。
2)解释方式:
源程序输入到计算机后,解释程序将程序逐句翻译,翻译一句执行一句边翻译边执行,不产生目标程序。
解释方式是按照远程序中语句的动态顺序,直接地逐句进行分析解释,并立即执行。
解释的过程:在程序执行时开始翻译代码为二进制,翻译一句执行一句。
3)JIT和AOT编译技术比较:
①JIT(Just-In-Time)即时编译技术,动态编译。
根据代码结构肯能提高或降低java程序执行速度。
i>缺点:
由于JIT对每条字节码都进行编译,造成了编译过程负担过重(编译器必须与应用程序共享CPU)。为了避免这种情况,当前的JIT只对最频繁执行的字节码(热方法)进行编译,如循环等。可通过java.lang.Compiler.disable();关闭。
ii>优点:
运行时进行本地代码编译而不是在程序运行前编译(C、C++是这种),保证了可移植性。
②AOT:静态编译。
在程序执行前生成 Java 方法的本地代码,以便在程序运行时直接使用本地代码。
i>缺点:
牺牲了平台无关性和代码质量,因为它们不能利用程序的动态行为,也不具有关于加载的类或类层次结构的信息。
ii>优点:
避免 JIT 编译器的运行时性能消耗或内存消耗,或者避免解释程序的早期性能开销。极大提高java代码性能。
具体参照:http://blog.csdn.net/hsuxu/article/details/9320699
4)静态代码块和动态代码块:
静态代码块 :JVM加载类的时候会加载执行,并且只执行一次。
非静态代码块:在new对象的时候执行,每次new的时候都会执行一次。
5)java语言的编译方式:
.class不是机器语言,是经过编码的8位字节二进制流,描述了java类种每个方法所执行的操作。因为没有直接编译成机器语言,所以称为半编译型。①编译:
用javac命令,源文件source code(.java)编译成字节码bytecode(.class)。
注:
a) .java文件是一个编译单元,每个编译单元最多只有一个public标记的类,其它的类都是为这个public类起支撑作用的。
b)在编译的时候,根据这个.java文件中类的数量不同,产生几个.class文件,这个与C++中一个编译单元产生一个.object文件不同。
c)如果两个.java文件都包含一个相同的类如Test,那么这两个java文件编译后,只能产生一个Test.class,谁后编译属于谁。
d)一个有效的程序就是一系列的class文件,它们可以封装和压缩到一个jar文件。
②运行(3种可能):
有的时候,三种方式同时使用。至少i>和ii>是同时使用的,iii>需要程序员手工指定。
i>由JVM逐条解释执行。
因为代码编译后不能直接运行,它是解释运行再JVM上,所以是半解释型。不同平台下JVM虚拟机的细节实现是不同的,所以才能适应不同的平台。
ii>部分代码可能由JIT翻译为目标机器指令直接执行;
以method为翻译单位,还会保存起来,第二次执行就不用翻译了。
现在的JVM为了效率,有一些JIT优化。JIT编译启用时,JVM读入.class文件解释后,将其发给JIT编译器。JIT编译器直接将bytecode编译为本机机器代码。所以是编译型,没有必要纠结它是编译型还是解释型。
iii>RTSJ。继JAVAC之后执行AOT二次编译,生成静态的目标平台代码。(典型的是:IBM WebSphere Real Time)
RTSJ(Real time specification for java):实时规范。
3,其他语言
解释性语言:HTML、XML、Javascript、C#
编译性语言:C/C++、Pascal/Object Pascal(Delphi)