返回顶部
首页 > 资讯 > 前端开发 > node.js >V8引擎是怎样执行JavaScript代码
  • 456
分享到

V8引擎是怎样执行JavaScript代码

2024-04-02 19:04:59 456人浏览 安东尼
摘要

V8引擎是怎样执行javascript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 题目中说到的V8引擎,大家自然会联想到no

V8引擎是怎样执行javascript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

 题目中说到的V8引擎,大家自然会联想到node.js

我们先看一下官方对node.js的定义:

Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境

但是这句话对于我们很多同学来说,非常笼统,比如先抛出这样几个问题:

  • 什么是JavaScript运行环境?

  • 为什么JavaScript需要特别的运行环境呢?

  • JavaScript引擎又是什么呢?

  • V8是什么?

上面这些问题,同学们理解的笼统没关系,这篇文章会依次揭晓答案~

我们先来吧这些概念搞清楚,再去看Node到底是什么?为什么大前端需要它。

JavaScript无处不在

Stack Overflow的创立者之一的 Jeff Atwood 在前些年提出了著名的Atwood定律:

  • 任何可以使用JavaScript来实现的应用最终都会使用JavaScript实现。

在发明之处,JavaScript的目的是应用于在浏览器执行简单的脚本任务,对浏览器以及其中的DOM进行各种操作,所以JavaScript的应用场景非常受限。

但是随着Node的出现,Atwood定律已经越来越多的被证实是正确的。

但是为了可以理解Node.js是如何帮助我们做到这一点的,我们必须了解JavaScript是如何被运行的。

现在我们想一下,JavaScript代码在浏览器中是如何被执行的呢?

浏览器内核

不同的浏览器有不同的内核组成:

  • Gecko:早期被Netscape和Mozilla Firefox浏览器使用;

  • Trident:微软开发,被IE4~IE11浏览器使用,但是Edge浏览器已经转向Blink;

  • WEBkit:苹果基于Khtml开发、开源的,用于Safari,Google Chrome之前也在使用;

  • Blink:是Webkit的一个分支,Google开发,目前应用于Google Chrome、Edge、Opera等;

  • 等等...

事实上,我们经常说的浏览器内核指的是浏览器的排版引擎:

排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering  engine)或样板引擎。

介绍完浏览器的排版引擎之后,来介绍下浏览器的渲染引擎的工作过程。

渲染引擎工作的过程

V8引擎是怎样执行JavaScript代码

浏览器渲染引擎的工作过程

如上图:

  • HTML和CSS经过对应的Parser解析之后,会形成对应的DOM Tree和 CSS Tree;

  • 它们经过附加合成之后,会形成一个Render  Tree,同时生成一个Layout布局,最终通过浏览器的渲染引擎帮助我们完成绘制,展现出平时看到的Hmtl页面;

  • 在HTML解析过程中,如果遇到了 <script src='xxx'>会停止解析HTML,而优先去加载和执行JavaScript代码(此过程由JavaScript引擎完成)

因为JavaScript属于高级语言(pythonc++、Java),所以JavaScript引擎会先把它转换成汇编语言,再把汇编语言转换成机器语言(二进制010101),最后被CPU所执行。

JavaScript引擎

为什么需要JavaScript引擎呢?

  • 事实上我们编写的JavaScript无论你交给浏览器或者Node执行,最后都是需要被CPU执行的;

  • 但是CPU只认识自己的指令集,实际上是机器语言,才能被CPU所执行;

  • 所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行;

比较常见的JavaScript引擎有哪些呢?

  • SpiderMonkey:第一款JavaScript引擎,由Brendan Eich开发(也就是JavaScript作者);

  • Chakra:微软开发,用于IT浏览器;

  • JavaScriptCore:WebKit中的JavaScript引擎,Apple公司开发;

  • V8:Google开发的强大JavaScript引擎,也帮助Chrome从众多浏览器中脱颖而出;

上面我们介绍了JavaScript引擎和浏览器内核,但有的同学就该问了它们俩之间有什么联系呢和不同呢?

下面,我以WebKit内核为例。

WebKit内核

事实上WebKit内核由两部分组成的:

  • WebCore:负责HTML解析、布局、渲染等等相关的工作;

  • JavaScriptCore:解析、执行JavaScript代码(JavaScript引擎的工作);


V8引擎是怎样执行JavaScript代码

另外一个强大的JavaScript引擎就是V8引擎。

V8引擎

我们来看一下官方对V8引擎的定义:

  • 支持语言:V8是用C ++编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等;

(译:V8可以运行JavaScript和WebAssembly引擎编译的汇编语言等)

  • 跨平台:它实现ECMAScript和WebAssembly,并在windows 7或更高版本,MacOS 10.12+和使用x64,IA-32,

ARM或MIPS处理器的linux系统上运行;

  • 嵌入式:V8可以独立运行,也可以嵌入到任何C ++应用程序中;

V8引擎的工作原理

图解V8引擎的工作原理


V8引擎是怎样执行JavaScript代码

图解V8引擎的工作原理

其中的**Parse(解析器)、lgnition(解释器)、TurboFan(优化编译器)**都是V8引擎的内置模块

假如有这样一段JavaScript源代码:

console.log("hello world");  function sum(num1, num2) {  return num1 + num2; }

Parse模块会将JavaScript代码转换成AST(抽象语法树),这是因为解释器并不直接认识JavaScript代码;

  • 如果函数没有被调用,那么是不会被转换成AST的;

  • Parse的V8官方文档:https://v8.dev/blog/scanner

Ignition是一个解释器,会将AST转换成ByteCode(字节码);

  • 同时会收集TurboFan优化所需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算);

  • 如果函数只调用一次,Ignition会执行解释执行ByteCode;

  • Ignition的V8官方文档:Https://v8.dev/blog/ignition-interpreter

TurboFan是一个编译器,可以将字节码编译为CPU可以直接执行的机器码;

  • 如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,提高代码的执行性能;

  • 但是,机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如sum函数原来执行的是number类型,后来执行变成了string类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码;

  • TurboFan的V8官方文档:https://v8.dev/blog/turbofan-jit

上面是JavaScript代码的执行过程,事实上V8的内存回收也是其强大的另外一个原因;

  • Orinoco模块,负责垃圾回收,将程序中不需要的内存回收;

  • Orinoco的V8官方文档:https://v8.dev/blog/trash-talk

  • 关于V8引擎的垃圾内存回收机制,可以看下我之前整理的这篇文章「经典升华」V8引擎的垃圾内存回收机制

编程语言会大体分为两大类:

  • 解释型语言:运行效率相对较低(比如JavaScript)

  • 编译型语言:运行效率相对较高(比如C++)

上述情况对应的是JavaScript解释性语言的大体执行流程,但编译性语言往往不是,比如C++,例如系统内的某些应用程序用C++编写的,它们在执行的时候会直接转化为机器语言(二进制格式010101),并交给CPU统一执行,这样的运行效率自然相对较高了些。

但V8也对解释性的编程语言做了一个优化,就是上文提到的TurboFan优化编译器,如果一个JavaScript函数被多次调用,那么它就会经过TurboFan抓成优化后的机器码,交由CPU执行,提高代码的执行性能。

回顾:Node.js是什么

回顾:官方对Node.js的定义:

Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境。

也就是说Node.js基于V8引擎来执行JavaScript的代码,但是不仅仅只有V8引擎:

  • 前面我们了解到V8可以嵌入到任何C ++应用程序中,无论是Chrome还是Node.js,事实上都是嵌入了V8引擎

来执行JavaScript代码;

  • 但是在Chrome浏览器中,还需要解析、渲染HTML、CSS等相关渲染引擎,另外还需要提供支持浏览器操作的api、浏览器自己的事件循环等,这些都是由浏览器内核帮我们完成的;

  • 另外,在Node.js中我们也需要进行一些额外的操作,比如文件系统读/写、网络IO、加密、压缩解压文件等

操作;

PS:在后面的文章我们,我会带领大家逐步探索Node.js的世界...

浏览器和Node.js架构区别

简单对比一下Node.js和浏览器架构的差异:

V8引擎是怎样执行JavaScript代码

浏览器和Node.js架构区别

在Chrome浏览器中

  • 比如发送网络请求,中间层会调用操作系统中的网卡;

  • 读取一些本地文件,中间层会调用操作系统中的硬盘;

  • 浏览器页面的渲染工作,中间层会调用操作系统中的显卡;

  • 等等...

  • V8引擎只是其中的一小部分,用来辅助JavaScript代码的运行;

  • 还有一些浏览器的内核用来负责HTML解析、布局、渲染等等相关的工作;

  • 中间层和操作系统(网卡/硬盘/显卡...);

  • 在Node中

V8引擎;

  • 中间层(libuv)包括EventLoop等;

  • 操作系统(网卡/硬盘/显卡...);

Node.js架构

我们来看一个单独的Node.js的架构图:

  • 我们编写的JavaScript代码会经过V8引擎,再通过Node.js的Bindings(Node.js  API),将任务派发到Libuv的事件循环中;

  • Libuv提供了事件循环、文件系统读写、网络IO、线程池等等内容;Libuv是使用C语言编写的库;

具体的内部代码执行流程,我会在后面的文章中专门讲解Node.js中的事件队列机制和异步IO的原理;

V8引擎是怎样执行JavaScript代码

Node.js架构图

Node.js的应用场景

Node.js的快速发展也让企业对Node.js技术越来越重视。

那么它都有哪些实际的应用场景呢?

  • 目前前端开发的库都是以node包的形式进行管理;

  • npm、yarn工具成为前端开发使用最多的工具;

  • 越来越多的公司使用Node.js作为web服务器开发;

  • 大量项目需要借助Node.js完成前后端渲染的同构应用;

  • 很多企业在使用Electron来开发桌面应用程序;

Node.js的REPL

什么是REPL呢?感觉挺高大上

  • REPL是Read-Eval-Print Loop的简称,翻译为 “读取-求值-输出”循环;

  • REPL是一个简单的、交互式的编程环境;

事实上,我们浏览器的console就可以看成一个REPL。

Node也给我们提供了一个REPL环境,我们可以在其中演练简单的代码。

V8引擎是怎样执行JavaScript代码

浏览器的REPL

V8引擎是怎样执行JavaScript代码

Node的REPL

看完上述内容,你们掌握V8引擎是怎样执行JavaScript代码的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网node.js频道,感谢各位的阅读!

--结束END--

本文标题: V8引擎是怎样执行JavaScript代码

本文链接: https://lsjlt.com/news/82337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • V8引擎是怎样执行JavaScript代码
    V8引擎是怎样执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 题目中说到的V8引擎,大家自然会联想到No...
    99+
    2024-04-02
  • V8引擎如何执行JavaScript代码
    V8引擎如何执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。题目中说到的V8引擎,大家自然会联想到Node.js。我们先看一下官方对Node.js的定...
    99+
    2023-06-16
  • 详解JavaScript引擎V8执行流程
    目录一、V8来源二、V8的服务对象三、V8的早期架构四、V8早期架构的缺陷五、V8的现有架构六、V8的词法分析和语法分析七、V8 AST抽象语法树八、字节码九、Turbofan一、V...
    99+
    2024-04-02
  • JavaScript引擎怎么执行JS代码
    这篇文章主要为大家展示了“JavaScript引擎怎么执行JS代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript引擎怎么执行JS代码”这篇文...
    99+
    2024-04-02
  • V8是怎么执行一段JavaScript代码的
    这篇文章主要讲解了“V8是怎么执行一段JavaScript代码的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“V8是怎么执行一段JavaScript代码的”吧!编译器和解释器之所以存在编译器...
    99+
    2023-07-06
  • Node.js V8 引擎与代码缓存:提高 JavaScript 执行速度的利器
    代码缓存 代码缓存是一种优化技术,可存储 JavaScript 代码的编译版本,以便在后续执行时快速访问。这提高了 JavaScript 代码的执行速度,因为它消除了编译代码的开销,尤其是对于经常执行的代码段。 V8 引擎与代码缓存的协同...
    99+
    2024-04-02
  • JS引擎执行流程是怎样的
    这篇文章给大家介绍JS引擎执行流程是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言我强烈推荐的原因在于:在用动图的形式生动形象的讲述了JavaScript引擎基本原理。接触了...
    99+
    2024-04-02
  • 详解V8是如何执行一段JavaScript代码原理
    目录前言编译器和解释器1. 生成抽象语法树(AST)和执行上下文2. 生成字节码3. 执行代码JavaScript 的性能优化前言 了解 V8 的执行机制,能帮助你从底层了解 Ja...
    99+
    2023-05-15
    V8 执行JavaScript原理 V8 JavaScript
  • Node.js V8 引擎的未来之路:下一代 JavaScript 运行时的愿景
    持续性能优化 性能一直是 V8 引擎的核心关注点。未来,V8 将继续专注于优化性能,提高执行速度和减少内存占用。这包括改进编译器、垃圾回收器和其他关键组件。 更好的并发支持 随着 Web 应用程序变得越来越复杂,对并发支持的需求也越来越高...
    99+
    2024-04-02
  • java代码块执行顺序是怎样的
    本文小编为大家详细介绍“java代码块执行顺序是怎样的”,内容详细,步骤清晰,细节处理妥当,希望这篇“java代码块执行顺序是怎样的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、类的静态代码块、结构代码块、结...
    99+
    2023-06-30
  • javascript顺序执行是怎样的
    这篇文章主要讲解了“javascript顺序执行是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript顺序执行是怎样的”吧! ...
    99+
    2024-04-02
  • jsp中怎么执行javascript代码
    这篇文章主要介绍了jsp中怎么执行javascript代码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jsp中怎么执行javascript代码文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • Node和JavaScript中的模板引擎是怎样的
    本篇文章给大家分享的是有关Node/JavaScript中的模板引擎是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。简介我们将介绍如何用...
    99+
    2024-04-02
  • 深入理解JVM字节码执行引擎
    我们都知道,在当前的Java中(1.0)之后,编译器讲源代码转成字节码,那么字节码如何被执行的呢?这就涉及到了JVM的字节码执行引擎,执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致:输入:字节码文件处理:字节码解...
    99+
    2023-06-02
  • hive中怎么设置执行引擎
    在Hive中,默认情况下使用的是Tez执行引擎。但是你可以通过以下方式来设置不同的执行引擎: 使用Hive CLI或Beeline...
    99+
    2024-04-02
  • 在Chrome中怎么执行JavaScript代码
    这篇“在Chrome中怎么执行JavaScript代码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“在Chrome中怎么执行...
    99+
    2023-06-29
  • 怎样让php代码不向下执行
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑让php代码不向下执行的方法:当在脚本中调用die()和exit()时,将会终止整个脚本。它们都可用于阻止脚本继续执行,而使得某些重要的操作不会发生。die()phpd...
    99+
    2019-11-18
    php
  • V8 引擎的性能剖析:深入了解 JavaScript 运行时的底层秘密
    V8 引擎是 Google Chrome 和其他流行浏览器的 JavaScript 运行时。它的性能对于 Web 应用程序的流畅性和响应性至关重要。深入了解 V8 的底层机制至关重要,因为这可以帮助开发人员识别和解决性能瓶颈,从而构建高效...
    99+
    2024-04-02
  • JavaScript 引擎的运行原理是什么
    这篇文章将为大家详细讲解有关JavaScript 引擎的运行原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。注意:本文主要基于 Node.js 和基...
    99+
    2024-04-02
  • JavaScript函数内部的代码怎么执行
    这篇文章主要介绍“JavaScript函数内部的代码怎么执行”,在日常操作中,相信很多人在JavaScript函数内部的代码怎么执行问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作