编译器和解释器的执行过程

- 相同点:都会进行【词法分析】【语法分析】==> 生成
AST
(抽象语法树) - 不同点:编译器会讲
AST
进行代码优化之后,直接编译成能够机器识别直接执行的二进制文件;而解释器会讲AST
转化成字节码,然后由解释器解释执行。 -
一般而言,二进制代码的执行效率更高,但是相比字节码会占用二进制文件会占用更大的内存。
字节码和机器码占用空间对比 图片来源:极客时间
关于AST
一种描述语言结构的树形数据结构。
在线查看js
代码生成的 AST
https://resources.jointjs.com/demos/javascript-ast
AST
有很多广泛的应用,比如前端中重要的工具Babel
和ESlint
都使用到了AST
;
一段javascript
代码是如何被引擎执行的

- 解释器
Ignation
将源代码 转换成AST
,最终生成字节码。 - 然后开始解释执行字节码
- 返回执行的代码(HotSpot),会被编译器
Turbofan
(涡轮)编译成机器码,提升执行效率。
V8 的解释器和编译器的取名也很有意思。解释器 Ignition
是点火器的意思,编译器 TurboFan
是涡轮增压的意思,寓意着代码启动时通过点火器慢慢发动,一旦启动,涡轮增压介入,其执行效率随着执行时间越来越高效率,因为热点代码都被编译器 TurboFan 转换了机器码,直接执行机器码就省去了字节码“翻译”为机器码的过程。
JIT技术

很多语言引擎都使用了JIT 技术, 比如:java和Python 的虚拟机,还有当前非常火爆的移动跨平台方案 Flutter
就是在开发阶段使用JIT
,生产阶段使用AOT
。
额外说下,有些大厂利用JIT
特性来实现热更新,其一个非常重要的前置条件就是JIT
的一定程度上的高效性。
网友评论