4 min read
我不知道的 V8 — 系列导读与阅读路径
《我不知道的 V8》系列导读、阅读路径与文章索引。
文章数量: 17 篇
阅读路径
根据不同背景选择入口:
如果想系统学习: 按编号 01 → 17 顺序阅读
如果只关心性能优化: 重点看 01、03、05、06、07、09、10
如果在调试异步问题: 重点看 12、13、14、15
章节目录
第一组:编译与执行流程
| # | 文章 | 核心内容 |
|---|---|---|
| 01 | 从源码到执行:引擎的完整旅程 | 解析→字节码→JIT 完整链路,去优化机制 |
| 02 | 函数是如何变得”可调用”的 | JSFunction 内部结构,[[Call]] 机制,调用栈 |
第二组:对象与属性存储
| # | 文章 | 核心内容 |
|---|---|---|
| 03 | 为什么字典是”非线性”数据结构 | 线性 vs 非线性,快属性 vs 慢属性,哈希表原理 |
| 04 | 隐藏类、快属性与慢属性:对象性能的核心 | 隐藏类演变,Transitions,属性添加顺序的影响 |
| 05 | 为什么不建议使用 delete | delete 的内部步骤,隐藏类分裂,替代方案 |
| 06 | prototype 和 proto 的本质区别 | JSFunction vs JSObject,myNew 实现,原型链查找 |
| 07 | 函数内联:TurboFan 最重要的优化手段 | 内联触发条件,调用栈帧结构,去优化 |
| 08 | 字典模式下的非线性优化与限制 | NameDictionary 实现细节,哈希冲突,IC 对字典模式的支持 |
第三组:作用域与解析
| # | 文章 | 核心内容 |
|---|---|---|
| 09 | 词法作用域与执行上下文:静态与动态的协作 | LexicalEnvironment,ScopeInfo,闭包与 Context 分配 |
| 10 | 1 + “2” 为什么等于 “12”:类型转换的底层逻辑 | ECMAScript 加法规范,ToPrimitive,字节码实现 |
| 11 | 惰性解析:V8 如何用”按需编译”提升启动速度 | PreParser,惰性策略,上下文分配 vs 栈分配 |
第四组:运行时优化
| # | 文章 | 核心内容 |
|---|---|---|
| 12 | 内联缓存:属性访问如何变成 O(1) 直接读 | IC 状态(单态/多态/超多态),IC 与 TurboFan 协作 |
第五组:事件循环与异步
| # | 文章 | 核心内容 |
|---|---|---|
| 13 | 宏任务的调度逻辑:事件循环的主干 | FIFO 宏任务队列,与渲染的关系,长任务分批 |
| 14 | 微任务:执行时机、优先级与底层实现 | MicrotaskQueue,PerformMicrotaskCheckpoint,queueMicrotask 生产用法 |
| 15 | MutationObserver:以微任务驱动的 DOM 监听 | 异步批量回调,MutationRecord,DocumentFragment 优化 |
| 16 | async/await:状态机、伪协程与微任务调度 | 状态机转换,await 的”暂停”本质,并行优化 |
第六组:内存管理
| # | 文章 | 核心内容 |
|---|---|---|
| 17 | 垃圾回收:Scavenge、Mark-Sweep-Compact 与增量优化 | 新生代/老生代,复制算法,增量标记,并行 GC |