图解 Google V8
李兵
前盛大创新院高级研究员
26763 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

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

执行JavaScript代码
模拟实际计算机的功能
编译为机器代码
作用域
AST
权衡策略
混合使用编译器和解释器
高级语言需要编译或解释执行
CPU执行机器代码
虚拟机
其他采用JIT技术的虚拟机
反优化操作
优化编译器
监控热点代码
解释执行字节码
生成字节码
结构化JavaScript代码
基础环境准备
JIT技术
高级代码的编译和执行
编译和执行
用于Chrome浏览器和Node.js
开源JavaScript引擎
由Google开发
课后思考
JavaScript代码执行流程
执行流程
V8
V8执行JavaScript代码的流程

该思维导图由 AI 生成,仅供参考

你好,我是李兵。
今天是我们整个课程的第一讲,我会从一个高层的宏观视角来解释什么是 V8,以及 V8 又是怎么执行一段 JavaScript 代码的。在这个过程中,我会引入一些核心概念,诸如 JIT、作用域、词法环境、执行上下文等,理解了这些概念,能够帮助你更好地理解 V8 是如何工作的,同时也能帮助你写出更加高效的 JavaScript 代码。
由于本节的目的是对 V8 做一个宏观的、全面的介绍,其目的是让你对 V8 的执行流程有个整体上的认识,所以涉及到的概念会比较多,如果你对其中一些概念不太理解也没有关系,在后面的章节中我会展开了详细地介绍。

什么是 V8?

首先我们来看看什么是 V8。
V8 是一个由 Google 开发的开源 JavaScript 引擎,目前用在 Chrome 浏览器和 Node.js 中,其核心功能是执行易于人类理解的 JavaScript 代码。
V8执行JavaScript
那么 V8 又是怎么执行 JavaScript 代码的呢?
其主要核心流程分为编译和执行两步。首先需要将 JavaScript 代码转换为低级中间代码或者机器能够理解的机器代码,然后再执行转换后的代码并输出执行结果。
转换为中间代码
你可以把 V8 看成是一个虚构出来的计算机,也称为虚拟机,虚拟机通过模拟实际计算机的各种功能来实现代码的执行,如模拟实际计算机的 CPU、堆栈、寄存器等,虚拟机还具有它自己的一套指令系统。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

V8是Google开发的开源JavaScript引擎,采用混合编译执行和解释执行的JIT技术。文章深入解析了V8执行JavaScript代码的内部机制,包括基础环境准备、生成抽象语法树(AST)、作用域和字节码生成、解释执行和优化编译等过程。通过实际代码追踪,读者可以了解V8处理JavaScript代码的详细步骤。V8采用了解释执行和编译执行的权衡策略,启动时采用解释执行,但对频繁执行的代码进行优化编译。文章还提到了JavaScript动态语言的特点,以及优化后代码失效时的反优化操作。总体而言,本文对于想深入了解JavaScript引擎工作原理的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《图解 Google V8》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(85)

  • 最新
  • 精选
  • 零维
    置顶
    想知道如何安装v8的同学可以参考这个链接:https://gist.github.com/kevincennis/0cd2138c78a07412ef21

    作者回复: 赞

    2020-05-05
    3
    41
  • 灰的更高
    老师,我有一个疑问。因为我看过了网上很多的关于v8编译的文章包括《WebKit技术内幕》这本书写道v8和javascriptcore的最重要的区别就是,v8不再将AST转成字节码或者是中间代码,而是直接转为本地代码,但在您的课程里面,好像很重要的一点就是AST转成了字节码文件,请老师能够答疑以下,谢谢

    作者回复: 那是初期的v8,的确这么做的,后面发现这种方式不太适应移动网络,于是有彻底重构了代码。

    2020-05-11
    49
  • pedro
    著名的还有JVM以及luajit,包括oracle最新的graalVM都已经采用了JIT技术。

    作者回复: 知道的真够广的哈

    2020-03-16
    40
  • 翰弟
    老师 全局执行上下文和全局作用域啥关系呢

    作者回复: 执行上下文是运行代码时的基础环境,包括了变量环境,词法环境,this值,外部环境等内容。 全局执行上下文就是指全局代码执行时的运行环境。 而作用域是一个抽象概念,它主要引用了执行上下文中的变量,以方便查找。 如果全局执行上下文中有块级作用域: let a=1 { let b =7 } 比如执行上面这样的代码,当执行到大括号里面时,全局执行上下文只有一个,但是作用域却有两个

    2020-05-21
    27
  • 花生
    可以使用 jsvu 来安装 js 引擎 1. 全局安装 jsvu: npm install jsvu -g 2. 将~/.jsvu路径添加到系统环境变量中:export PATH="${HOME}/.jsvu:${PATH}" 3. 可以直接通过命令参数指定: jsvu --os=mac64 --engines=v8-debug。

    作者回复: 赞

    2020-06-02
    2
    16
  • 我来人间一趟
    老师 我有一点疑惑 就是解释器编译出的字节码 v8可以直接执行字节码 但是v8不过是模拟计算机执行嘛 最后都是要靠计算机的cpu和其他基础设施执行呀 如果这样的话 v8执行字节码是不是也会将字节码编译成机器吗执行呢?

    作者回复: 最终都是执行二进制代码,但是解释器是按照它自己的规则来执行的,并不需要再将字节码再转换为二进制代码!

    2020-04-29
    9
    11
  • 流乔
    请问老师,我想使用D8这个工具,我该如何操作?要下载源码编译吗?

    作者回复: 从源码编译出来的,不过我可以编译一个放上来,稍晚点我我提供一个d8

    2020-03-18
    2
    9
  • 无名
    D8这个工具怎么编译在Mac下?或者是有现成的吗?

    作者回复: brew install v8

    2020-05-20
    2
    6
  • 杨越
    d8在哪用呢,在控制台上用不了

    作者回复: d8是通过v8源码编译出来的,你也可以使用node来打印部分信息

    2020-03-17
    6
  • 流浪地球
    请问老师是否可以把v8的源码构建环境搭建,构建和相关命令执行的知识做下介绍。

    作者回复: 这个v8官网就有

    2020-03-17
    3
    5
收起评论
显示
设置
留言
85
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部