V8引擎学习笔记
看了【【干货】8分钟带你了解V8引擎是如何运行JS!都2020年了还不知道什么是V8?】 https://www.bilibili.com/video/BV1zV411z7RX/?share_source=copy_web&vd_source=6373ee1014cf4aadcc26bb908b07b368
虽然视频是8分钟,但是带来的信息量挺大,同时给了我进一步深入研究的线索。
早期V8引擎编译:
JS → 解析器 解析 → AST → Full-codegen 编译器 → 机器代码
V8引擎分析器 线程收集足够数据并帮助 Crankshaft (又称为优化编译器)来做代码优化: 解析器重新生成AST,Crankshaft再生成优化后的机器代码。
存在的问题:1.生成的机器码占用大量内存 2.缺少中间层机器码 3.无法很好支持和优化JS新语法特性
新V8引擎编译:
JS → 解析器 解析 → AST → igniton 基准解释器 → bytecode字节码 (直接被解释器执行)
TurboFan 优化编译器 根据收集的类型信息优化 → 经过优化的机器代码
某些情况可能会将机器代码 deoptimization 为 bytecode (igniton解释器可能会)
一些优化策略:
- 函数只声明未调用,不会生成ast
- 函数只被调用1次,butecode直接被解释执行
- 函数被多次调用,可能会被标记为热点函数,可能会被编译成机器代码
参考文献:
https://v8.dev/blog/launching-ignition-and-turbofan
https://zhuanlan.zhihu.com/p/73768338
https://mlib.wang/2020/02/08/v8-parser-compiler-javascript/
https://segmentfault.com/a/1190000022062181
在一篇文章中看到bellard这个传奇程序员:https://bellard.org/