JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍-阿里云开发者社区

开发者社区> -技术小能手-> 正文

JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍

简介: JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍
+关注继续查看

原文:JavaScript engines and Just-In-Time compilation: A beginner’s exploration, part 1


JavaScript 引擎本身也是一种软件,它将您华丽的 JavaScript 代码行转换为我们的机器可执行的二进制代码。

image.png

所有主要浏览器都开发了自己的 JavaScript 引擎。 Chrome 有 V8,Firefox 运行 SpiderMonkey(第一个 JavaScript 引擎的进化产品,由 Brendan Eich 在 90 年代为 Netscape Navigator 开发),Microsoft Edge 有 Chakra,Safari 有 Nitro。 Node.js 建立在 Chrome 的 V8 引擎之上。 物联网设备也可以有一个 JavaScript 引擎。


每个 JavaScript 引擎都负责使用 Ecma International 的 TC39 制定的 ECMAScript 规则和标准。


Why modern JavaScript engines do Just-In-Time compilation

JavaScript 是一门动态类型语言。

image.png

这意味着无论何时你在 JavaScript 中声明一个变量,你都不必明确说明变量 x 存储的信息类型。 JavaScript 引擎在执行源代码时检查类型。

在静态类型语言(如 C++)中声明变量时,您必须显式指定变量值的类型。

image.png

有了如此严格的规则,静态类型语言可以具有更高的学习曲线。在尝试编写一个简单的程序之前,您必须更多地了解它的规则和类型。


然而,从编译器的角度来看,静态类型语言允许更快的性能。预先,当编译器开始将代码转换为可执行的机器代码二进制时,该语言为编译器提供了大量有关源代码的信息。


另一方面,像 JavaScript 这样的动态类型语言很少向编译器提供有关其类型的信息。这为编译器在生成机器代码之前创建了另一层工作,使其执行速度比静态编写语言的编译慢。


But fear not, this is where Just-In-Time compilation comes in!

最初开发 JavaScript 时,它旨在编写少量用于增强网页的脚本。随着开发人员开始构建和使用更多 JavaScript 框架和库,以及发出 AJAX 请求,对更好、更快性能的需求不断增长。


当 Chrome 于 2008 年推出时,谷歌还首次发布了其 V8 引擎,这是现代 JavaScript 引擎中的第一个。 V8 的主要特性之一是即时编译 - Just-In-Time compilation。


在 Ahead-of-Time 编译中,编译过程必须在系统运行可执行机器代码之前完成。有了 Just-In-Time compilation 这一新特性,V8引擎会根据需要编译源代码,在执行编译过程生成的机器码时收集类型信息,然后根据执行过程收集的信息重新编译源代码。两个进程之间的来回加快了执行过程的性能。


为了让 JavaScript 在动态类型的情况下仍能以最快的速度运行,JavaScript 引擎有一些巧妙的技巧。


像大多数现代 JavaScript 引擎一样,V8 有两个编译器:基线 (baseline)编译器和优化编译器。


当 V8 编译你的 JavaScript 代码时,它的解析器会生成一种叫做抽象语法树的东西。Ignition,V8 的基线编译器或解释器,从这个语法树生成字节码。 Ignition 忠实于它的即时编译特性,它编译 JavaScript 代码,运行它,编译它,运行它,来回,一遍又一遍。


在运行时,字节码被分析,引擎识别可以重新编译以获得最佳性能的部分(“热函数”),将该代码发送到 TurboFan,它是 V8 的优化编译器。正是因为即时编译,引擎才能够因为即时编译而识别这些所谓的“热功能”。

image.pngThe + operator and V8 optimization

在她的精彩演讲 JavaScript 引擎中,V8 工程师 Franziska Hinkelmann 使用 + 运算符来解释 V8 的优化是如何工作的。


乍一看,加法运算符可能看起来很简单,任何编译器都可以编译和执行。 但是,如果您查看 Ecma 规范,在程序实际添加任何内容之前,引擎实际上需要执行很多步骤:

image.png这些步骤中的每一步都在调用其他函数,而这些函数又可能调用其他函数,依此类推。所有引擎都必须遵循这些 Ecma 规范,因此 JavaScript 不仅仅是无法无天的。


因此,当您的程序有一个将两个整数相加的函数时,当您第一次调用该函数时,JavaScript 引擎会费力地完成这些步骤中的每一步,最终将您的两个整数相加。当它通过 JIT 过程(编译、运行、编译、运行、编译等)时,它意识到你的函数很热,很热,很热,因为你一直在调用它。从引擎在运行时收集的信息,它也意识到这个特定函数使用的数据类型只是整数。有了这些信息,V8 将您的代码发送到 TurboFan,它的优化器编译器,它为您的函数生成更好的机器代码。下次您再次调用该函数时,它会跳过冗长的 Ecma 步骤,您的函数将运行得更快。


但是当您决定在调用该函数时连接一些字符串而不是添加两个整数时会发生什么? V8 将该函数抛出到去优化器,将其发送回 Ignition,然后 Igntion 再次执行那些 Ecma 指定的步骤来运行该函数。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10093 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2511 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13893 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9161 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
22412 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4510 0
1727
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载