浏览器中的编译器和解释器

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

编译器和解释器“翻译”代码 图片来源:极客时间
  • 相同点:都会进行【词法分析】【语法分析】==> 生成AST(抽象语法树)
  • 不同点:编译器会讲AST 进行代码优化之后,直接编译成能够机器识别直接执行的二进制文件;而解释器会讲 AST转化成字节码,然后由解释器解释执行。
  • 一般而言,二进制代码的执行效率更高,但是相比字节码会占用二进制文件会占用更大的内存。


    字节码和机器码占用空间对比 图片来源:极客时间

关于AST

一种描述语言结构的树形数据结构。

在线查看js代码生成的 AST
https://resources.jointjs.com/demos/javascript-ast

AST有很多广泛的应用,比如前端中重要的工具BabelESlint都使用到了AST;

一段javascript代码是如何被引擎执行的

V8 执行一段代码流程图 图片来源:极客时间
  1. 解释器Ignation 将源代码 转换成AST,最终生成字节码。
  2. 然后开始解释执行字节码
  3. 返回执行的代码(HotSpot),会被编译器Turbofan(涡轮)编译成机器码,提升执行效率。

V8 的解释器和编译器的取名也很有意思。解释器 Ignition 是点火器的意思,编译器 TurboFan 是涡轮增压的意思,寓意着代码启动时通过点火器慢慢发动,一旦启动,涡轮增压介入,其执行效率随着执行时间越来越高效率,因为热点代码都被编译器 TurboFan 转换了机器码,直接执行机器码就省去了字节码“翻译”为机器码的过程。

JIT技术

即时编译(JIT)技术 图片来源:极客时间

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

你可能感兴趣的:(浏览器中的编译器和解释器)