前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript 视觉化:JavaScript 引擎

JavaScript 视觉化:JavaScript 引擎

作者头像
前端黑板报
发布于 2023-03-08 13:58:26
发布于 2023-03-08 13:58:26
4980
举报
文章被收录于专栏:前端黑板报前端黑板报

JavaScript 很酷😎,但是机器是如何真正读懂你所写的代码?作为一名 JavaScript 开发者,我们通常是不需要自己处理编译的。然而,了解 JavaScript 引擎的基础知识,看看它是如何处理我们的对人类友好的 JavaScript 代码,并将其转化为机器能够理解的东西,绝对是一件好事!

注意:这篇文章以 Node.js 和 Chromium 为核心使用的 V8 为基础来讲解的。

HTML 解析器在源码中遇到 script 标签,源码可能会从网络、缓存或者 service worker. 中加载,相应的脚本会作为字节流,通过字节流解码器来处理!字节流解码器对正在下载的字节流进行解码。

1

字节流解码器从已经解码的字节中创建 tokens,例如:0066 解码为 f, 0075 为 u, 006e 为 n, 0063 为 c, 0074 为 t, 0069 为 i, 006f 为 o。006e 解码为 n 其后跟着一个空格,就像你写了一个 function!这是 JavaScript 的保留字,创建了一个 token 接着发送到解析器(以及预解析器,但在 gif 图中没有表示出来,后面会做解释),剩下的字节流也会按照这个流程进行。

2

引擎使用了 2 中解析器:预解析器和解析器。为了减少加载网页的时间,引擎不会解析现在不需要的代码。当解析器正在处理立即需要的代码时,预解析器可能后续才会派上用场。若一个函数只在用户点击按钮后才调用,那在加载网页时并不需要立即编译那些代码。若用户最终点击了按钮然后需要那段代码时,它就会被发送到解析器。

解析器以从字节流解码器获取的 token 为基础来创建节点,这些节点就构成了 Abstract Syntax Tree, 或 AST. 🌳

111

接下来,轮到解释器遍历整个 AST 然后通过 AST 包含的信息创建字节码。一旦字节码全部生产,AST 就会被删除同时清除所占的内存空间,最后,我们得到了机器可以识别的内容。

22

虽然字节码已经很快,但它还可以更快。当字节码运行的时候,一些信息就会生成,浏览器可以检测某些行为是否经常发生,以及被使用的数据类型。或许你已经调用某个方法很多次:是时候优化它了,所以它会执行的更快!

字节码和生成的类型反馈,会被送到一个优化编译器。它通过字节码和类型反馈信息,生成优化程度更高的机器码。

5

JavaScript 是一个动态类型的语言,意味着数据的类型会经常变动。若 JavaScript 引擎每次都要检测该数据类型是否包含合适的值将会极其的慢。

为了减少解析代码的时间,优化的机器码只处理引擎在运行字节码时曾遇到的情况。如果我们使用了一块始终返回同样数据类型的代码片段,为了加快速度,优化的机器可以被简单的使用。然而,由于 JavaScript 是动态类型的,可能会发生同是一块代码返回不同类型的数据。若发生,优化的机器码将会失效,接着引擎回退到解释生成的字节码。

话说若一个特定的函数被调用了 100 次都返回相同的值,引擎将会假设它在 101 次时还会返回同一个值。

我们假设有如下 sum 函数,一直通过数字类型的参数调用:

返回值是 3,下次我们再调用的时候,引擎会假设我们依旧使用数字类型的值来调用。

若真是那样,不需要动态类型的检查,引擎只使用优化的机器码就行。然而,若假设失败,引擎会回退到起初的字节码替代优化的机器码。

例如,下次我们调用它时,我们传入了一个字符串而不是数字,由于 JavaScript 是动态类型的,我们可以这样做并不会报错:

意味着 2 会被强制转化为字符串,而该函数会返回字符串 12。引擎会返回解释执行字节码和跟新类型反馈。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端黑板报 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
⚙️JavaScript引擎了解下
本文翻译自🚀⚙️ JavaScript Visualized: the JavaScript Engine 作为JavaScript开发者,我们不需要编译自己编写的代码。那么,JavaScript引擎到底怎么处理这些JS代码,转换成机器能懂的东西呢?🥳 注意:本文主要是基于Node.js的V8引擎和基于Chromium内核的浏览器。 正文 通过script标签,HTML解析器识别到javascript代码。 javascript代码要么来自网络,要么来自缓存,或者安装的service worker 请
Jimmy_is_jimmy
2022/03/10
2360
⚙️JavaScript引擎了解下
【动画演示】JavaScript 引擎运行原理
作者:Lydia Hallie 译者:前端小智 来源: dev JavaScript 很酷,但是 JS 引擎是如何才能理解我们编写的代码呢?作为 JS 开发人员,我们通常不需要自己处理编译器。然而,了
前端小智@大迁世界
2022/06/15
8400
【动画演示】JavaScript 引擎运行原理
动图学 JavaScript 之: JS 引擎原理
JS 实在是太酷了(认真脸),那你有没有想过机器是怎么解析 JS 代码的?作为一个 JS 开发者,一般我们不需要直接跟编译器打交道,但是如果可以了解其中的基本原理,相信会对以后的工作和学习都有帮助的!
savokiss
2020/01/17
2.1K1
动图学 JavaScript 之: JS 引擎原理
分享一篇可视化的JS引擎执行流程
接触了前端这么久以来,你每天跟JS打交道,你肯定也和我一样认为JavaScript很酷。但机器怎么能真正理解你写的代码呢?
程序员海军
2021/10/11
1.8K0
分享一篇可视化的JS引擎执行流程
【JavaScript运行原理之V8引擎】V8引擎解析JavaScript代码原理
高级语言最终都需要编译为低级语言才能被硬件执行,越高级的语言中间的转换时间越长,效率越低,越低级的语言执行素的越快,但是由于缺少高级语言便捷的语法特性所以很难编写代码。
CODER-V
2023/03/11
5360
深入理解 JavaScript 引擎
食堂老板:这块的知识不仅面试可能会问,学会了 JS 引擎的工作原理,可以更好的理解 JavaScript、更好的理解前端生态中 Babel 的词法分析和语法分析,ESLint 的语法检查原理以及 React、Vue 等前端框架的实现原理。总之,学习引擎原理可谓是一举多得。
ConardLi
2021/09/29
1K0
深入理解 JavaScript 引擎
浅析V8引擎,让你更懂JavaScript!
导语 | 本文介绍了编译、解释、动静态语言等基本概念,以及V8引擎的基本流程。本文将对其进行详细阐述,希望为更多的开发者提供经验和帮助。 一、编译与解释 二进制指令就是机器码: 编译:将源代码一次性转换成目标代码的过程。执行编译过程的程序叫编译器(Compiler)。 解释:将源代码逐条转换成目标代码,同时逐条运行的过程。执行解释过程的程序叫解释器(Interpreter)。解释器一般来说就是vm,vm有两种,一种是基于堆栈,一种是基于寄存器。 编译过程大致包括词法分析、语法分析、语义分析、性能优化、生成
腾讯云开发者
2022/03/17
8470
《现代Javascript高级教程》JavaScript引擎的工作原理
JavaScript是一种脚本语言,常用于前端开发和后端服务器开发。在浏览器环境中,JavaScript的执行是由JavaScript引擎负责的。了解JavaScript引擎的工作原理,对于理解代码的执行过程、优化性能以及解决一些常见问题都非常有帮助。本文将深入探讨JavaScript引擎是如何解析和执行代码的,以及相关的优化技术和调试工具。
linwu
2023/07/27
2430
V8是如何执行JavaScript代码的?
众所周知,我们通过编程语言完成的程序是通过处理器运行的。但是处理器不能直接理解我们通过高级语言(如C++、Go、JavaScript等)编写的代码,只能理解机器码,所以在执行程序之前,需要经过一系列的步骤,将我们编写的代码翻译成机器语言。这个过程一般是由编译器(Interpreter) 或者解释器(Compiler) 来完成。
腾讯IVWEB团队
2020/06/29
1.5K0
V8是如何执行JavaScript代码的?
JavaScript代码是如何被执行的
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。根据语言的执行流程,可以把语言分成编译型语言和解释型语言。
木子星兮
2020/07/16
1.2K0
深入剖析JavaScript引擎的工作原理
JavaScript引擎主要由解析器(Parser)、解释器(Interpreter)、优化器(Optimizer)和垃圾回收器(Garbage Collector)等部分组成。
肥晨
2024/03/22
3950
JavaScript 是怎么运行起来的?
JavaScript 的运行原理,是我面试的时候经常会问到的问题,但是根据过往的面试结果来看,这部分能理解的很清楚的不足 20%,大多数同学热衷于去学习一些 Vue、React 这样的框架,以及一些新的 API,却忽视了语言的根本,这是个非常不好的现象。
ConardLi
2022/02/18
6400
JavaScript 是怎么运行起来的?
V8 执行 JavaScript 的过程
? 这是第 102 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:V8 执行 JavaScript 的过程 https://www.zo
政采云前端团队
2021/06/15
1K0
V8 执行 JavaScript 的过程
重学JS-1.3-知识点:V8引擎
V8是一个由Google开发的开源JavaScript引擎,用于Chrome、Node.js等环境中,作用是将JS代码编译为不同CPU(Intel, ARM以及MIPS等)对应的汇编代码。
luciozhang
2023/04/22
7360
重学JS-1.3-知识点:V8引擎
V8 引擎:基于类型推测的性能优化原理
本文的会介绍一些关于V8内基于推测的优化的技术,以此来告诉大家,为什么需要TypeScript。
Tecvan
2022/12/07
6790
V8 引擎:基于类型推测的性能优化原理
⚡切图仔?你知道 V8 是如何执行 JS 代码的吗?
源代码首先通过解析器解析成 AST ,然后 AST 再通过解释器解释成最终的字节码
小丞同学
2022/11/16
1.2K0
⚡切图仔?你知道 V8 是如何执行 JS 代码的吗?
⚡切图仔?你知道 V8 是如何执行 JS 代码的吗?
源代码首先通过解析器解析成 AST ,然后 AST 再通过解释器解释成最终的字节码
小丞同学
2021/09/03
1.3K0
⚡切图仔?你知道 V8 是如何执行 JS 代码的吗?
深入剖析 JavaScriptCore
最近开始涉及 JS 的解析和处理工作,所以专门研究了下这块。特别是动态类型的处理以及不同引擎对于平台无关的字节码的设计和处理会有很大的帮助。
用户7451029
2020/06/16
1.3K0
深入剖析 JavaScriptCore
Google V8引擎
V8的前世今生 V8是JavaScript渲染引擎,第一个版本随着Chrome的发布而发布(具体时间为2008年9月2日)。在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。V8可以独立运行,也可以嵌入到C++应用程序中运行。 随着Web技术的快速发展,JavaScript所要承担的工作也越来越多,早就超
xiangzhihong
2018/01/26
1.8K0
JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述
Rhino和Nashorn都是用Java实现的JavaScript引擎。它们自身都是普通的Java程序,运行在JVM上
周陆军博客
2023/04/09
3.4K0
推荐阅读
相关推荐
⚙️JavaScript引擎了解下
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档