这是《图解 Google V8》第一篇/共三篇:设计思想篇
这个专栏的优点是:写的通俗易懂,没有涉及 V8
源码部分,对于前端还是比较友好的,学完之后能够知道写下一段 js
代码后,V8
背后都做了哪些事情
这个专栏的不足之处是:没有对技术进行深入讲解,只讲了这个技术是用来解决什么问题的,以及它是怎么工作的
所以这个专栏比较时候对 V8
还不了解的同学去学习,增加自己的知识面
下面是我自己学习每一章的总结,主要记录我在这章中学到内容,并不是对这章完整的总结
如何学习谷歌高性能 JavaScript 引擎 V8?
V8
主要涉及三个技术:编译流水线、事件循环系统、垃圾回收机制
-
V8
执行JavaScript
完整流程称为:编译流水线
编译流水线涉及到的技术有:
- JIT
V8
混合编译执行和解释执行
- 惰性解析
- 加快代码启动速度
- 隐藏类(
Hide Class
)- 将动态类型转为静态类型,消除动态类型执行速度慢的问题
- 内联缓存
- JIT
-
事件循环系统
JavaScript
中的难点:异步编程- 调度排队任务,让
JavaScript
有序的执行
-
垃圾回收机制
- 内存分配
- 内存回收
01 | V8 是如何执行一段 JavaScript 代码的?
- 准备基础环境:
- 全局执行上下文:全局作用、全局变量、内置函数
- 初始化内存中的堆和栈结构
- 初始化消息循环系统:消息驱动器和消息队列
- 结构化
JavaScript
源代码- 生成抽象语法树(
AST
) - 生成相关作用域
- 生成抽象语法树(
- 生成字节码:字节码是介于
AST
和机器码的中间代码- 解释器可以直接执行
- 编译器需要将其编译为二进制的机器码再执行
- 解释器和监控机器人
- 解释器:按照顺序执行字节码,并输出执行结果
- 监控机器人:如果发现某段代码被重复多次执行,将其标记为热点代码
- 优化热点代码
- 优化编译器将热点代码编译为机器码
- 对编译后的机器码进行优化
- 再次执行到这段代码时,将优先执行优化后的代码
- 反优化
JavaScript
对象在运行时可能会被改变,这段优化后的热点代码就失效了- 进行反优化操作,给到解释器解释执行
02 | 函数即对象:一篇文章彻底搞懂 JavaScript 的函数特点
V8
内部为函数对象添加了两个隐藏属性:name
,code
:
name
为函数名- 如果是匿名函数,
name
为anonymous
- 如果是匿名函数,
code
为函数代码,以字符串的形式存储在内存中
当执行到一个函数调用语句时,V8
从函数对象中取出 code
属性值,然后解释执行这段函数代码
什么是闭包:将外部变量和函数绑定起来的技术
参考资料: