JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍
原文:JavaScript engines and Just-In-Time compilation: A beginner’s exploration, part 1
JavaScript 引擎本身也是一种软件,它将您华丽的 JavaScript 代码行转换为我们的机器可执行的二进制代码。
所有主要浏览器都开发了自己的 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 是一门动态类型语言。
let x = 8
let y = "Henlo fren"
这意味着无论何时你在 JavaScript 中声明一个变量,你都不必明确说明变量 x 存储的信息类型。 JavaScript 引擎在执行源代码时检查类型。
在静态类型语言(如 C++)中声明变量时,您必须显式指定变量值的类型。
int x = 8
string y = "Henlo fren"
有了如此严格的规则,静态类型语言可以具有更高的学习曲线。在尝试编写一个简单的程序之前,您必须更多地了解它的规则和类型。
然而,从编译器的角度来看,静态类型语言允许更快的性能。预先,当编译器开始将代码转换为可执行的机器代码二进制时,该语言为编译器提供了大量有关源代码的信息。
另一方面,像 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 的优化编译器。正是因为即时编译,引擎才能够因为即时编译而识别这些所谓的“热功能”。
The + operator and V8 optimization
在她的精彩演讲 JavaScript 引擎中,V8 工程师 Franziska Hinkelmann 使用 + 运算符来解释 V8 的优化是如何工作的。
乍一看,加法运算符可能看起来很简单,任何编译器都可以编译和执行。 但是,如果您查看 Ecma 规范,在程序实际添加任何内容之前,引擎实际上需要执行很多步骤:
这些步骤中的每一步都在调用其他函数,而这些函数又可能调用其他函数,依此类推。所有引擎都必须遵循这些 Ecma 规范,因此 JavaScript 不仅仅是无法无天的。
因此,当您的程序有一个将两个整数相加的函数时,当您第一次调用该函数时,JavaScript 引擎会费力地完成这些步骤中的每一步,最终将您的两个整数相加。当它通过 JIT 过程(编译、运行、编译、运行、编译等)时,它意识到你的函数很热,很热,很热,因为你一直在调用它。从引擎在运行时收集的信息,它也意识到这个特定函数使用的数据类型只是整数。有了这些信息,V8 将您的代码发送到 TurboFan,它的优化器编译器,它为您的函数生成更好的机器代码。下次您再次调用该函数时,它会跳过冗长的 Ecma 步骤,您的函数将运行得更快。
但是当您决定在调用该函数时连接一些字符串而不是添加两个整数时会发生什么? V8 将该函数抛出到去优化器,将其发送回 Ignition,然后 Igntion 再次执行那些 Ecma 指定的步骤来运行该函数。
更多Jerry的原创文章,尽在:“汪子熙”:
JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍相关推荐
- 混合云的概念以及优势劣势简单介绍
运营商目前多数部署云计算采取的都是混合云的模式.但还有很多人不清楚什么是混合云?混合云有哪些优势和劣势?今天我们就给大家简单介绍一下. 混合云的概念 混合云,有时称为云混合,是一种将本地数据中心(也称 ...
- JAVA 文件编译执行与虚拟机(JVM)简单介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...
- CSS的概念及优势(简单介绍)
概念: CSS:层叠样式表(Cascading Style Sheets) css可以用来为网页创建样式表,通过样式表可以对网页进行装饰. 所谓层叠,可以将整个网页想象成一层一层的结构,层次高的将会覆 ...
- python中列表概念,Python 列表的简单介绍
这篇文章即<Python的变量和简单数据类型>之后的总结文章(Eric Matthes <Python编程从入门到实践>第三章) 什么是列表 列表同样是每一个编程语言都需要的数 ...
- WML教程2:简单介绍关于WML文件的概念WML Decks
WML教程2:简单介绍关于WML文件的概念WML Decks 这里简单介绍一个关于WML文件的概念,其他的细节问题会在后面的章节还详细介绍. 声明 由于WML语言继承于XML,所以一个有效的WML文档 ...
- JavaScript引擎研究与C、C++与互调用(转)
本文转自:ice6015的专栏.为什么有些招聘需要熟悉JS和C++,这或许就是原因. 1. 概要 JavaScript是一种广泛用于Web客户端开发的脚本语言,常用来控制浏览器的DOM树,给HTML ...
- javascript引擎执行的过程的理解--执行阶段
一.概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 1.语法分析: 分别对加载完成的代码块进行语法检验 ...
- (三)JVM成神路之全面详解执行引擎子系统与JIT即时编译原理
引言 执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于"物理机"的概念,与物理机一样,都具备代码执行的能力.但 ...
- 功能强大的JavaScript引擎--SpiderMonkey
JavaScript是由Netscape开发的对象脚本语言,其特点是开发简单.功能灵活,目前已广泛应用于WEB页面及服务器应用程序中.HTML本身是静态的.不允许用户干预,但用JavaScript编写 ...
最新文章
- 关于v$process与v$session中process的理解
- iis7.5 php7.0,(原创)win7自带IIS7.5+php7.0.10安装教程(图)
- apache属于哪个公司
- Levenshtein Distance算法(编辑距离算法)
- semaphore的使用
- 释放内存软件_原来苹果手机这样清理内存,可以释放大量空间,真是太好用了...
- 学习,学习javascript
- ACM训练计划建议(转)
- 使用cURL操作Openstack对象存储的ReST API
- Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控
- 如何彻底修改SQL server的数据库名
- wamp php不可用_PHPWAMP开启php
- 《Java从入门到放弃》框架入门篇:在MyEclipse中创建SpringBoot项目
- 白领控诉:被逼下乡5年,我们的幸福何处寻找
- 【Nodejs】732- 我为 Express 开了外挂
- 用python画五角星
- threejs 加载两个场景_three.js 场景切换
- C语言中的静态变量和静态函数
- 随手记——老夫死活记不住定理
- 1.1 C++小游戏——创造世界