Interpreter JIT AOT

Interpreter JIT AOT是三种程序运行模式。需要明白一个大前提:CPU只能执行机器码指令。

首先给大家引入Interpreter和Compiler这两个概念。

Interpreter表示解释器,程序运行中通过对高级语言解释一行执行一行来实现运行(如JavaScript),亦或者将高级代码转变为性能更高的中间码再执行(如php的opcode)。JavaScript是非常典型的解释型语言,你修改一下本地html中的JavaScript,然后直接刷新浏览器就可以看到结果。因此解释器的第一个优点就是构造简单,你不需要掌握什么计算机原理就能写代码,写JavaScript的时候有个记事本就行,什么额外的环境都不需要安装,所以JavaScript是很多学校的入门语言;它的另一个优点就是代码与硬件平台无关,你写的代码可以在任何带解释器的平台上运行,浏览器依然是最好的例子。当然其不足之处就是因为每次运行都要解释,导致效率低下,无法实现cpu密集运算的应用。

Compiler表示编译器,把高级语言编译成可直接执行的机器码,因此其运行效率远高于解释器。编译器又分为两大类:JIT和AOT。

AOT(Ahead Of Time),叫作静态编译器,通过ahead这个单词可以辨别它是在程序运行前编译,直接生成机器码,运行的时候执行机器码即可,这样可以保证最大化效率。世界上性能最高的语言就是基于AOT的,对,我说的就是C和C++。AOT的缺点之一是如果要在多个硬件平台上运行(比如x86、x64、arm),那么需要在每个平台下重新进行编译才可以使用;另一个缺点是占用空间比较大,当然在这个动不动以T为单位存储的年代,这缺点根本不算什么了。因此AOT也是典型的空间换时间的手法。

JIT(Just In Time),叫作动态编译器,通过Just这个单词可以辨别它是在程序运行的过程中编译。话说前面有性能最强大的AOT了,还要这个干甚?你还记得一句广告词嘛?一次编译到处运行,对我说的就是JAVA。一个jar的helloworld能让你在手机、pc、服务器横行,你无须考虑运行平台的问题。它是通过在不同平台的jit虚拟机实现一边编译一边运行。JIT并不一定是执行一行编译一行,假设每行代码只执行一次,那么极有可能这种方式比解释器还慢- -#,因此产生了methodbased jit、trace based jit、region based jit这几种编译策略,来实现接近AOT的性能,由于篇幅有限不在这里细说。编译策略的存在往往意味着JIT会捆绑解释器一起使用,以保证没有编译的部分依然可以正常执行(比如methodbased jit只有同一个方法执行多次才会进行编译,否则交由解释器执行)。近似AOT的强大性能,和拥有强大可移植性就是JIT存在的意义。UNITY3D是非常有代表性的JIT产品。

提问:PHP为什么是最好的语言?

Leave a Reply

Your email address will not be published. Required fields are marked *