原文:JavaScript引擎和Just-In-Time编译:初学者的探索,第1部分JavaScript引擎本身也是一种转换软件你华丽的JavaScript代码行被转换成我们的机器可以执行的二进制代码。所有主流浏览器都开发了自己的JavaScript引擎。Chrome有V8,Firefox运行SpiderMonkey(第一个JavaScript引擎的演变,由BrendanEich在90年代为NetscapeNavigator开发),MicrosoftEdge有Chakra,Safari有Nitro。Node.js建立在Chrome的V8引擎之上。物联网设备也可以有一个JavaScript引擎。每个JavaScript引擎都负责使用由EcmaInternational的TC39制定的ECMAScript规则和标准。为什么现代JavaScript引擎进行即时编译JavaScript是一种动态类型的语言。letx=8lety="Henlofren"这意味着每当你在JavaScript中声明一个变量时,你不必明确说明变量x存储什么样的信息。JavaScript引擎在执行源代码时检查类型。在C++等静态类型语言中声明变量时,必须明确指定变量值的类型。intx=8stringy="Henlofren"有了如此严格的规则,静态类型语言可以有更高的学习曲线。在尝试编写一个简单的程序之前,您必须更多地了解它的规则和类型。然而,从编译器的角度来看,静态类型语言允许更快的性能。首先,当编译器开始将代码转换为可执行的机器代码二进制文件时,该语言会为编译器提供大量有关源代码的信息。另一方面,像JavaScript这样的动态类型语言向编译器提供的有关其类型的信息很少。这在生成机器代码之前为编译器创建了另一层工作,使其比静态编写语言的编译速度慢。但不要害怕,这就是即时编译的用武之地!最初开发JavaScript时,它旨在编写少量脚本来增强网页。随着开发人员开始构建和使用更多的JavaScript框架和库,并发出AJAX请求,对更好更快性能的需求不断增长。当Chrome于2008年推出时,谷歌也推出了其V8引擎,这是现代JavaScript引擎中的第一个。V8的主要特性之一是即时编译——Just-In-Timecompilation。在提前编译中,编译过程必须在系统运行可执行机器代码之前完成。有了Just-In-Time编译的新特性,V8引擎会根据需要编译源代码,在执行编译过程生成的机器码时收集类型信息,然后根据编译过程中收集到的信息重新编译源代码。执行过程。两个进程之间的来回加速执行过程的性能。为了让JavaScript以最快的速度运行,同时仍然是动态类型的,JavaScript引擎有一些巧妙的技巧。与大多数现代JavaScript引擎一样,V8有两个编译器:基线编译器和优化编译器。当V8编译你的JavaScript代码时,它的解析器会生成一个叫做抽象语法树的东西。Ignition,V8的基线编译器或解释器,从这个语法树生成字节码。Ignition忠实于它的即时编译特性,它编译JavaScript代码,运行它,编译它,运行它,来回,一遍又一遍。在运行时,字节码被分析,引擎识别可以重新编译以获得最佳性能的部分(“热函数”),并将该代码发送到V8的优化编译器TurboFan。正是因为有了just-in-timecompilation,引擎才能够识别这些所谓的“hotfunctions”,因为just-in-timecompilation。+运算符和V8优化在她出色的演讲TheJavaScriptEngine中,V8工程师FranziskaHinkelmann使用+运算符来解释V8的优化是如何工作的。乍一看,加法运算符似乎很简单,任何编译器都可以编译和执行它。但是如果你看看Ecma规范,在程序实际添加任何东西之前引擎实际上需要经过很多步骤:这些步骤中的每一个都调用其他函数,这些函数又调用其他函数,等等。所有引擎都必须遵循这些Ecma规范,所以JavaScript不仅无法无天。因此,当您的程序有一个将两个整数相加的函数时,在您第一次调用该函数时,JavaScript引擎会逐一执行这些步骤,最终将两个整数相加。当它经历JIT过程(编译、运行、编译、运行、编译等)时,它意识到您的函数很热,很热,很热,因为您一直在调用它。根据引擎在运行时收集的信息,它还意识到这个特定函数使用的数据类型只是整数。有了这些信息,V8将你的代码发送给它的优化器编译器TurboFan,它会为你的函数生成更好的机器代码。下次您再次调用该函数时,它将跳过冗长的Ecma步骤,您的函数将运行得更快。但是,当您决定在调用函数时连接一些字符串而不是添加两个整数时会发生什么?V8将该函数丢给反优化器,将其发送回Ignition,然后Ignition再次执行那些Ecma指定的步骤来运行该函数。更多Jerry原创文章在这里:《王子熙》:
