分享好友 最新动态首页 最新动态分类 切换频道
JavaScript 语法解析、AST、V8、JIT
2024-12-26 20:25
作者 | 肖沐宸

来源 | https://github.com/cheogo/learn-javascript

JavaS<i></i>cript 语法解析、AST、V8、JIT

JavaScript 是如何执行的

对于常见编译型语言(例如:Java)来说,编译步骤分为:词法分析->语法分析->语义检查->代码优化和字节码生成。

对于解释型语言(例如 JavaScript)来说,通过词法分析 -> 语法分析 -> 语法树,就可以开始解释执行了。

具体过程是这样的

1、词法分析是将字符流(char stream)转换为记号流(token stream)

2、语法分析成 AST (Abstract Syntax Tree),你可以在这里试试 http://esprima.org/

3、预编译,当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理!并且是先预声明变量,再预定义函数

4、解释执行,在执行过程中,JavaScript 引擎是严格按着作用域机制(scope)来执行的,并且 JavaScript 的变量和函数作用域是在定义时决定的,而不是执行时决定的。

JavaScript 中的变量作用域在函数体内有效,无块作用域

JavaScript 引擎通过作用域链(scope chain)把多个嵌套的作用域串连在一起,并借助这个链条帮助 JavaScript 解释器检索变量的值。

这个作用域链相当于一个索引表,并通过编号来存储它们的嵌套关系。

当 JavaScript 解释器检索变量的值,会按着这个索引编号进行快速查找,直到找到全局对象(global object)为止,如果没有找到值,则传递一个特殊的 undefined 值。

V8、JIT

我们常说的 V8 是 Google 发布的开源 JavaScript 引擎,采用 C++ 编写。SpiderMonkey(Mozilla,基于 C)、Rhino(Mozilla,基于 Java,而 Nodejs 依赖于 V8 引擎开发,接下来的内容是 JavaScript 在 V8 引擎中的运行状态,而类似的 JavaScript 现代引擎对于这些实现大同小异。

在本文的开头提到了编译型语言,解释型语言。JavaScript 是解释型语言且弱类型,在生成 AST 之后,就开始一边解释,一边执行,但是有个弊端,当某段代码被多次执行时,它就有了可优化的空间(比如类型判断优化,而不用一次次的去重复之前的解释执行。

编译型语言如 JAVA,可以在执行前就进行优化编译,但是这会耗费大量的时间,显然不适用于 Web 交互。

于是就有了,JIT(Just-in-time,JIT 是两种模式的混合。

它是如何工作的呢

1、在 JavaScript 引擎中增加一个监视器(也叫分析器)。监视器监控着代码的运行情况,记录代码一共运行了多少次、如何运行的等信息,如果同一行代码运行了几次,这个代码段就被标记成了 “warm”,如果运行了很多次,则被标记成 “hot”。

2、(基线编译器)如果一段代码变成了 “warm”,那么 JIT 就把它送到基线编译器去编译,并且把编译结果存储起来。

比如,监视器监视到了,某行、某个变量执行同样的代码、使用了同样的变量类型,那么就会把编译后的版本,替换这一行代码的执行,并且存储。

3、(优化编译器)如果一个代码段变得 “hot”,监视器会把它发送到优化编译器中。

生成一个更快速和高效的代码版本出来,并且存储。例如:循环加一个对象属性时,假设它是 INT 类型,优先做 INT 类型的判断

4、(去优化)可是对于 JavaScript 从来就没有确定这么一说,前 99 个对象属性保持着 INT 类型,可能第 100 个就没有这个属性了,那么这时候 JIT 会认为做了一个错误的假设,并且把优化代码丢掉,执行过程将会回到解释器或者基线编译器,这一过程叫做去优化。

优化代码图例

“hot” 代码

优化前

优化后

总结

明白一些基本原理能拓展出更多的东西,比如

1、var a = 10; var b = 20; ==> var a=10, b=20; 这些改代码的好处是什么,如何从原理解释

2、JavaScript 的函数和变量是在什么时候声明的,函数声明和函数表达式的区别

3、如何通过编译器的优化原理,如何提高 JavaScript 的执行效率

本文完~

学习更多技能

请点击下方公众号

最新文章
这些A股光存储概念股名单,你需要知道!(12月12日)
  据南方财富网概念查询工具数据显示,相关光存储概念股:  1、中电兴发002298:12月12日消息,中电兴发5日内股价上涨13.23%,该股最新报6.880元涨3.28%,成交7.58亿元,换手率16.78%。  公司于2020年2月19日晚间披露2019年度非公开
都江堰seo优化价格【百度都江堰】
文章都江堰seo优化价格【百度都江堰】由网友旧时月色投稿,希望给你工作学习带来帮助。在当今数字化时代,搜索引擎优化(SEO)对于企业和个人的在线存在至关重要,都江堰作为一个充满活力和发展潜力的城市,也有许多企业和个人希望通过 SEO
构建个人投资组合网站:从基础到进阶
在数字时代,个人投资组合网站成为展示工作成果、技能和专业身份的不可或缺的平台。构建这样的网站不仅可以增强职业形象,还能在求职和客户互动中发挥关键作用。本章将引导你从零开始,详细探讨构建个人投资组合网站的整
谷歌浏览器ipad版
谷歌浏览器ipad版是专门针对苹果ipad设备而开发的一款平板电脑浏览器,全新的外观融入了Material Design设计元素,图形更醒目、操作更流畅、触感更灵敏,能够带给用户流畅的上网体验。另外本款google chrome浏览器ipad版同时还具备网页翻译
连城网站排名优化费用是如何计算的?
连城目前的关键词排名方式有哪些?连城目前关键词排名主要分为竞价排名和自然排名。1、连城关键词自然排名,指的是通过各种搜索引擎优化(seo)方式,使您网站的关键词在搜索引擎自然排名中靠前。2、连城关键词竞价排名,通过对搜索引擎充
请问小红书如何设定推广目标以实现精准引流与品牌爆发?
小红书作为一个集社交、内容分享与电商于一体的平台,为品牌提供了广阔的营销空间。要实现精准引流与品牌爆发,设定明确的推广目标并制定相应的营销策略至关重要。以下是一份详细的小红书营销攻略:一、设定推广目标提升品牌知 名度:通过
百度推出惊雷算法:严厉打击快速排名,对SEO有什么影响?
百度资源搜索平台于11月20日零点发布惊雷算法通知,为什么选择这个时间节点,可能希望有一个全新的起点吧,另外一个原因站长们都是夜猫子,这个时间点,可能大家访问频率比较高。  还是言归正传,百度惊雷算法都说了什么?  百度搜索将于
颜姓股民向ST亚联发起索赔 章祥兵律师接受咨询
  12月16日消息,新浪股民维权平台今日收到颜姓股民针对(维权)的维权申请,目前该维权咨询已被章祥兵律师接受。新浪股民维权平台将关注该股民的索赔进程,相关维权持续征集中。  新浪股民维权平台目前有14名专业律师可代理该公司维权
超逼真美女写真生成:最强AI工具评测与实用攻略
5. DeepArt DeepArt是另一个输出高质量逼真图像的强大工具。它利用深度学习算法,将图片转化为艺术画作,风格多样,结果令人惊艳。尽管种类选择丰富,但其绘制时间相对较长,用户需要耐心等待。总的来说,各个工具各有优劣,用户可以根据个
谷歌商店国际服(Google Play 商店)
谷歌商店国际服免费下载,一款为玩家带来丰富多样紫云的手机应用商城。在这里,玩家动动手指即可搜索到自己感兴趣的。类型丰富,超多的资源实时推送,免费分享,一键即可下载畅玩。绿色安全,无广无毒,随时随地查看,乐趣满满。1、谷歌商
相关文章
推荐文章
发表评论
0评