翻译: 江吉仪
校队: 金俊
JavaScript 在开发者圈子当中名声是很糟糕,它是无类型,松类型的,如跨浏览器会引起很多困扰,Douglas Crockford是 JavaScript 的作者:JavaScript 包括了一些很棒的想法,也包含 了一些很糟糕的想法.JavaScript 在 1995只花了十天就创造出来了.直到三年之后 ECMA 才决定将其标准化,微软最初决定不支持新的标准,差点就把 JavaScript 扼杀在摇篮里。
第一个 JavaScript 的引擎是网景公司的 codenamed SpiderMonkey,只是一个读取并代码的解释器。在当时,JavaScript 通常包含一些写在页面顶部的函数和某些内联的事件。如果不急的话,编译代码的效率还是令人满意的。
我们跳过最初无序的十年,到 2004 年,谷歌推出了新的应用:谷歌地图,对于JavaScript 的开发者来说,这是一个逐渐改变规则的人。 JavaScript 引擎只是执行一遍代码,这让浏览器陷入了困境。
网上有无数的文章详细解释和描述了JavaScript 的引擎,你可以可以在文末"了解更多"查看。这个话题即使是很多开发者也不是很清楚,现在我简单介绍一下 js 的引擎,特别是现在火热的 V8.
大多数 JavaScript 引擎执行代码需要以下几个步骤首先,词汇分析将代码分解成来标记识别其含义,然后解析器分析这些标记.并构建到中间语言的语法树中.最后JIM编译器执行这些代码.
2008 年谷歌发布加强版的引擎 -v8
v8引擎会使用几个线程,主线程,就像你预料的一样:获取代码,编译,执行。同时还有一个线程是编译的线程,以便于主线程可以继续执行,同时这个是优化代码,以及一个探查器线程,记录我们执行时间太长的方法,以便于优化。还有一些线程是垃圾收集和消除无效代码。
v8有两个编译器,Full-Codegen和Crankshaft。Full-Codegen将 JavaScript 直接编译成机器码,不需要中间语言,让它更快执行,名为Full-Codegen的JIT 编译器为热方法生成优化代码.这意味着在 V8 程序中,不同级别的优化代码可以同时共存。
速度来自于Crankshaft编译器.当 Full-Codgen 在运行时,运行时分析器会识别“热代码”这些代码已执行多次。此时,当前线程停止执行您的代码并将其传递给Crankshaft。所有优化的基础都是内联缓存,这是Smaltalk开创的技术。它包括立即用更好的代码修补代码。
解析后的JS首先被编译为一个名为Hydrogen,其中大多数优化都已完成。这是类型专门化发生的地方,类型专门化删除JavaScript所谓的装箱和拆箱操作。例如,如果您的脚本经常在一组整数上运行一个函数,它避免了解析字符串和浮点数的所有必要步骤,然后保存解析整数所必需的步骤,这样就不必再次运行它们。
因为JS是无类型的,所以不能保证专门生成的代码将继续工作,可调用你的函数来处理字符串或doubles。现在必须对此代码进行去优化,从正在运行的线程中退出并替换为原始运行时代码。这是通过称为运行时替换栈帧(OSR)的技术实现的。 OSR是在优化和未优化代码之间切换时保留当前堆栈帧语义的机制。使用OSR,当您的函数参数切换类型时,会把优化过的代码拉出来并将您的线程转回原始的Hydrogen生成的线程以进行重新编译。
Crankshafts的最终工作是将表示降低到一个名为Lithium的级别,这是特定于体系结构的。锂是最终转化为机器代码的表示。在这里,我们再次看到OSR。所有这些步骤都在您的浏览器或应用程序中运行,现在我们有一个完全编译和优化的版本,我们可以在执行过程中切换到优化版本。
同时运行两个编译器,性能就可以提高27%。而且远不止于此。每六周,V8团队就会发布一个新分支。 9月11日,该团队发布了6.2版,将在几周内与Chrome 62一起发布。下一个版本包括团队称之为“各种面向开发人员的好东西”和性能优化。点击这里查看。
查看更多
2008 年谷歌发布加强版的引擎 -v8 Chrome V8 开发者频道: developers.google.com/v8/
红帽开发者: Javascript 引擎 和 执行对比(V8, Chakra, Chakra Core): developers.redhat.com/blog/2016/0…
Lars Bak: V8: 一个开源 JavaScript 引擎: www.youtube.com/watch?v=hWh…
Daniel Clifford: Google I/O 2012 - 突破 V8的速度限制: www.youtube.com/watch?v=UJP…
原文地址: