《图解 Google V8》设计思想篇——学习笔记(一)

这是《图解 Google V8》第一篇/共三篇:设计思想篇

这个专栏的优点是:写的通俗易懂,没有涉及 V8 源码部分,对于前端还是比较友好的,学完之后能够知道写下一段 js 代码后,V8 背后都做了哪些事情

这个专栏的不足之处是:没有对技术进行深入讲解,只讲了这个技术是用来解决什么问题的,以及它是怎么工作的

所以这个专栏比较时候对 V8 还不了解的同学去学习,增加自己的知识面

下面是我自己学习每一章的总结,主要记录我在这章中学到内容,并不是对这章完整的总结

如何学习谷歌高性能 JavaScript 引擎 V8?

V8 主要涉及三个技术:编译流水线、事件循环系统、垃圾回收机制

  1. V8 执行 JavaScript 完整流程称为:编译流水线
    编译流水线

    编译流水线涉及到的技术有:

    • JIT
      • V8 混合编译执行和解释执行
    • 惰性解析
      • 加快代码启动速度
    • 隐藏类(Hide Class)
      • 将动态类型转为静态类型,消除动态类型执行速度慢的问题
    • 内联缓存
  2. 事件循环系统

    • JavaScript 中的难点:异步编程
    • 调度排队任务,让 JavaScript 有序的执行
  3. 垃圾回收机制

    • 内存分配
    • 内存回收

01 | V8 是如何执行一段 JavaScript 代码的?

  1. 准备基础环境:
    • 全局执行上下文:全局作用、全局变量、内置函数
    • 初始化内存中的堆和栈结构
    • 初始化消息循环系统:消息驱动器和消息队列
  2. 结构化 JavaScript 源代码
    • 生成抽象语法树(AST
    • 生成相关作用域
  3. 生成字节码:字节码是介于 AST 和机器码的中间代码
    • 解释器可以直接执行
    • 编译器需要将其编译为二进制的机器码再执行
  4. 解释器和监控机器人
    • 解释器:按照顺序执行字节码,并输出执行结果
    • 监控机器人:如果发现某段代码被重复多次执行,将其标记为热点代码
  5. 优化热点代码
    • 优化编译器将热点代码编译为机器码
    • 对编译后的机器码进行优化
    • 再次执行到这段代码时,将优先执行优化后的代码
  6. 反优化
    • JavaScript 对象在运行时可能会被改变,这段优化后的热点代码就失效了
    • 进行反优化操作,给到解释器解释执行

02 | 函数即对象:一篇文章彻底搞懂 JavaScript 的函数特点

V8 内部为函数对象添加了两个隐藏属性:namecode

  • name 为函数名
    • 如果是匿名函数,nameanonymous
  • code 为函数代码,以字符串的形式存储在内存中

当执行到一个函数调用语句时,V8 从函数对象中取出 code 属性值,然后解释执行这段函数代码

什么是闭包:将外部变量和函数绑定起来的技术

参考资料:

  1. The story of a V8 performance cliff in React

03 | 快属性和慢属性:V8 是怎样提升对象属性访问速度的?</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值