JIT的理解
编译和解释的区别。
jdk8函数式编程
23种设计模式,是道与术的结合体
我理解的java程序执行步骤:
首先javac编译器将源代码编译成字节码。
然后jvm类加载器加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度相对会比较慢。有些方法和代码块是高频率调用的,也就是所谓的热点代码,所以引进jit技术,提前将这类字节码直接编译成本地机器码。这样类似于缓存技术,运行时再遇到这类代码直接可以执行,而不是先解释后执行。
写个程序直接执行字节码就是解释执行。写个程序运行时把字节码动态翻译成机器码就是jit。写个程序把java源代码直接翻译为机器码就是aot。造个CPU直接执行字节码,字节码就是机器码。
这种基于运行分析,进行热点代码编译的设计,是因为绝大多数的程序都表现为“小部分的热点耗费了大多数的资源”吧。只有这样才能做到,在某些场景下,一个需要跑在运行时上的语言,可以比直接编译成机器码的语言更“快”。
对,看到本质了。
解释执行和编译执行有何区别?
类比一下,一个是同声传译,一个是放录音。
之前看到过一个理解:编译执行就好像做了一桌子的菜,坐到餐桌就可以吃了,而解释执行就像吃火锅,需要一边等,一边吃,所以效率会慢
编译型语言:C/C++、 Pascal(Delphi)
编译就是把源代码(高级语言,人类容易读,容易理解)转换成机器码(CPU能理解,能高效的执行)
解释型语言:JavaScript、Perl、Python、Ruby
解释就简单多了,解析源代码,并且直接执行,没有编译过程
编译程序是整体编译完了,再一次性执行。 而解释程序是一边解释,一边执行
JAVA语言是一种编译型-解释型语言,同时具备编译特性和解释特性
其所谓的编译过程只是将.java文件编程成平台无关的字节码.class文件,
并不是向C一样编译成可执行的机器语言,在此请读者注意Java中所谓的“编译”和传统的“编译”的区别。
作为编译型语言,JAVA程序要被统一编译成字节码文件——文件后缀是class。此种文件在java中又称为类文件。
java类文件不能再计算机上直接执行,它需要被java虚拟机翻译成本地的机器码后才能执行,而java虚拟机的翻译过程则是解释性的。
java字节码文件首先被加载到计算机内存中,然后读出一条指令,翻译一条指令,执行一条指令,该过程被称为java语言的解释执行,是由java虚拟机完成的。
以上说的是Java的解释执行,但是比如我们大多数情况使用的Hotspot JVM,都提供了动态编译器编译器JIT,能够追踪热点代码, 然后变成机器指令,这种情况下部分热点代码就属于编译执行,而不是解释执行了
其实甭管它什么解释还是编译, 了解了底层的原理就行了
网友评论