V8是如何执行JavaScript代码的?

这篇具有很好参考价值的文章主要介绍了V8是如何执行JavaScript代码的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

一般来讲,电脑是不能直接运行我们的javascript代码的,它需要一个翻译程序将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言。目前市面上有很多种 JavaScript 引擎,诸如 SpiderMonkey、V8、JavaScriptCore 等。而由谷歌开发的开源项目 V8 是当下使用最广泛的 JavaScript 虚拟机,全球有超过 25 亿台安卓设备,而这些设备中都使用了 Chrome 浏览器,所以我们写的 JavaScript 应用,大都跑在 V8 上。

如果这篇文章有帮助到你,❤️关注+点赞❤️鼓励一下作者,文章公众号首发,关注 前端南玖 第一时间获取最新文章~

什么是V8

在 V8 出现之前,所有的 JavaScript 虚拟机所采用的都是解释执行的方式,这是 JavaScript 执行速度过慢的一个主要原因。而 V8 率先引入了即时编译(JIT)的双轮驱动的设计,这是一种权衡策略,混合编译执行和解释执行这两种手段,给 JavaScript 的执行速度带来了极大的提升。通俗点理解就是:V8是一个高性能的JavaScript解析执行引擎

V8是如何执行JavaScript代码的?

对与很多开发者来说,V8就像是一个黑盒,我们将一段代码丢给这个黑盒,它便会返回结果,我们只知道V8 的主要职责是用来编译执行 JavaScript 代码的,并没有深入了解过它的工作原理。

下面我们就来深入了解一下V8到底是如何执行JavaScript代码的。

为什么需要编译这一过程?

我们先从 CPU 是怎么执行机器代码讲起,你可以把 CPU 看成是一个非常小的运算机器,我们可以通过二进制的指令和 CPU 进行沟通,比如我们给 CPU 发出“1000100111011000”的二进制指令,这条指令的意思是将一个寄存器中的数据移动到另外一个寄存器中,当处理器执行到这条指令的时候,便会按照指令的意思去实现相关的操作。为了能够完成复杂的任务,工程师们为 CPU 提供了一大堆指令,来实现各种功能,我们就把这一大堆指令称为指令集(Instructions),也就是机器语言。

CPU 能直接识别汇编语言吗?

显然是不行的,如果你使用汇编编写了一段程序,你还需要一个汇编编译器,其作用是将汇编代码编程成机器代码

计算机执行高级语言的基本方式

一般来讲,计算机执行高级语言的方式有以下两种:

解释执行

改方式需要先将输入的源代码通过解析器编译成中间代码,之后直接使用解释器解释执行中间代码,然后直接输出结果。

V8是如何执行JavaScript代码的?

编译执行

采用这种方式时,也需要先将源代码转换为中间代码,然后我们的编译器再将中间代码编译成机器代码。通常编译成的机器代码是以二进制文件形式存储的,需要执行这段程序的时候直接执行二进制文件就可以了。还可以使用虚拟机将编译后的机器代码保存在内存中,然后直接执行内存中的二进制代码。

V8是如何执行JavaScript代码的?

即便是JavaScript一门语言,也有好几种流行的虚拟机,它们之间的实现方式也存在着部分差异,比如Chrome使用的是V8虚拟机,Safari使用的是JavaScript Core虚拟机,而Firefox则使用的是TraceMonkey虚拟机。

V8是如何执行JavaScript代码的?

作为JavaScript的主流虚拟机,V8是如何编译执行JavaScript代码的呢?它采用的是我们上面介绍的解释执行、编译执行中的哪一种呢?

解释执行的启动速度快,但是执行速度比较慢,而编译执行的启动速度慢,但是执行速度比较快,所以为了权衡两种方法各自的优缺点,V8采用的是两种方法结合的方式进行编译执行JavaScript代码。

V8执行JavaScript代码流程图

V8是如何执行JavaScript代码的?

  • 从这张图的左侧部分我们可以看出,V8在启动执行JavaScript代码之前,它需要初始化好执行环境,这些环境包括:堆空间栈空间全局执行上下文全局作用域循环系统♻️内置函数等,这些内容都是在JavaScript执行过程中需要使用到的。
  • 在初始化完执行环境后,就可以向V8提交需要执行的JavaScript代码了。
  • V8在接收到JavaScript代码后,并不会立即执行,因为V8并不能直接理解JavaScript代码的含义,这对于它来说只不过就是一段字符串而已。它需要将代码结构化生成抽象语法树(AST),在生成抽象语法树的同时,V8还会生成相应的作用域。
  • 有了AST和作用域后,就可以生成字节码了,字节码是介于AST和机器代码之间的中间代码。
  • 生成字节码后,解释器就会按照顺序解释执行字节码,并输出执行结果。
  • 解释器在执行字节码的过程中,如果发现某段代码被多次重复执行,那么这段代码就会被标记成热点代码。
  • 当某段代码被标记成热点代码后,V8就会将这段代码交给优化编辑器,优化编辑器会在后台将字节码编译为二进制代码,然后再对编译后的二进制代码进行优化操作,优化后的二进制机器代码的执行效率就会大幅提升。

总结

由于计算机只能识别二进制指令,所以一般需要将高级代码编译成计算机能够识别的二进制指令才能执行,一般有两种方法:编译执行和解释执行。

两种方法各有优缺点,所以V8采用了一种权衡策略,在启动时采用解释执行的策略,但是如果某段代码的执行频率超过某个值,V8就会采用优化编译器将其编译成执行效率更高的机器代码。

V8执行JavaScript代码的主要流程:文章来源地址https://www.toymoban.com/news/detail-479797.html

  • 初始化执行环境
  • 解析JavaScript代码生成AST和作用域
  • 根据AST和作用域生成字节码
  • 解释执行字节码
  • 监听热点代码
  • 优化热点代码为二进制的机器代码
  • 优化生成二进制机器代码

到了这里,关于V8是如何执行JavaScript代码的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中使用execjs执行JavaScript代码:方法与常见错误解决方案

     简介和背景:          execjs 库的作用和重要性是在Python中执行JavaScript代码。它允许开发者在Python环境下调用JavaScript逻辑和功能,从而实现Python与JavaScript之间的交互。通过 execjs ,Python开发者可以利用JavaScript的强大功能和现有库,拓展Python应用的能力,实现跨语言的灵

    2024年02月10日
    浏览(34)
  • [javascript核心-08] V8 内存管理机制及性能优化

    V8 本身也是程序,它本身也会申请内存,它申请的内存称为常驻内存,而它又将内存分为堆和栈 栈内存介绍 栈用于存放JS 中的基本类型和引用类型指针 栈空间是连续的,增加删除只需要移动指针,操作速度很快 栈空间是有限的,若超出栈空间内存,会抛出栈空间溢出错误

    2024年02月16日
    浏览(62)
  • v8-tc39-ecma262:数组push执行了什么?

    v8开发文档介绍 v8新特性 tc39-ecma262-push函数执行步骤 上图步骤,解释如下: 如果是对象,则当作对象调用设置该值 如果是类数组,则执行类数组调用设置该值 如果参数有多个参数,则: 如果,参数长度+原数组长度后,数组的总长度超限,则抛出异常 否则,循环操作如下:

    2024年02月11日
    浏览(34)
  • DHTMLX Suite v8.3发布!深化JavaScript UI小部件库使用体验

    DHTMLX UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件,这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Suite v8.3已于近日正式发布啦!这个更新附带了一组新特性和改进,旨在促进您使用JavaScript UI小部件库的体验。

    2024年02月02日
    浏览(35)
  • Node.js npm V8 React Express的运行配合关系:构建JavaScript应用的基石

    目录 Node.js 和 V8 引擎 Node.js 和 npm LTS(Long Term Support) React Node.js的作用 Express Node.js 和 V8 引擎 Node.js 使用 Google 的 V8 JavaScript 引擎 来执行 JavaScript 代码。V8 是一个高性能的 JavaScript 和 WebAssembly 引擎,用于在 Google Chrome 浏览器和 Node.js 中运行 JavaScript。 V8 引擎的更新 通常包括

    2024年03月12日
    浏览(64)
  • 如何在程序main()函数前执行代码

    目录 1、宏  2、全局变量 3、C/C++中的构造函数 4、利用GCC编译器的构造函数特性 5、预处理指令 #pragma startup 在程序的main()函数前执行代码可以通过以下方法实现: 1、宏  在头文件中定义宏 ,将要在main()函数前执行的代码放在宏中,然后在main()函数前使用宏调用代码。 2、全

    2024年02月05日
    浏览(46)
  • VSCode如何自动补全JavaScript代码

    在使用Visual Studio Code(以下简称VSCode)进行JavaScript开发时,自动补全功能是一项非常有用的功能。它可以帮助开发人员更快速地编写代码,减少拼写错误和语法错误的出现。本文将介绍如何在VSCode中启用和使用自动补全功能。 安装JavaScript插件 在开始之前,你需要确保已经安

    2024年02月03日
    浏览(56)
  • salesforce的按钮执行js代码如何链接到apex代码

    在Salesforce中,你可以通过自定义JavaScript按钮或链接来触发Apex代码的执行。这可以通过使用JavaScript Remoting或Visualforce页面来实现。以下是一些步骤来将JavaScript按钮与Apex代码链接起来: 使用JavaScript Remoting链接JavaScript按钮到Apex代码: 创建Apex类 :首先,创建一个Apex类,其中包

    2024年02月07日
    浏览(36)
  • 如何实现Spring中服务关闭时对象销毁执行代码

    1.实现DisposableBean接口的destroy 2.在bean类的方法上增加@PreDestroy方法,那么这个方法会在DisposableBean.destory方法前触发 3.实现SmartLifecycle接口的stop方法 那么这个时候我们去启动一个spring容器 这个时候其实销毁方法是不会执行的,我们可以通过,调用close方法触发或者调用register

    2024年02月01日
    浏览(36)
  • python,如何设置定时执行python代码-windows本地

    最近写了一个python小程序,希望能每天定时执行,但是又不想用jenkins这样的工具,后来发现windows本地就可以设置,而且很好用,具体步骤如下: 首先,需确保本地python代码已编写好,环境变量已配置好,能运行成功; 1)依次进入:控制面板-大图标-管理工具-任务计划程序

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包