返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解V8是如何执行一段JavaScript代码原理
  • 347
分享到

详解V8是如何执行一段JavaScript代码原理

V8 执行JavaScript原理V8 JavaScript 2023-05-15 08:05:29 347人浏览 安东尼
摘要

目录前言编译器和解释器1. 生成抽象语法树(AST)和执行上下文2. 生成字节码3. 执行代码javascript 的性能优化前言 了解 V8 的执行机制,能帮助你从底层了解 Ja

前言

了解 V8 的执行机制,能帮助你从底层了解 JavaScript,也能帮助你深入理解语言转换器 Babel、语法检查工具 ESLint、前端框架 VueReact 的一些底层实现机制。因此,了解 V8 的编译流程能让你对语言以及相关工具有更加充分的认识。

要深入理解 V8 的工作原理,你需要搞清楚一些概念和原理,比如编译器(Compiler)、解释器(Interpreter)、抽象语法树(AST)、字节码(Bytecode)、即时编译器(JIT)等概念。

编译器和解释器

之所以存在编译器和解释器,是因为机器不能直接理解我们所写的代码,所以在执行程序之前,需要将我们所写的代码“翻译”成机器能读懂的机器语言。按语言的执行流程,可以把语言划分为编译型语言和解释型语言。

编译型语言在程序执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,而不需要再次重新编译了。比如 C/C++Go 等都是编译型语言。

而由解释型语言编写的程序,在每次运行时都需要通过解释器对程序进行 动态解释和执行。比如 python、JavaScript 等都属于解释型语言。

编译器解释器 是如何“翻译”代码的呢?具体流程你可以参考下图:

1. 生成抽象语法树(AST)和执行上下文

编译器或者解释器后续的工作都需要依赖于 AST,而不是源代码。

Babel 的工作原理就是先将 es6 源码转换为 AST,然后再将 ES6 语法的 AST 转换为 ES5 语法的 AST,最后利用 ES5 的 AST 生成 JavaScript 源代码。

ESLint 是一个用来检查 JavaScript 编写规范的插件,其检测流程也是需要将源码转换为 AST,然后再利用 AST 来检查代码规范化的问题。

通常,生成 AST 需要经过两个阶段:

第一阶段是分词(tokenize),又称为 词法分析。其作用是将一行行的源码拆解成一个个语法上不可能再分的、最小的单个字符或字符串

第二阶段是解析(parse),又称为 语法分析。其作用是将上一步生成的数据,根据语法规则转为 AST。如果源码符合语法规则,这一步就会顺利完成。但如果源码存在语法错误,这一步就会终止,并抛出一个“语法错误”。有了 AST 后,那接下来 V8 就会生成该段代码的执行上下文。

2. 生成字节码

有了 AST 和执行上下文后,那接下来的第二步,解释器 Ignition 就登场了,它会根据 AST 生成字节码,并解释执行字节码。

字节码就是介于 AST 和机器码之间的一种代码。但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。使用字节码可以减少系统的内存使用。

3. 执行代码

生成字节码之后,接下来就要进入执行阶段了。解释器 Ignition 除了负责生成字节码之外,它还有另外一个作用,就是解释执行字节码。

在 Ignition 执行字节码的过程中,如果发现有热点代码(HotSpot),比如一段代码被重复执行多次,这种就称为 热点代码,那么后台的编译器 TurboFan 就会把该段热点的字节码编译为 高效的机器码,然后当再次执行这段被优化的代码时,只需要执行编译后的机器码就可以了,这样就大大提升了代码的执行效率。

其实字节码配合解释器和编译器是最近一段时间很火的技术,比如 Java 和 Python虚拟机也都是基于这种技术实现的,我们把这种技术称为 即时编译(JIT)。具体到 V8,就是指解释器 Ignition 在解释执行字节码的同时,收集代码信息,当它发现某一部分代码变热了之后,TurboFan 编译器便闪亮登场,把热点的字节码转换为机器码,并把转换后的机器码保存起来,以备下次使用。

JavaScript 的性能优化

对于优化 JavaScript 执行效率,应该将优化的中心聚焦在 单次脚本的执行时间脚本的网络下载 上,主要关注以下三点:

提升单次脚本的执行速度,避免 JavaScript 的长任务霸占主线程,这样可以使得页面快速响应交互。

避免大的内联脚本,因为在解析 html 的过程中,解析和编译也会占用主线程。

减少 JavaScript 文件的容量,因为更小的文件会提升下载速度,并且占用更低的内存。以上就是详解V8是如何执行一段JavaScript代码原理的详细内容,更多关于V8 执行JavaScript原理的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解V8是如何执行一段JavaScript代码原理

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

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

猜你喜欢
  • 详解V8是如何执行一段JavaScript代码原理
    目录前言编译器和解释器1. 生成抽象语法树(AST)和执行上下文2. 生成字节码3. 执行代码JavaScript 的性能优化前言 了解 V8 的执行机制,能帮助你从底层了解 Ja...
    99+
    2023-05-15
    V8 执行JavaScript原理 V8 JavaScript
  • V8是怎么执行一段JavaScript代码的
    这篇文章主要讲解了“V8是怎么执行一段JavaScript代码的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“V8是怎么执行一段JavaScript代码的”吧!编译器和解释器之所以存在编译器...
    99+
    2023-07-06
  • V8引擎如何执行JavaScript代码
    V8引擎如何执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。题目中说到的V8引擎,大家自然会联想到Node.js。我们先看一下官方对Node.js的定...
    99+
    2023-06-16
  • V8引擎是怎样执行JavaScript代码
    V8引擎是怎样执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 题目中说到的V8引擎,大家自然会联想到No...
    99+
    2024-04-02
  • 浅谈一段java代码是如何执行的
    目录1. 编译成class2. jvm的构成3. 方法的顺序执行和栈帧4. class文件反编译过后的样子5. 指令集详解本文分享自华为云社区《一段java代码是如何执行的》,原文作...
    99+
    2024-04-02
  • 如何解决Jquery $.ajax函数外的一段代码的执行顺序
    本篇内容主要讲解“如何解决Jquery $.ajax函数外的一段代码的执行顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决Jquery $.ajax函...
    99+
    2024-04-02
  • 详解一条update语句是怎样执行原理解析
    目录前期准备SQL语句的执行过程server层中的组件介绍Update语句分析redo log(重做日志)redo log存储在哪里?redo log 空间是固定,那它会不会用完呢?binlog(归档日志)redo lo...
    99+
    2022-12-26
    update语句执行原理 update执行
  • PHP代码执行漏洞如何解决
    要解决PHP代码执行漏洞,可以考虑以下几个方面的措施:1. 输入验证和过滤:对于用户输入的数据,进行验证和过滤,确保输入的数据符合预...
    99+
    2023-09-27
    PHP
  • 一文详解如何用GPU来运行Python代码
    目录简介安装相关工具测试与驱动安装测试Python代码打印ID查看时间简介 前几天捣鼓了一下Ubuntu,正是想用一下我旧电脑上的N卡,可以用GPU来跑代码,体验一下多核的快乐。 还...
    99+
    2023-02-06
    用GPU运行Python代码 GPU运行Python代码 GPU Python
  • 如何理解PHP程序执行的过程原理
    目录概述加载php.ini配置加载php内置扩展概述 Web环境我们假设为Apache。在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模...
    99+
    2024-04-02
  • 如何在Python退出时强制运行一段代码
    这篇文章将为大家详细讲解有关如何在Python退出时强制运行一段代码,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。设想这样一个场景,你要给一个项目开发测试程序,程序开始运行的时候,会创建初始...
    99+
    2023-06-03
  • Java中的静态代码块是如何执行的
    Java中的静态代码块是如何执行的?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行...
    99+
    2023-05-31
    java ava
  • 如何在JavaScript中运行.NET Core代码详情
    目录一、前言二、DotNetJS三、Demo1. 创建项目2. 实现C#代码3. 实现JS代码4. 运行效果四、结论一、前言 在.NET Core中运行JavaScript代码,目前...
    99+
    2024-04-02
  • 详解如何让JavaScript代码不可断点
    目录绕过断点应用案例属性访问对象属性多个操作绕过断点 调试 JS 代码时,单步执行(F11)可跟踪所有操作。例如这段代码,每次调用 alert 时都会被断住: debugger al...
    99+
    2022-11-13
    JavaScript 代码不断点 JavaScript 代码 断点 JavaScript 断点
  • 一文详解如何使用node执行js文件
    目录知识回顾CommentJS规范ECMAScript标准规范模块化CommonJS规范模块化总结知识回顾 I/O (Input/output)   &...
    99+
    2023-01-09
    node 执行js文件 node执行js文件 nodejs运行js代码
  • JavaScript中如何在一个循环中等待示例代码详解
    下面是如何使用for..of 循环来迭代一个数组并在循环内等待: const fun = (prop) => { return new Promise(resolve =&...
    99+
    2024-04-02
  • JavaScript如何优化逻辑判断代码详解
    前言 我们日常使用到的逻辑判断语句有 if...else...、switch...case...、do...while...等。 在简单场景下,我们可能对这些语法的性能没有什么感觉,...
    99+
    2024-04-02
  • JavaScript中Eval函数的介绍以及如何执行代码字符串
    JavaScript中Eval函数的介绍以及如何执行代码字符串,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Eval:执行代码字符串内建函数 ...
    99+
    2024-04-02
  • 如何处理一个利用thinkphp5远程代码执行漏洞挖矿的木马
    小编给大家分享一下如何处理一个利用thinkphp5远程代码执行漏洞挖矿的木马,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!记一次挂马清除经历:处理一个利用thinkphp5远程代码执行漏洞挖矿的木马昨天发现 一台服务器突...
    99+
    2023-06-14
  • 如何从Javascript事件循环看出Vue.nextTick的原理和执行机制
    今天就跟大家聊聊有关如何从Javascript事件循环看出Vue.nextTick的原理和执行机制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。抛砖...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作