V8是如何执行一段JS代码的?

【016】描述一下 V8 执行一段JS代码的过程 前言 首先需要明白的是,机器是读不懂 JS 代码,机器只能理解特定的机器码,那如果要让 JS 的逻辑在机器上运行起来,就必须将 JS 的代码翻译成机器码,然后让机器识别。JS属于解释型语言,对于解释型的语言说,解释器会对源代码做如下分析: 解释器进行词法分析和语法分析 根据语法分析结果生成抽象语法树 生成字节码 1.ATS抽象语法树的生成 抽象语法树生成经过词法解析和语法解析。 词法解析就是解... 阅读详情
  • 汇编器 编译器 解释器

  • 解释执行和解释执行

  • 什么是V8?

  • V8执行Js代码的过程

汇编器 编译器 解释器

众所周知,计算机只能理解机器语言,而我们平时编程用的通常是高级语言,所以源代码通常都要经过层层转换最终变成机器语言运行。

早期只有汇编语言没有高级语言,不同的设备有一套自己的对应不同机器语言指令集的汇编语言,也就是说,汇编语言不能在不同CPU架构(intel ARM MIPS)之间移植。同一个软件为了让不同类型的处理器架构都能兼容要写好几套代码,实在太不方便了,我们需要一种屏蔽了计算机架构细节的语言,能适应多种不同CPU架构的语言,专心处理业务逻辑,所以后来发展出了跨平台的高级语言。诸如 C C++ Java JavaScript。

汇编时代
高级语言时代

随着计算机发展,编译器也越来越复杂,发展了很多分支,像是本地编译器、交叉编译器等,这里就不多说了。

那么源码一定要经过编译才能运行吗?

解释器的出现给出了一种不用编译就能运行的能力

先静态编译到可执行的文件,然后运行可执行的文件来执行程序,而解释器提供了一种边编译边运行的动态运行方法,而也正因为通过解释器运行的代码是边编译边运行的,所以运行的速度比静态编译的那种慢很多。

所以程序运行的方式分为编译执行和解释执行。

解释执行和解释执行

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

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

什么是V8

JavaScript引擎是执行JavaScript代码的程序或解释器。javaScript引擎可以实现为标准解释器或即时编译器,它以某种形式将JavaScript编译为字节码。

那么除了v8引擎,你还知道那些js引擎

  • V8 - 开源,由Google开发,用C ++编写

  • Rhin- 由Mozilla基金会开源,完全用Java开发

  • SpiderMonkey 第一个JavaScript引擎,Netscape Navigator,Firefox

  • JavaScriptCore 苹果公司为Safari开发

  • KJS 最初由Harri Porten为KDE项目的Konqueror网络浏览器开发

  • Chakra** (JScript9) Microsoft Edge

  • Chakra** (JavaScript) Microsoft IE9-IE11

  • Nashorn 作为OpenJDK的一部分,由Oracle Java语言和工具组编写

  • JerryScript 一个物联网的轻量级引擎

V8 是用 C++ 写的,使用了即时编译技术,工作模式如下图

在这个过程中,V8同时使用了Parser(解析器)、Ignition(解释器) 和TurboFan(编译器) 来执行Js代码。V8是被设计用来提高网页浏览器内部JavaScript执行的性能,那么如何提高性能呢?

为了提高性能,v8会把js代码转换为高效的机器码,而不在是依赖于解释器去执行。v8引入了 JIT在运行时把js代码进行转换为机器码。这里的主要区别在于V8不生成字节码或任何中间代码。

v8曾经有两个编译器(v5.9之前)

full-codegen — 一个简单且速度非常快的编译器,可以生成简单且相对较慢的机器码 Crankshaft —  一个更复杂的(Just-In-Time)优化编译器,生成高度优化的代码

v8充分多进程,主进程负责获取代码,编译生成机器码,有专门负责优化的进程,,还有一个监控进程负责分析那些代码执行比较慢,以遍Crankshaft 做优化,最后还有一个就是GC进程,负责内存垃圾回收。

V8执行Js代码的过程

1 Parser生成抽象语法树

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

函数
编译AST后

AST还广泛应用于各类项目中,比如Babel、ESLint,以及我们面试常说手写loader,那么AST的生成过程是怎么样的呢?

我们首先看一下Babel的实现:

// 解析 
let esprima = require('esprima') 
// 转换 
let estraverse = require('estraverse') 
// 生成 
let escodegen = require('escodegen') 
 
let code = `function code () {}` 
 
// 解析 
let ast = esprima.parseScript(code) 
// 转换 
estraverse.traverse(ast, { 
  enter (node) { 
    console.log('enter' + node.type) 
    if (node.type === 'enterIdentifier') { 
      node.name = 'hello' 
    } 
  }, 
  leave (node) { 
    console.log('enter' + node.type) 
  } 
}) 
// 生成 
let newCode = escodegen.generate(ast)

我们常说的生成AST不管是Babel 还是vue中 都是 解析这一步:

解析步骤接收代码并输出 AST。这个步骤分为两个阶段:词法分析(Lexical Analysis)和 语法分析(Syntactic Analysis)。

词法分析:将代码(字符串)分割为token流,即语法单元成的数组 语法分析:分析token流(上面生成的数组)并生成 AST 转换

var name = "react"
//转成token后为

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

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

2.Ignition生成字节码

解释器 Ignition 根据语法树生成字节码。TurboFan 是 V8 的优化编译器,TurboFan 将字节码生成优化的机器代码。

如果想知道为什么会有两种执行模式?点击查看视频 [](Franziska Hinkelmann: JavaScript engines - how do they even? | JSConf EU 2017)

字节码是机器代码的抽象。如果字节码采用和物理 CPU 相同的计算模型进行设计,则将字节码编译为机器代码更容易。这就是为什么解释器(interpreter)常常是寄存器或堆栈。Ignition 是具有累加器的寄存器。

您可以将 V8 的字节码看作是小型的构建块(bytecodes as small building blocks),这些构建块组合在一起构成任何 JavaScript 功能。V8 有数以百计的字节码。比如 Add 或 TypeOf 这样的操作符,或者像 LdaNamedProperty 这样的属性加载符,还有很多类似的字节码。V8还有一些非常特殊的字节码,如 CreateObjectLiteral 或 SuspendGenerator。头文件 bytecodes.h 定义了 V8 字节码的完整列表。

每个字节码指定其输入和输出作为寄存器操作数。Ignition 使用寄存器 r0,r1,r2,... 和累加器寄存器(accumulator register)。几乎所有的字节码都使用累加器寄存器。它像一个常规寄存器,除了字节码没有指定。例如,Add r1 将寄存器 r1 中的值和累加器中的值进行加法运算。这使得字节码更短,节省内存。

许多字节码以 Lda 或 Sta 开头。Lda 和 Stastands 中的 a 为累加器(accumulator)。例如,LdaSmi [42] 将小整数(Smi)42 加载到累加器寄存器中。Star r0 将当前在累加器中的值存储在寄存器 r0 中。

以现在掌握的基础知识,花点时间来看一个具有实际功能的字节码。

function incrementX(obj) {
  return 1 + obj.x;
}

incrementX({x: 42});
// V8 的编译器是惰性的,
// 如果一个函数没有运行,V8 将不会解释它

ps 如果要查看 V8 的 JavaScript 字节码,可以使用在命令行参数中添加 --print-bytecode 运行 D8 或Node.js(8.3 或更高版本)来打印。对于 Chrome,请从命令行启动 Chrome,使用 --js-flags="--print-bytecode",请参考 Run Chromium with flags。

$ node --print-bytecode incrementX.js
...
[generating bytecode for function: incrementX]
Parameter count 2
Frame size 8
  12 E> 0x2ddf8802cf6e @    StackCheck
  19 S> 0x2ddf8802cf6f @    LdaSmi [1]
        0x2ddf8802cf71 @    Star r0
  34 E> 0x2ddf8802cf73 @    LdaNamedProperty a0, [0], [4]
  28 E> 0x2ddf8802cf77 @    Add r0, [6]
  36 S> 0x2ddf8802cf7a @    Return
Constant pool (size = 1)
0x2ddf8802cf21: [FixedArray] in OldSpace
 - map = 0x2ddfb2d02309 <Map(HOLEY_ELEMENTS)>
 - length: 1
           0: 0x2ddf8db91611 <String[1]: x>
Handler Table (size = 16)
3.执行代码及优化

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

其实字节码配合解释器和编译器是很火的一种技术,例如 Python 和 Java 的虚拟机也是基于这种技术,我们把这种技术称为即时编译(JIT)。

这么多语言和工作引擎都使用了“字节码 + JIT”技术,其具体工作流程如下:

推荐阅读

(点击标题可跳转阅读)

RxJS入门

一文掌握Webpack编译流程

一文深度剖析Axios源码

Javascript条件逻辑设计重构
Promise知识点自测

你不知道的React Diff
你不知道的GIT神操作
程序中代码坏味道(上)

程序中代码坏味道(下)

学习Less,看这篇就够了

一文掌握GO语言实战技能(一)

一文掌握GO语言实战技能(二)

一文掌握Linux实战技能-系统管理篇

一文掌握Linux实战技能-系统操作篇

一文达到Mysql实战水平

一文达到Mysql实战水平-习题答案

从表单抽象到表单中台

vue源码分析(1)- new Vue

实战LeetCode 系列(一) (题目+解析)

一文掌握Javascript函数式编程重点

实战LeetCode - 前端面试必备二叉树算法

一文读懂 React16.0-16.6 新特性(实践 思考)

阿里、网易、滴滴、今日头条、有赞.....等20家面试真题

30分钟学会 snabbdom 源码,实现精简的 Virtual DOM 库


觉得本文对你有帮助?请分享给更多人

关注「React中文社区」加星标,每天进步

数学概念 | 旋转矩阵、欧拉角、四元数 旋转矩阵、欧拉角、四元数概念及相关运算; 阅读详情

相关推荐

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

V8是怎么执行JS代码的

1、V8的演进历史 2008年V8发布第一个版本,当时的V8架构比较激进,直接将js代码编译为机器码并执行,所以执行速度很快,但是只有Codegen一个编译器,所以对代码的优化很有限。 2010年V8发布了Crankshaft编译器,js代码会先被Full-Codegen编译器编译,如果后续改代码块会被多次执行,则会用Crankshaft编译器重新编译,生成更优化的代码,之后就使用优化后的代码来执行,进而提升性能。 Crankshaft编译器对代码的优化有限,所以2015年V8中加入了TurboFa

hfhan的博客 960

自动化测试-自愈技术

随着人工智能的发展,作为一名软件测试工程师,相信大家都会思考如何把这一前沿技术引入到我们的自动化测试当中,想一万遍不如做一遍。,传递当前页面状态,获取之前成功的定位器路径,比较它们,并生成修复的定位器列表。如果修复成功,我们可以使用 Healenium Idea 插件更新我们的自动化测试代码:插件使用修复定位器寻找修复和更新测试代码。的旧定位器去定位按钮的时候,脚本就会报错,提示 “NoSuchElement”的错误异常。现在,我们假设开发人员变更了应用程序的UI界面,改变了这个按钮的id属性,从。

qq_58223744的博客 2660

V8引擎如何执行JavaScript代码

原文地址: https://juejin.cn/post/6882301277032677384 前言 本文将为大家介绍,V8引擎如何执行JavaScript代码。 看完本文可以掌握,以下几个方面: JavaScript的执行原理; 浏览器内核的真实结构; 浏览器渲染引擎的工作过程; V8引擎的工作原理; 浏览器和Node.js架构的区别和练习; Node.js架构的应用场景和REPL; Node.js架构的REPL使用; PS:本篇文章为「Node.js系列」的第一篇,为邂逅Node

_ 1401

Android 13 灭屏音乐播放问题解决与优化建议

通过在中增加对音乐播放状态的检测,我们成功解决了客户应用在灭屏状态下音乐播放被中断的问题。

m0_60898338的博客 1157

js代码执行过程、调用栈、执行上下文

针对变量提升来说,我们知道在编译阶段会将变量、函数提升并存放于执行上下文的变量环境对象中,在执行阶段通过在调用栈管理的一个个上下文环境的变量环境对象中查找目标变量/函数。当函数执行时,会将函数最外层通过let、const声明的变量,并且不处于块级作用域内的变量,进行变量提升,初始化为undefined,然后压入栈底。在编译阶段,javascript引擎将变量的声明部分和函数的声明部分提升到代码开头,并且给被提升的变量设置默认值:undefined,同时这些被提升的变量将被放入到变量环境对象中。

foreverzwl 1716

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2052

day039: 描述一下 V8 执行一段JS代码的过程?

前端相对来说是一个比较新兴的领域,因此各种前端框架和工具层出不穷,让人眼花缭乱,尤其是各大厂商推出小程序之后各自制定标准,让前端开发的工作更加繁琐,在此背景下为了抹平平台之间的差异,诞生...

杨兴元的博客 490

RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件

Davinci Configurator配置工程导入DBC与CDD文件,开始Autosar开发

weixin_42412049的博客 8152

基于RK3568的YOLOv11模型端侧推理优化与部署实战指南

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

m0_64661770的博客 115

V8 如何执行一段JS代码?

计算机执行高级语言的两种方式 V8 如何执行一段JS代码? 1.生成 AST 生成 AST 分为两步——词法分析和语法分析。 词法分析 词法分析即分词,它的工作就是将一行行的代码分解成一个个token。 //比如下面一行代码: let name = 'sanyuan' 即解析成了四个token,这就是词法分析的作用。 语法分析 接下来语法分析阶段,将生成的这些 token 数据,根据一定的语法规则转化为AST。举个例子: let name = 'sanyuan' console.log(na

HZ___ZH的博客 316

AI智能体在零售行业的5大变革性应用

本文旨在全面介绍AI智能体在零售行业的关键应用场景,分析其技术原理和商业价值,帮助读者理解这些技术如何改变传统零售模式。文章将从核心概念入手,逐步深入五大应用场景的技术实现,最后探讨未来趋势和挑战。AI智能体:能够感知环境、做出决策并执行行动的智能软件实体机器学习:让计算机从数据中学习模式而无需显式编程的技术深度学习:基于神经网络的机器学习方法,能够处理复杂模式识别核心概念回顾AI智能体是零售数字化转型的关键驱动力从推荐系统到库存管理,AI正在重塑每个零售环节。

AI 原生应用开发的博客 1350

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

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

优快云学习 433

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

图解 Google V8 # 01:V8 是如何执行一段 JavaScript 代码的?

说明 图解 Google V8 学习笔记 什么是 V8? V8 是 JavaScript 虚拟机的一种,由 Google 开发的开源 JavaScript 引擎,目前用在 Chrome 浏览器和 Node.js 中,其核心功能是执行易于人类理解的 JavaScript 代码。 JavaScript 引擎种类: SpiderMonkey V8 JavaScriptCore … JavaScript 引擎将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言。 JavaScript

学习前端这门手艺,栈底到栈顶依次是:浏览器架构、Web 网络、事件循环机制、JavaScript 核心、V8 的内存管理、浏览器的渲染流程、Web 安全、CSS、React、Vue、Node、构建工具链等 1721

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

V8工作原理:V8是如何执行一段JavaScript代码的?

要理解 V8 的工作原理,你需要搞清楚一些概念和原理,比如接下来我们会从编译器(Compiler)、解释器(Interpreter)、抽象语法树(AST)、字节码(Bytecode)、即时编译器(JIT)概念来解释V8 是怎么工作的、如何执行JavaSCript的 编译器(Compiler)和解释器(Interpreter) 之所以存在编译器和解释器,是因为机器不能直接理解我们所写的代码,所以在执行程序之前,需要将我们所写的代码“翻译”成机器能读懂的机器语言。按语言的执行流程,可以把语言划分为编译型语言和解

qq_42501092的博客 1433

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

安卓如果执行js代码_day039: 描述一下 V8 执行一段JS代码的过程?

前端相对来说是一个比较新兴的领域,因此各种前端框架和工具层出不穷,让人眼花缭乱,尤其是各大厂商推出小程序之后各自制定标准,让前端开发的工作更加繁琐,在此背景下为了抹平平台之间的差异,诞生的各种编译工具/框架也数不胜数。但无论如何,想要赶上这些框架和工具的更新速度是非常难的,即使赶上了也很难产生自己的技术积淀,一个更好的方式便是学习那些本质的知识,抓住上层应用中不变的底层机制,这样我们便能...

weixin_36137385的博客 228

【描述一下 V8 执行一段JS代码的过程?】

优化:在代码执行期间,V8 还可以通过一些方法进行优化,例如,动态地重编译代码以提高执行速度,以及使用 JIT(Just-In-Time)编译器来编译热点代码以提高性能。执行代码:最后,V8 执行代码。词法分析:V8 首先读取 JS 代码,并将其分解成单个的标记或词汇单元(tokens),这些 tokens 是构建语言语法的基本元素。预编译(预处理):在执行代码之前,V8 还需要执行一些预编译步骤。总的来说,V8 的执行过程可以概括为:词法分析、语法分析、预处理、执行代码和优化。

前端-CV全粘工程师 420

在编译器和解释器中V8是如何执行一段JavaScript代码的?

本篇文章主要是站在 JavaScript 引擎 V8 的视角,来分析 JavaScript 代码是如何被执行的。前端工具和框架的自身更新速度非常块,而且还不断有新的出现。要想追赶上前端工具和框架的更新速度,就需要抓住那些本质的知识,然后才能更加轻松地理解这些上层应用。比如我们接下来要介绍的 V8 执行机制,从底层了解 JavaScript,深入理解语言转换器 Babel、语法检查工具 ESLint、前端框架 Vue 和 React 的一些底层实现机制。

浮游的博客 284

编译器和解释器:V8是如何执行一段JS代码的

JavaScript作为一种解释型语言,V8 在执行过程中既有解释器 Ignition 又有编译器 TruboFan

weixin_43443341的博客 1351

html不执行javascript代码_一段JavaScript代码放在V8引擎当中究竟是如何执行的呢?...

神三元:https://juejin.im/post/5dd8b3a851882572f56b578f?utm_source=bigezhang.com#heading-6首先需要明白的是,机器是读不懂 JS 代码,机器只能理解特定的机器码,那如果要让 JS 的逻辑在机器上运行起来,就必须将 JS 的代码翻译成机器码,然后让机器识别。JS属于解释型语言,对于解释型的语言说,解释器会对源代码做如下分...

weixin_32708653的博客 261

js图片转二进制流_V8是如何执行一段JS代码的?

汇编器 编译器 解释器解释执行和解释执行什么是V8?V8执行Js代码的过程汇编器 编译器 解释器众所周知,计算机只能理解机器语言,而我们平时编程用的通常是高级语言,所以源代码通常都要经过层层转换最终变成机器语言运行。早期只有汇编语言没有高级语言,不同的设备有一套自己的对应不同机器语言指令集的汇编语言,也就是说,汇编语言不能在不同CPU架构(intel ARM MIPS)之间移植。同一个软...

weixin_39610422的博客 283

V8引擎:编译器和解析器是如何执行一段javascript代码的?

前言 前面我已经说完了js引擎是如何存储数据,如何回收垃圾的,但这只是基础罢了,并不是v8引擎的最主要任务,接下来我要讲v8引擎的核心:如何执行js代码,为什么要学习这些东西呢? 前端工具和框架的自身更新速度非常快,github上开源的项目和工具也是层出不穷,要想追赶上这些工具的更新速度,快速学习,我们必须理解其底层原理,抓住那些本质的知识,万变不离其宗,无论前端框架工具怎么变,其实都是建立在原来的原生js之上的,我们理解了这些底层知识,相应的自然能快速理解这些上层应用了,也能帮助大家深入理解babel,语

abcsxc258的博客 747

14 _ 编译器和解释器:V8是如何执行一段JavaScript代码的?

好了,今天就讲到这里,下面我来总结下今天的内容。首先我们介绍了编译器和解释器的区别。紧接着又详细分析了V8是如何执行一段JavaScript代码的:V8依据JavaScript代码生成AST和执行上下文,再基于AST生成字节码,然后通过解释器执行字节码,通过编译器来优化编译字节码。基于字节码和编译器,我们又介绍了JIT技术。最后我们延伸说明了下优化JavaScript性能的一些策略。

所学所思 966

十、编译器和解释器:V8是如何执行一段JavaScript代码的?

站在 JavaScript 引擎 V8 的视角,来分析 JavaScript 代码是如何被执行的。 前端工具和框架的自身更新速度非常块,而且还不断有新的出现。要想追赶上前端工具和框架的更新速度,你就需要抓住那些本质的知识,然后才能更加轻松地理解这些上层应用。比如我们接下来要介绍的 V8 执行机制,能帮助你从底层了解 JavaScript,也能帮助你深入理解语言转换器 Babel、语法检查工具 ESLint、前端框架 Vue 和 React 的一些底层实现机制。因此,了解 V8 的编译流程能让你对语言以及相

知之为知之,不知为不知 865

14-编译器和解释器:V8是如何执行一段JavaScript代码的

站在 JavaScript 引擎 V8 的视角,来分析 JavaScript 代码是如何被执行的。 前端工具和框架的自身更新速度非常块,而且还不断有新的出现。要想追赶上前端工具和框架的更新速度,你就需要抓住那些本质的知识,然后才能更加轻松地理解这些上层应用。比如我们接下来要介绍的 V8 执行机制,能帮助你从底层了解 JavaScript,也能帮助你深入理解语言转换器 Babel、语法检查工具 ESLint、前端框架 Vue 和 React 的一些底层实现机制。因此,了解 V8 的编译流程能让你对语言以及相

LIJIWEI0611的博客 453
上一篇: 一文掌握GO语言实战技能(三)
下一篇: React 单元测试策略及落地
React 中文社区
博客等级 码龄6年 119粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值