ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JIT Just-In-Time(即时编译)

2022-05-06 03:31:14  阅读:239  来源: 互联网

标签:语言 Just 编译成 机器码 编译 JIT 源码 Time


参考:

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(即时编译)。

 

 

 

 

 

 字节码

字节码是一种中间码,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。

 

 

 

 

 

 

 

 

 

 

 

 

搜索

 

 

 

 

 

 

 

 

 

 

复制

标签:语言,Just,编译成,机器码,编译,JIT,源码,Time
来源: https://www.cnblogs.com/gamedaybyday/p/16227151.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有