【Java学习】java语言的执行模式--半编译和半解释型

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,其他语言

  解释性语言:HTMLXMLJavascript、C#
  编译性语言:C/C++、Pascal/Object Pascal(Delphi)


你可能感兴趣的:(java学习)