前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >V8是如何执行JavaScript代码的?

V8是如何执行JavaScript代码的?

作者头像
腾讯IVWEB团队
发布于 2020-06-29 04:08:45
发布于 2020-06-29 04:08:45
1.5K00
代码可运行
举报
运行总次数:0
代码可运行
编程语言是如何运行的

众所周知,我们通过编程语言完成的程序是通过处理器运行的。但是处理器不能直接理解我们通过高级语言(如C++、Go、JavaScript等)编写的代码,只能理解机器码,所以在执行程序之前,需要经过一系列的步骤,将我们编写的代码翻译成机器语言。这个过程一般是由编译器(Interpreter) 或者解释器(Compiler) 来完成。

那么编译器和解释器的工作流程是怎样的呢?

从上图可以看出它们的大概的工作流程。那么既然编译器和解释器都可以完成代码翻译的工作,为何还同时存在呢?

这是因为编程语言有两个类别:静态类型和动态类型。静态类型的语言,比如C++、Go等,都需要提前编译 (AOT) 成机器码然后执行,这个过程主要使用编译器来完成;而动态语言,比如JavaScript、Python等,只在运行时进行编译执行 (JIT) ,这个过程通过解释器完成。

通过上面的描述,我们已经知道了JavaScript是通过解释器来进行翻译执行的,那么JavaScript引擎V8执行Js代码的详细过程是怎么样的呢?接下来我们详细分析一下。

V8执行Js代码的过程

V8执行Js代码的整体流程如下图所示:

在这个过程中,V8同时使用了Parser(解析器)Ignition(解释器)TurboFan(编译器) 来执行Js代码。

1.Parser生成抽象语法树

在Chrome中开始下载Javascript文件后,Parser就会开始并行在单独的线程上解析代码。这意味着解析可以在下载完成后仅几毫秒内完成,并生成AST。

上图是一段Js代码转成AST后的结构图,从图中可以看出AST是把代码结构化成树状结构表示,这样做是为了更好的让编译器或者解释器理解。此外,AST还广泛应用于各类项目中,比如Babel、ESLint,那么AST的生成过程是怎么样的呢?

1. 词法分析(lexical analysis):主要是将字符流(char stream) 转换成标记流(token stream),字符流就是我们一行一行的代码,token是指语法上不能再分的、最小的单个字符或者字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var name = "ivweb"
//转成token后为

[
    {
        "type": "Keyword",
        "value": "var"
    },
    {
        "type": "Identifier",
        "value": "name"
    },
    {
        "type": "Punctuator",
        "value": "="
    },
    {
        "type": "String",
        "value": "\"ivweb\""
    },
    {
        "type": "Punctuator",
        "value": ";"
    }
]

从上面可以看出,var name = "ivweb"; 这样一段代码,会有关键字"var"、标识符"name"、赋值运算符"="、字符串"ivweb"、分隔符";",共5个token。

2. 语法分析:将前面生成的token流根据语法规则,形成一个有元素层级嵌套的语法规则树,这个树就是AST。在此过程中,如果源代码不符合语法规则,则会终止,并抛出“语法错误”。

2.Ignition生成字节码

字节码是机器码的抽象,可以看作是小型的构建块,这些构建块组合到一起构成任何JavaScript功能。字节码比机器码占用更小的内存,这也是为什么V8使用字节码的一个很重要的原因。字节码不能够直接在处理器上运行,需要通过解释器将其转换为机器码后才能执行。

通过上图可以看出,Ignition把前一步得到的AST通过字节码生成器经过一些列的优化生成字节码。

在这个过程中:

  • Register Optimizer: 主要是避免寄存器不必要的加载和存储;
  • Peephole Optimizer: 寻找直接码中可以复用的部分,并进行合并;
  • Dead-code Elimination: 删除无用的代码,减少字节码的大小

通过上面三个过程的优化进一步减小字节码的大小并提高性能,最后Ignition执行优化后的字节码。

3.执行代码及优化

Ignition执行上一步生成的字节码,并记录代码运行的次数等信息,如果同一段代码执行了很多次,就会被标记为 “HotSpot”(热点代码),然后把这段代码发送给 编译器TurboFan,然后TurboFan把它编译为更高效的机器码储存起来,等到下次再执行到这段代码时,就会用现在的机器码替换原来的字节码进行执行,这样大大提升了代码的执行效率。

另外,当TurboFan判断一段代码不再为热点代码的时候,会执行去优化的过程,把优化的机器码丢掉,然后执行过程回到Ignition。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
比较 QoS 服务策略的 bandwidth 和 priority 命令
要想知道梨子的味道最好亲口尝一尝,网上本来有篇“比较QoS服务策略的bandwidth及priority 命令”,怎么看怎么像机器翻出来的,这里重新翻译了下
SuperDream
2019/02/28
2.6K0
目前学术界最先进的数据包调度器介绍!
随着链路速度的提高和CPU速度缩放速度的降低,软件中的数据包调度会导致较低的精度和较高的CPU利用率。通过将数据包调度卸载到诸如NIC之类的硬件,可以潜在地克服这些缺点。然而,为了保持软件分组调度器的灵活性,硬件中的分组调度器必须是可编程的,同时还必须快速且可扩展。硬件中最先进的数据包调度程序要么折衷了可扩展性(Push-In-First-Out(PIFO)),要么表达了各种数据包调度算法的能力(先进先出(FIFO)))。此外,即使是像PIFO这样的通用调度原语,其表达能力也不足以表达分组调度算法的某些关键类别。因此,在本文中,我们提出了PIFO原语的泛化,称为Push-In-Extract-Out(PIEO),它与PIFO一样,维护元素的有序列表,但与PIFO不同,PIFO只允许从列表的开头出队,PIEO通过在出队时支持基于断言的可编程过滤,允许从列表中的任意位置出队。接下来,我们介绍PIEO调度程序的快速且可扩展的硬件设计,并在FPGA上进行原型设计。总体而言,PIEO调度程序比PIFO具有更高的表达力和30倍以上的可伸缩性。
网络交换FPGA
2020/06/07
4.4K0
QOS面试考点-第一篇
HCIER&S面试高频面试知识点QOS,近期会将QOS专题的所有知识点及面试中考官问到的问题点做一个分析。
Ponnie
2021/02/24
1.2K0
网络中的QOS技术
无论是语音还是视频,在IP网上都以IP数据包方式传输,其所需带宽完全可以由宽带多业务网络满足。但为了保证在其它数据的干扰下,或在高峰拥塞期间,在多对一的流量汇聚点上,满足关键业务的带宽、时延、抖动和丢包等要求,就需要网络提供必要的QoS(服务质量保证)技术。
网络技术联盟站
2021/05/12
2.2K0
QoS 工作原理与相关技术细节
VOIP:Voice Over Internet Protocol 模拟声音讯号数字化
利又德智能感知
2022/11/07
9391
详解:TSN如何实现确定性的数据传输?
传统网络朝着为用户提供互联服务、扩大业务带宽、保证服务质量的方向发展。直到现在,基于网络的服务主要以人为中心,几十毫秒的延迟并不是什么大问题。然而,随着机器对机器 (M2M) 和物联网 (IoT) 等应用的出现,网络服务面临着新的挑战,在车联网、工业互联网等场景下,即使最轻微的延迟也会导致服务中断。TSN(时间敏感网络)技术是IEEE 802.1标准化的一种基于以太网的网络技术,为需要超低延迟和高精度特性的应用提供服务。 背  景 以太网技术不仅被证明非常成功,更是一种存在于整个IT世界的通信方法。然而,
SDNLAB
2022/10/10
2.8K0
详解:TSN如何实现确定性的数据传输?
MQTT over QUIC 多流支持
过去的 2 月份,EMQX 开源版发布了 v5.0.16、v5.0.17 以及 v5.0.18 三个版本,提供了 MQTT over QUIC 多流(multistream)支持。企业版 v4.3.19 以及 v4.4.15 开发完成,即将发布,数据集成将新增对 HStreamDB 最新版本的适配,并允许设置 RocketMQ 消息生产者投递策略,将相同属性的消息转发到同一 RocketMQ 队列(Queue)中。
EMQ映云科技
2023/03/07
5770
2万字带你学习Qos原理,还有6个实验案例,建议一定要收藏!
QoS(Quality of Service)是服务质量的简称。对于网络业务来说,服务质量包括哪些方面呢?从传统意义上来讲,无非就是传输的带宽、传送的时延、数据的丢包率等,而提高服务质量无非也就是保证传输的带宽,降低传送的时延,降低数据的丢包率以及时延抖动等。广义上讲,服务质量涉及网络应用的方方面面,只要是对网络应用有利的措施,其实都是在提高服务质量。因此,从这个意义上来说,防火墙、策略路由、快速转发等也都是提高网络业务服务质量的措施之一。
网络技术联盟站
2020/09/29
4.6K1
2万字带你学习Qos原理,还有6个实验案例,建议一定要收藏!
【HCIE面试】QOS拥塞管理机制,来看看你是不是这样想的?
拥塞管理有哪些类型?默认一个接口有几个软件队列?不同优先级的报文怎么 映射进不同队列的?依据什么规则?
Ponnie
2021/04/15
2.2K2
流量控制--6.Classful Queuing Disciplines (qdiscs)
可以使用classful qdisc的代理来解锁Linux流量控制的灵活性和控制力。classful qdisc可以附加过滤器,允许将报文重定向到特定的类和子队列。
charlieroro
2020/12/02
1.1K0
流量控制--6.Classful Queuing Disciplines (qdiscs)
QOS队列技术有哪些?令牌桶又是什么?
1、FIFO:先进先出队列,是单队列技术,不会引入额外延迟,延迟只与队列长度有关,不提供任何差分服务。
Ponnie
2021/08/25
3K1
QOS队列技术有哪些?令牌桶又是什么?
QOS-3
先进先出,没有优先级可言,who第一个进,who第一个出去。,以太网和快速以太网接口默认queue是FIFO
py3study
2020/01/09
1.1K0
QOS-3
QUIC 和 HTTP/3:提升网络性能的关键技术
QUIC(Quick UDP Internet Connections)是一种基于 UDP 的传输层协议,旨在解决 TCP 在高延迟和丢包环境下的性能问题。HTTP/3 则是 HTTP 协议的最新版本,它基于 QUIC 协议而非 TCP,以提供更高效、可靠的网络服务。
陆业聪
2024/09/26
8260
QUIC 和 HTTP/3:提升网络性能的关键技术
【Linux】进程管理:状态与优先级调度的深度分析
🌈之前在这篇文章揭秘计算机内部奥秘:从CPU到操作系统,深入探索进程与线程的工作原理中就已经简述了 进程的部分相关内容,下面我们来进一步深入了解进程的内容。
IsLand1314
2024/10/15
4750
【Linux】进程管理:状态与优先级调度的深度分析
Nano Transport:一种硬件实现的用于SmartNIC的低延迟、可编程传输层
摘要:传输协议可以在NIC(网卡)硬件中实现,以增加吞吐量、减少延迟并释放CPU周期。如果已知理想的传输协议,那么最佳的实现方法很简单:直接将它烧入到固定功能的硬件中。但是传输协议仍在发展,每年都有提出新的创新算法。最近的一项研究提出了Tonic,这是一种Verilog可编程硬件传输层。我们在这项工作的基础上提出了一种称为纳米传输层的新型可编程硬件传输层架构,该架构针对主导大型现代分布式数据中心应用中极低延迟的基于消息的 RPC(远程过程调用)进行了优化。Nano Transport使用P4语言进行编程,可以轻松修改硬件中的现有(或创建全新的)传输协议。我们识别常见事件和基本操作,允许流水化、模块化、可编程的流水线,包括分组、重组、超时和数据包生成,所有这些都由程序设计员来表达。
网络交换FPGA
2021/10/11
2.1K1
Nano Transport:一种硬件实现的用于SmartNIC的低延迟、可编程传输层
软硬件融合视角:一文看懂高性能网络
随着大模型的广泛流行,GPU集群计算的规模越来越大(单芯片算力提升有限,只能通过扩规模的方式来提升整体算力),千卡、万卡已经成为主流,十万卡、百万卡也都在未来3-5年的规划中。
chaobowx
2024/06/26
1.1K2
软硬件融合视角:一文看懂高性能网络
如何让Hadoop支持优先级且性能可预测
让运行Hadoop的公司产品都能够确保高优先级任务按时完成。 Apache Hadoop近十年的成长证明,用开源技术处理与访问海量数据并不是什么炒作。然而,Hadoop的一个缺点是不可预测性。Hadoop不能确保企业的关键任务按时完成,也不能完全发挥集群的性能。 YARN(一种新的Hadoop资源管理器)能够实现任务抢占,为队列中的其它任务腾出调度空间。容量调度器与公平调度器可以通过静态配置杀死那些占用集群资源的任务,从而让高优先级任务进行调度。 当队列中堆积了等待资源的任务,这些工具就可以派上用场了。不
CSDN技术头条
2018/02/12
1.1K0
如何让Hadoop支持优先级且性能可预测
HTTP探索之路 - HTTP 1 / HTTP 2 / QUIC
从1989年万维网(www)诞生,HTTP(HyperText Transfer Protocol)经历了众多版本迭代,WebSocket也在期间萌芽。1991年HTTP/0.9被发明;1996年出现了HTTP/1.0;2015年HTTP/2正式发布;2020年HTTP/3或能正式使用。以下将会简单介绍。 一、HTTP 1.1 与 HTTP 2 1.1 HTTP 1.1 的缺陷 高延迟 — 队头阻塞(Head-Of-Line Blocking) 无状态特性 — 阻碍交互 明文传输 — 不安全
用户1097444
2022/06/29
8850
HTTP探索之路 - HTTP 1 / HTTP 2 / QUIC
MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力
本文将通过对 MQTT over QUIC 的详细解析,为大家展现这一领先技术实现对于物联网场景的优势与价值,帮助大家更有效地借助 EMQX 5.0 对 QUIC 的支持能力,在各类 MQTT 应用场景中进行更加高效、低成本的物联网数据传输。
EMQ映云科技
2022/07/29
7470
解析流控技术演进
随着数据中心网络技术和带宽不断发展,流控技术在网络中发挥着越来越重要的作用,但一直未曾有过很大变革。直到无损网络的出现,流控技术出现新突破。作为以太网的基本功能之一,流控技术用于可以防止拥塞的情况下出现丢包,还能配合发送端合理的调整发送速率,从整体上保障网络带宽的最高效率。
SDNLAB
2019/12/19
3.1K0
解析流控技术演进
推荐阅读
相关推荐
比较 QoS 服务策略的 bandwidth 和 priority 命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档