参考:
b站:编译原理-哈工大
知乎:v8架构是如何一步步演进成如此成熟的架构的
cocos论坛:开挂了:iOS 14.2 开启 JIT 支持,大幅提升 JS 性能!
python变成基础:编译型语言和解释型语言的区别
看到cocos论坛说ios不支持JIT,说起JIT要从编译说起...
编译原理
cpu只能识别机器码,就是0和1,所以使用c++、java、javascript、typescript等语言写的代码最终都要变成机器码,这个高级语言变成机器语言的过程叫编译。
编译型和解释型
不同语言变成机器码的途径不同,分成了编译型和解释型语言。
编译型:C语言、C++、Golang、Pascal(Delphi)、汇编等
解释型:Python、JavaScript、PHP、Shell、MATLAB 等
编译型语言
1. 一次编译,无限运行。例如c语言编译成windows下exe文件,一次性将源码编译成机器码,exe文件包含了机器码,无需再次编译,直接运行即可。
1.可执行程序不能跨平台。不同操作系统对不同执行文件要求不同,不能将windows下执行文件拿到linux下运行。
2.代码不可跨平台。不同平台支持的函数、变量、类型不同。例如c语言windows下是Sleep()单位毫秒,Linux下是sleep()单位秒。
解释型语言:
1. 边解释,边执行。运行哪些源码,就将哪些源码转成机器码,运行多少次就重新转换多少次,所以效率很低。
2. 跨平台,一次编写,到处运行。相同的源码被不同平台的解释器解释执行,生成了对应平台的机器码。所以有了解释器这个中间层,才能将源码执行在不同的平台上。
由上述可见,要高效率就不能跨平台,要跨平台就不能高效率...
那么问题来了
1. 为什么c语言不能在编译的时候编译成不同平台机器码的执行文件呢?比如发布时选择windows、Linux、iOS等,生成对应平台的可执行文件。
不同平台支持的c语言类库不同,语法也不同,要跨就得在代码层面兼容。再者像android和iOS开发,一个java,一个Objective-C和Swift。
2. 为什么javascript不能由解释器直接解释成机器码保存起来运行呢?比如不同平台的解释器一次性将源码转成机器码,保存起来运行。
编译是个长的过程,解释型语言是马上开始执行。JIT就是运行时编译成机器码的技术。
JIT
如下图,javascript源码编译过程,先翻译成字节码,字节码边执行边编译成机器码。
在边执行边编译过程中,解释器会记录特定代码片段执行次数,如果执行次数超过某个值,就记录成hot code,通过优化编译器编译成优化机器码。
当再次执行这段代码时,不用再次编译,直接使用优化机器码,大大提高效率。
这种在运行时编译代码的技术,就叫JIT(即时编译)。
字节码
字节码是一种中间码,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
搜索
复制