opcodecache与JIT之间有哪些区别
内容导读
收集整理的这篇技术教程文章主要介绍了opcodecache与JIT之间有哪些区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2992字,纯文字阅读大概需要5分钟。
内容图文
本篇文章主要讲述的是opcode cache与JIT的区别,具有一定学习价值,感兴趣的朋友可以了解一下,希望对你能有所帮助。要说明opcode cache与JIT的区别,得先明白,字节码,又叫中间码与机器码的区别。
操作码(opcode)
一条机器指令。比如我们汇编语言写的一条操作语句。
机器码(machine code)
学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。
机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。
而且机器码不支持跨平台,简单点将就是不同的CPU使用的机器码是不一样的。
字节码(bytecode)
是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。
字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java bytecode,那PHP的就是一系列opcode组成的二进制文件。
字节码在运行时通过虚拟机(JAVA的JVM,PHP的Zend虚拟机)做一次转换, 生成机器指令, 因此能够更好的跨平台运行。
字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
通过介绍我们可以看到,CPU只能执行机器码,但为了实现应用跨硬件平台,我们就为不同的编程语言实现了一个虚拟机,而这个虚拟机将我们写的代码编译成二进制代码(文件),这个二进制代码就叫字节码,也叫中间码。Zend虚拟机编译好的字节码就叫opcode(其实是一系列opcode)。
接下来咱们再介绍opcode cache与JIT。
JIT
目前PHP还没有引入JIT技术,不过鸟哥说在下一个大版本的 PHP 可能带来JIT新特性。让我们拭目以待吧!不过JIT在JAVA生态中是很成熟的技术了,所以就说说JAVA的JIT。
JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 Java 程序的执行速度。
通常通过 javac 将程序源代码编译,转换成 java 字节码,JVM 将字节码其翻译成对应的机器指令(机器码),逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多。为了提高执行速度,引入了 JIT 技术。
JIT 把翻译过的机器码保存起来,以备下次使用(这里面肯定有个类似与LRU的算法)。可见JIT要做的很简单,就是把中间码翻译成的机器码暂时(保存多久,怎么选择这里不做介绍)保存起来,这样再用到这个机器码的时候,就少了一次翻译。
opcode cache
光听名字就知道,就是将中间码(一系列opcode组成的二进制文件)缓存起来,引用官网的话:OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.
那说说为什么需要opcode cache?
PHP代码的生命周期
从PHP解析器执行一个PHP脚本,到输出脚本内容,主要经历五个步骤:Zend引擎读取文件,词法分析,语法分析与语义分析、创建要中间码,执行中间码,如下图
每一次请求PHP脚本都会执行一遍以上步骤。如果PHP代码没有变化,那么opcode也不会变化,显然没有必要每次都生成opcode,于是我们可以把编译好的opcode缓存下来,以后如果PHP代码没有变,就直接访问缓存中编译好的opcode。
启用opcode缓存之后的流程图如下所示:
总结
简单点描述JAVA的JIT是用来缓存CPU执行的机器码的,opcode cache是用来缓存Zend虚拟机用的中间码的。
以上就是opcode cache与JIT之间有哪些区别的详细内容,更多请关注Gxl网其它相关文章!
内容总结
以上是为您收集整理的opcodecache与JIT之间有哪些区别全部内容,希望文章能够帮你解决opcodecache与JIT之间有哪些区别所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。