图解 Google V8
李兵
前盛大创新院高级研究员
立即订阅
3072 人已学习
课程目录
已完结 24 讲
0/4登录后,你可以任选4讲全文学习。
宏观视角 (2讲)
开篇词 | 如何学习谷歌高性能 JavaScript 引擎V8?
免费
01 | V8是如何执行一段JavaScript代码的?
JavaScript设计思想篇 (7讲)
02 | 函数即对象:一篇文章彻底搞懂JavaScript的函数特点
03 | 快属性和慢属性:V8是怎样提升对象属性访问速度的?
04 | 函数表达式:涉及大量概念,函数表达式到底该怎么学?
05|原型链:V8是如何实现对象继承的?
06|作用域链:V8是如何查找变量的?
07|类型转换:V8是怎么实现1+“2”的?
08|答疑:如何构建和使用V8的调试工具d8?
V8编译流水线 (8讲)
09 | 运行时环境:运行JavaScript代码的基石
10 | 机器代码:二进制机器码究竟是如何被CPU执行的?
11 | 堆和栈:函数调用是如何影响到内存布局的?
12 | 延迟解析:V8是如何实现闭包的?
13 | 字节码(一):V8为什么又重新引入字节码?
14|字节码(二):解释器是如何解释执行字节码的?
15 | 隐藏类:如何在内存中快速查找对象属性?
16 | 答疑: V8是怎么通过内联缓存来提升函数执行效率的?
事件循环和垃圾回收 (6讲)
17 | 消息队列:V8是怎么实现回调函数的?
18 | 异步编程(一):V8是如何实现微任务的?
19|异步编程(二):V8是如何实现async/await的?
20 | 垃圾回收(一):V8的两个垃圾回收器是如何工作的?
21 | 垃圾回收(二):V8是如何优化垃圾回收器执行效率的?
22|答疑:几种常见内存问题的解决策略
结束语 (1讲)
结束语 | 我的前端学习踩坑史
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

13 | 字节码(一):V8为什么又重新引入字节码?

李兵 2020-04-14
你好,我是李兵。
在第一节课我们就介绍了 V8 的编译流水线,我们知道 V8 在执行一段 JavaScript 代码之前,需要将其编译为字节码,然后再解释执行字节码或者将字节码编译为二进制代码然后再执行。
所谓字节码,是指编译过程中的中间代码,你可以把字节码看成是机器代码的抽象,在 V8 中,字节码有两个作用:
第一个是解释器可以直接解释执行字节码 ;
第二个是优化编译器可以将字节码编译为二进制代码,然后再执行二进制机器代码。
虽然目前的架构使用了字节码,不过早期的 V8 并不是这样设计的,那时候 V8 团队认为这种“先生成字节码再执行字节码”的方式,多了个中间环节,多出来的中间环节会牺牲代码的执行速度。
于是在早期,V8 团队采取了非常激进的策略,直接将 JavaScript 代码编译成机器代码。其执行流程如下图所示:
早期V8执行流水线
观察上面的执行流程图,我们可以发现,早期的 V8 也使用了两个编译器:
第一个是基线编译器,它负责将 JavaScript 代码编译为没有优化过的机器代码。
第二个是优化编译器,它负责将一些热点代码(执行频繁的代码)优化为执行效率更高的机器代码。
了解这两个编译器之后,接下来我们再来看看早期的 V8 是怎么执行一段 JavaScript 代码的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《图解 Google V8》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • leaf
    字节码是平台无关的,机器码针对不同的平台都是不一样的
    2020-04-14
    2
  • mfist
    V8的Ignition编译产生字节码,运行一段时间后发现热点代码通过turbofan优化成机器码。他们都是JavaScript执行过程的中间产物,但是字节码消除了平台差异性,机器码是针对具体某一个运行设备的优化。不知道理解对不对,请老师指正
    2020-04-14
    1
    2
  • Geek_177f82
    原文中说“由于字节码占用的空间远小于二进制代码,所以浏览器就可以实现缓存所有的字节码,而不是仅仅缓存顶层的字节码。”那么v8是否已经实现缓存所有的字节码?如果已经实现,那么是怎么实现的呢?由于惰性解析策略的限制他是怎么实现缓存所有字节码的呢?
    2020-04-21
    1
  • sugar
    提一个问题,从ignition解析器生成的字节码中发现热点代码 用turboFan进行优化,这个热点代码会是以函数闭包的维度吗?还是比这更细的粒度? 然后在chrome和node.js等常规的js运行环境里,是否有什么办法干预 或者主动告知v8 我想对哪部分代码做优化,哪部分不需要优化?
    2020-04-15
    1
  • DDBG
    老师.有没有详细讲解优化器原理的?
    2020-05-08
  • champ可口可乐了
    字节码是由V8虚拟机解释执行,是模拟物理CPU的执行过程
    机器码是直接在物理CPU上执行,速度更快。
    2020-04-19
    1
  • HoSalt
    字节码、二进制代码和文件传输中的二进制流、字节流、文本流有什么关系吗?被这些概念搞得比较晕
    2020-04-16
  • 潇潇雨歇
    同:都是编译后的代码,也就是做过处理的
    异:字节码占用内存更少,可进一步编译为机器代码,机器码执行更高效。
    2020-04-15
  • 王楚然
    思考题:
    1. 机器码可以被cpu直接解读,运行速度快。但是不同cpu有不同体系架构,也对应不同机器码。占用内存也较大。
    2. 字节码是一种中间码,占用内存相较机器码小,不受cpu型号影响。
    2020-04-15
  • 一步
    机器代码 是和具体的机器CPU型号相关的, 而字节码是 机器码上面的抽象和机器无关
    2020-04-14
  • 冯建俊
    机器代码可以被cpu直接执行,执行效率高,占用内存相对字节码多
    字节码需要解释器解释执行,执行效率低,占用内存相对机器代码少
    2020-04-14
  • 冯剑
    感觉文中表达的字节码是编译产物。字节码正常来说就是二进制文件代码,一直拿字节码和二进制代码做区别,感觉怪怪的
    2020-04-14
    1
  • yunplane
    请问:解释器可以直接解释执行字节码 ,这句话的意思是解释器解释执行字节码不需要转为二进制吗?计算机不是只能运行二进制吗?
    2020-04-14
    1
  • luckyone
    好看,真香。第一步都要转成ast?不同的话解释执行跟二进制执行,现在大多数语言都是虚拟机执行吧java c# n多动态语言。 编译的c c++ go
    2020-04-14
收起评论
14
返回
顶部