解释编译和Python、Java
编译和解释
简单来说:
- 解释性语言运行的时候需要解释器(比如Java需要JVM解释器,Python需要Python解释器),而编译性语言可以直接机器码
- 解释性语言是把一些序列(比如class文件、Pyc文件等)扔给解释器,每次运行的时候都需要预先把这些代码转化为机器码
- 说法2:每次执行都需要进行解释的语言叫做解释性语言
- 说法3:从源代码直接到结果的语言叫做解释性语言
- 编译性语言是直接生成机器码,执行的也是机器码,这个没有歧义。
- 解释性语言是把一些序列(比如class文件、Pyc文件等)扔给解释器,每次运行的时候都需要预先把这些代码转化为机器码
- 由于编译器已经生成机器码,而机器码因为生产厂商不同所以代码无法跨平台。而解释语言由于使用解释器,所以可以比较容易进行跨平台。
- 大多数的语言是混合的,界限比较难进行区分。网上有说法是Java是半解释语言、解释性语言的,也有混合的。但是公认的是:Python是解释性语言。
- 大多数解释语言是动态类型的、比较慢,大部分静态类型语言都是半编译或者编译语言,速度比较快。
- 在编译和解释的时候,之前和之后都有很多步骤,比如类的加载、各种优化,实现非常复杂。
Java
-
Java需要编译器(Javac)把源代码转化为字节码,然后解释器(java.exe)转化为机器码
-
这个说法很奇怪:
- 狭义的编译是生成机器码的,但是Javac生成的是中间的字节码
- 狭义的解释是代码->结果,而java是字节码->结果
-
Java预先编译是存在的,可以提高执行的速度,省去了源代码->字节码的时间消耗。
-
Java编译成为字节码文件,然后用解释器解释。所以理论上他既需要编译(需要编译成字节码)也需要解释。
-
网络的定义的话,Java是半编译语言或者混合语言、解释语言,各种不同。
-
-
一份源代码生成的字节码是一致的,但是硬件不同解释器不同,生成的机器码也不同。这么做是为了更好的跨平台。
Python
-
Python本身是解释性语言,但是他也需要Java一样源代码-字节码-机器码,所以在这个方面他本质和Java差不多。
-
但是,Python
-
-
可以不需要预先进行编译,直接源代码执行。
-
但也可以编译为pyc文件像Java一样解释执行。
- 如果生成pyc文件还是比Java慢,那就不是解释器的原因。
-
JIT技术和解释器:
以Java为例:
解释器和JIT代码生成器不是一个东西。
- 解释器是负责把字节码转化为机器码的
- JIT是为了提高执行速度把一部分热点代码直接转化为机器码,下一次运行的时候直接运行机器码。
- 字节码比源代码和字节码大,需要占用更多的内存,所以全部机器码是内存占用很高的一种选择,不合适
本质上:
- JIT不快,但是下一次执行的时候可以直接执行机器码,机器码才快。所以只有多次执行的代码JIT才有正面效益。
- 表现就是:JIT需要预热才能够提速。
更多推荐
解释和编译的区别
发布评论