JavaScript是解释型语言--V8、JIT,干货

本文详细介绍了V8引擎的工作流程,包括将JavaScript源码转化为抽象语法树(AST),然后通过Ignition解释器和TurboFan编译器进行优化编译,最终生成机器代码。文章还着重讲述了JIT编译原理和V8的混合模式优化策略,以及esbuild在前端构建中的地位。
摘要由CSDN通过智能技术生成
  1. Parser:将 JavaScript 源码转换为 Abstract Syntax Tree (AST);

  2. Ignition:解释器,将 AST 转换为 Bytecode,解释执行 Bytecode;同时收集 TurboFan 优化编译所需的信息,比如函数参数的类型;

  3. TurboFan:编译器,利用Ignitio所收集的类型信息,将Bytecode转换为优化的汇编代码(计算机可识别);

  4. Orinoco:垃圾回收,负责将程序不再需要的内存空间回收。

整个转换过程:JavaScript ==> AST ==> Bytecode ==> Machine Code

关于 v8 引擎是如何工作的,可以看 这篇文章

V8 出现之前,所有的 JavaScript 虚拟机所采用的都是解释执行的方式,这是 JavaScript 执行速度过慢的主要原因之一。而 V8 率先引入了即时编译(JIT)双轮驱动的设计(混合使用编译器和解释器的技术),这是一种权衡策略,给 JavaScript 的执行速度带来了极大的提升。

绝大多数编译器以预先编译(AOT)或实时编译(JIT)形式工作。

  • 使用命令行或者集成开发环境(IDE)调用预先编译(AOT)的编译器,如 gcc
  • 实时编译器通常是用来提高性能的,令你没有感知的,如 V8

即时编译 JIT(Just-in-time)

解释器的工作方式:边解释,边执行。 对于循环等会存在解释多次的情况。从而导致运行速度变慢。

for (let i = 0; i < len; i++) {

doSomething(i)

}

整体来说,为了解决解释器的低效问题,后来的浏览器把编译器也引入进来,形成混合模式。最终,结合了解释器和编译器的两者优点。

They added a new part to the JavaScript engine, called a monitor (aka a profiler). That monitor watches the code as it runs, and makes a note of how many times it is run and what types are used.

关于 JIT 的原理,大部分来自 这篇文章,英文好的同学可自行跳转查阅。

基本思想: 在 JavaScript 引擎中增加一个监视器(也叫分析器)。监视器(monitor)监控着代码的运行情况,记录代码一共运行了多少次、如何运行的等信息。后续遇到相同代码时,跳过解释,直接执行。

执行步骤

第一步:Interpreter

使用解释器执行,当某一行代码被执行了几次,这行代码会被打上 Warm 的标签;当某一行代码被执行了很多次,这行代码会被打上 Hot 的标签

第二步:Baseline compiler

被打上 Warm 标签的代码会被传给 Baseline Compiler 编译且储存,同时按照行数 (Line number)变量类型 (Variable type) 被索引。当发现执行的代码命中索引,会直接取出编译后的代码给浏览器执行,从而不需要重复编译已经编译过的代码。

第三步:Optimizing compiler

被打上 Hot 标签的代码会被传给 Optimizing compiler,这里会对这部分带码做更优化的编译(类型假设)。在执行前会做类型检查,看是假设是否成立,如果不成立执行就会被打回 interpreter 或者 baseline compiler 的版本,这个操作叫做 “去优化”。

JIT 会增加多余的开销:

  • 优化和去优化开销

  • 监视器记录信息对内存的开销

  • 发生去优化情况时恢复信息的记录对内存的开销

  • 对基线版本和优化后版本记录的内存开销

所以,整体来看是一个空间换时间的优化方案。当然,通过上述三个步骤,可得知,虽然 JavaScript 是弱类型语言,随意修改变量的类型会导致 JIT 编译效率下降(命中索引概率低)。

说在后面

对于整个解释型语言及现有的相关优化方式(JIT)了解之后,对于后续文章要提到的 esbuild 会有更好的理解。esbuild 也被称为下一代构建工具(使用 Go 语言编写,基于 ESM)。coming soon~~

esbuild:An extremely fast JavaScript bundler

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

推荐一些系统学习的途径和方法。

路线图

每个Web开发人员必备,很权威很齐全的Web开发文档。作为学习辞典使用,可以查询到每个概念、方法、属性的详细解释,注意使用英文关键字搜索。里面的一些 HTML,CSS,HTTP 技术教程也相当不错。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

HTML 和 CSS:

html5知识

css基础知识

-blog.csdnimg.cn/img_convert/2ee0d943c2e65e1bf84360c1c8a40cf6.png)

css基础知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值