Python先把代码编译成字节码,再对字节码解释执行。
java 编译型(请求次数多)+解释型(请求次数少)
解释性语言定义:
程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。
现代解释性语言通常把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码,一条条执行。
编译性语言定义:
编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
对比:
对编译型语言的定义:直接将原码编译为机器语言。
而python是先将原码编译为字节码,然后将字节码翻译为机器语言。 因此,python不属于编译型语言的范畴。
Python工作过程:
python 是解释型的编程语言。也可以把python脚本编译成pyc文件,不然编译后也是一种python虚拟指令,在python中运行。
Python先把代码编译成字节码,再对字节码解释执行。字节码在python虚拟机程序里对应的是PyCodeObject对象,pyc文件是字节码在磁盘上的表现形式。
pyc的创建时机是模块加载的时候,即import。
python test.py会对test.py进行编译成字节码并解释执行,但是不会生成test.pyc。
Java工作过程:
JAVA的第一道工序是javac编译,当然目标文件是BYTECODE(字节码)。后续可能有三种处理方式:
1. 运行时,BYTECODE由JVM逐条解释执行;
2. 运行时,部分代码可能由JIT翻译为目标机器指令(以method为翻译单位,还会保存起来,第二次执行就不用翻译了)直接执行;
3. RTSJ。继JAVAC之后执行AOT二次编译,生成静态的目标平台代码(典型的就是IBM WEBSHPERE REAL TIME)。
其实,现在用编译型、解释型来分类编程语言已经有点力不从心了。总体来讲,java的编译结果是被jvm“解释执行”的,所以这么说也能说通,而其实这个“是编译还是解释”这个概念在这里已经有点模糊了,理解它的过程就行了,不必下一个“精确”的定义;
而我自己仍然赞成“java是编译型语言”的说法,因为“编译”其本质就是“把一个相对高级的语言转换为另一个相对低级的语言”
字节码和机器码:
字节码和机器码(或者native code)的区别:
C代码被编译成机器码,将在处理器上直接执行。每一条指令控制CPU工作。
Java代码被编译成字节码,将在Java虚拟机(JVM)这个抽象的计算机上执行。每一条指令由JVM处理,JVM同计算机本身之间交互。
简而言之:机器码快的多,但字节码更易迁移,也更安全。
Java-JIT:
大家都知道本地机器码的速度比字节码的速度快很多。那么,如果我们能将一些字节码直接编译成本地机器码再去运行它会怎样呢?我们必须花费一些代价(比如时间)在编译字节码到本地机器码上,如果最终的运行时间更快,那么这个代价就是值得的。这就是JIT编译器的动机,一种混合了解释器和编译器好处的技术。简单来讲,JIT就是想通过编译技术提升脚本解释器系统的速度。
例如, 被JIT(及时编译)采用的通用方法:标识被经常执行的字节码;把其编译成本地的机器码;缓存该结果;当同样的的字节码再次被执行的时候,会取预编译的机器码,得到好处(例如速度提升)。
PyPy:
把JIT代入Python语言 (参看前面成果的附录).当然也有其他目的: PyPy 目标是成为一个跨平台,轻内存,支持stackless(译注:stackless为python提供微线程扩展,具有并发特性)。 但是及时编译才是它真正的卖点。 基于一系列时间测试的平均, 据说性能上能提高6.27倍。
125jz网原创文章。发布者:江山如画,转载请注明出处:http://www.125jz.com/11055.html