[译]JavaScript 究竟是如何工作的?(第一部分)

  • 原文地址:How Does JavaScript Really Work? (Part 1)
  • 原文作者:Priyesh Patel

如果你是一个 JS 开发者或者是正在学习这门语言的学生,很大概率上你会遇到双字母词"V8"。在这篇文章中,我将会为你简述不同的 JS 引擎并深入探究 V8 引擎的工作机制。文章的第二部分涵盖了内存管理的概念,不久后将发布。

这篇文章是由 Bit (GitHub) 带来的。作为一个共享组件的平台,Bit 帮助每个人构建模块化的 JavaScript 应用程序,在项目和团队之间轻松地共享组件,同时实现更好&更快的构建。试试看。

1.编程语言是如何工作的?

在开始讲解 JavaScript 之前,我们首先要理解任意一门编程语言的基本工作方式。电脑是由微处理器构成的,我们通过书写代码来命令这台小巧但功能强大的机器。但是微处理器能理解什么语言?它们无法理解 Java,Python 等语言,而只懂机器码。 用机器语言或汇编语言编写企业级代码是不可行的,因此我们需要像 Java,Python 这样配带一个解释器或者编译器用于将其转换为机器码的高级语言。

1.1编译器和解释器

编译器/解释器可以用它处理的语言或任何其他语言来编写。

解释器: 一行一行地快速读取和翻译文件。这就是 JavaScript 最初的工作原理。

编译器: 编译器提前运行并创建一个文件,其中包含了输入文件的机器码转换。

有两种途径可以将 JavaScript 代码转换为机器码。编译代码时,机器对代码开始运行前将要发生的事情有更好的理解,这将加快稍后的执行速度。不过,在这个过程之前需要花费时间。

另一方面,解释代码时,执行是立即的,因此要更快,但是缺乏优化导致它在大型应用程序下运行缓慢。

创建 ECMAScript 引擎的人很聪明,他们集二者之长开发了 JIT(Just-in-time) 编译器。JavaScript 同时被编译和解释,但实际实现和顺序取决于引擎。我们将会看到 V8 团队采用的是什么策略。

2.从 JavaScript 到机器码

就 JavaScript 而言,有一个引擎将其转换为机器码。和其他语言类似,引擎可以用任何语言来开发,因此这样的引擎不止一个。

  • V8 是谷歌针对 Chorme 浏览器的引擎实现。
  • SpiderMonkey 是第一个引擎,针对网景浏览器开发,现用于驱动 FireFox。
  • JavaScriptCore 是苹果针对 Safari 浏览器使用的引擎。

还有很多,如果你想知道 Internet Explorer 背后的引擎,查看这个维基百科页面.

2.1 ECMAScript

面对这么多的引擎,你可能会问:我可以开发自己的引擎吗?可以,只要遵循 ECMAScript 标准。

如果我们打算做一个翻译器,那么就必须知道这两门语言的有效字。我们已经知道机器语言中什么是有效的了,但是对于 JavaScript,这是需要进行标准化的。

JavaScript 的标准化工作是由 Ecma 国际组织负责的,相关规范被称为 ECMAScript 或者 ES。因此,当你看到一篇文章/视频提到“ES7 有什么新特性?”时,你就知道它代表的是 ECMAScript 标准中新增的 JS 特性。

3.V8 引擎

3.1 部分历史

谷歌针对浏览器开发了谷歌地图,而这对浏览器的处理能力提出了很高的要求。那时的 JavaScript 实现尚不足以快速地运行地图。谷歌想要吸引更多的用户使用这项服务,从而进行广告销售并牟利。基于这个原因,这项服务必须快速且稳定。因此谷歌自己用 C++ 开发了 V8 引擎并在 2008 年启用,它的速度很快,或者就像一些人说的,它的速度是最快的。

3.2 解析和构建树

JavaScript 文件进入引擎后,解析器进行词法解析,它将代码分解成 token 以确定它们的含义。这些 token 组成了AST(抽象语法树)。

编译器在语义分析中验证语言元素和关键词的正确用法,而 ASTs 在这个过程中扮演着重要的角色。之后,ASTs 被用于生成实际的字节码或者机器码。

3.3 引擎的核心

  • 我们之前谈到,JavaScript 是由 Ignition 这个解释器解释的,同时由 TurboFan 这个 JIT 优化编译器进行编译。
  • 首先,前面步骤生成的 ASTs 传递给解释器,该解释器迅速生成未经过优化的机器码,并且其执行是无延迟的。
  • Profiler 在代码运行时进行观察,找出可以进行优化的地方。例如,一个‘for’循环跑了 100 次,但是每次迭代产生的结果都是一样的。
  • 使用这个分析器后,任何未优化的代码都将传递给编译器以进行优化,同时生成机器码,它最终会替换掉之前由解释器生成的未优化代码中的对应部分。
  • 随着分析器和编译器不断地更改字节码,JavaScript 的执行性能逐渐提高。

3.4 更多历史

在V8 的 5.9 版本推出之前,它使用两个优化编译器和一个基线编译器。

  • 基线编译器 full-codegen 迅速生成未优化的机器码。
  • 两个优化编译器 Crankshaft 和 TurboFan 用于优化代码。

JavaScript 增加了新的特性后,架构的复杂度上升,维护相同的管道对 V8 团队来说变得更加困难了。如果你想相关的旧方法以及转向新管道的原因,可以访问他们的网站。

3.5 放眼未来

随着更多进一步提升性能的研究的进行,V8 引擎的工作机制在未来还可能发生变化。此外,随着 Webassembly 逐渐成形,可能会向管道添加额外步骤。

4.结论

ECMAScript 引擎的实现有很多,其中以谷歌的 V8 最为出名。希望这篇文章的简述不仅可以帮助你理解 JavaScript 的工作原理,还能从大体上了解一门编程语言的工作原理。如果你想了解 V8 团队的未来计划或者引擎的细节,这里有一篇很不错的博客。

本文的第二部分将会在不久后发布,其中将谈到内存堆,栈,事件循环以及更多与 JavaScript 代码执行相关的概念。敬请关注!

如果你不清楚 Node.js 在其中的作用,我这里碰巧写了一篇不错的文章: What exactly is Node.js?

转载于:https://juejin.im/post/5cef7f1be51d45777811732c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue实战(9):总结二

整理前一段所做的工作内容 0.其它 vue实战(1):准备与资料整理vue实战(2):初始化项目、搭建底部导航路由vue实战(3):底部导航显示、搭建各模块静态页面、添加登录页页面与…

一名IT从业者的英语口语能力成长路径

这篇文章是我最近十天口语系列文章的合辑,文章比较长,一万五千余字。但是系统化地归纳了自己十多年的英语尤其是口语方面的学习经历与总结思考。我不是个纯粹的英语专业学生,我甚至不是任何英语相关专业的学生,但是我和英语却有着…

解决:SpringBoot 错误:Caused by: org.yaml.snakeyaml.scanner.ScannerException

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 错误: Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next tokenfound character that cannot s…

好程序员前端分享使用JS开发简单的音乐播放器

好程序员前端分享使用JS开发简单的音乐播放器,最近,我们在教学生使用JavaScript,今天就带大家开发一款简单的音乐播放器。首先,最终效果如图所示:首先,我们来编写html界面index.html,代码如下:&…

学生管理系统stuSystem函数

void stuSystem(){ struct student *head,*stu; int lookup_num; int Delete_num; int Modify_num; char ckeya; int istate0; do { system("cls"); //vc清屏函数&#xff0c;包含在#include<stdlib.h>中 printf(" 欢迎进入学生管理系统&#xff01;\n&q…

OpenCL用于计算机领域的13个经典案例

摘要&#xff1a;当使用加速器和OpenCL时&#xff0c;哪种类型的算法更加快速&#xff1f;来自弗吉尼亚理工大学的Wu Feng教授和他的团队例举了一份算法列表&#xff0c;分享了OpenCL常被用于计算机领域的13个经典案例。 哪种算法可以最好的映射GPU及矢量处理器呢&#xff1f;…

版本控制:集中式(SVN) vs 分布式(GIT)

Linus一直痛恨的CVS及SVN都是集中式的版本控制系统&#xff0c;而Git是分布式版本控制系统&#xff0c;集中式和分布式版本控制系统有什么区别呢&#xff1f; 先说集中式版本控制系统&#xff0c;版本库是集中存放在中央服务器的&#xff0c;而干活的时候&#xff0c;用的都是…

Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件

为什么80%的码农都做不了架构师&#xff1f;>>> 作者| 阿里云智能事业群高级开发工程师 元毅 Knative 主要由 Build、Serving 和 Eventing 三大核心组件构成。Knative 正是依靠这三个核心组件&#xff0c;驱动着 Knative 这艘 Serverless 巨轮前行。下面让我们来分…

树莓派基金会来号召用键盘生物学家研究企鹅

伦敦动物学会&#xff08;Zoological Society of London&#xff09;于2014年&#xff0c;与伍兹霍尔海洋研究所和牛津大学等组织合作监控企鹅的计划Penguin Lifelines有了新进展&#xff0c;伦敦动物学会现与其他动物保护组织合作Penguin Watch项目&#xff0c;邀请民众在网上…

BlockingCollectionT 类实现 列队操作

官方文档 为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能。 通过 BlockingCollection<T> 实现列队调用函数 建立全局变量 BlockingCollection<string> blockingCollection new BlockingCollection<string>(); 建立调用函数…

Git 版本回退

现在&#xff0c;你已经学会了修改文件&#xff0c;然后把修改提交到Git版本库&#xff0c;现在&#xff0c;再练习一次&#xff0c;修改readme.txt文件如下&#xff1a; Git is a distributed version control system. Git is free software distributed under the GPL.然后尝…

AMD院士站台 异构计算与OpenCL编程师资培训首站清华开讲

摘要&#xff1a;2013年10月14日&#xff0c;“2013年异构计算与OpenCL编程师资培训”在清华大学召开。本活动邀请到AMD、Khronos Group及清华大学的多位并行计算领域专家&#xff0c;与参会者共同探讨OpenCL异构开发和优化技术。 2013年10月14日&#xff0c;由教育部科技发展…

【问题记录】RIDE-1.7.3.1控制台及日志中文乱码处理

RIDE-1.7.3.1运行结果界面展示: 解决方法参考链接&#xff1a; https://blog.csdn.net/panda62/article/details/88535376 转载于:https://www.cnblogs.com/quietCorner/p/11046656.html

GPU Saturday技术沙龙:OpenCL程序员眼中的下一代APU架构

摘要&#xff1a;GPU Saturday技术沙龙在北京3WCoffee成功举办。本次活动邀请AMD资深技术人员及清华大学项目研究员就AMD最新的GCN架构、GPU加速计算在挖掘比特币、典型图像算法、深度神经网络算法等领域的分析与应用展开深入讨论。 [CSDN报道] 9月5日&#xff0c;GPU Saturda…

直接取出 post 请求中的 json、得请求体参数、查看 post 请求参数

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 方法如下&#xff1a; try{ServletRequestAttributes requestAttributes (ServletRequestAttributes) RequestContextHolder.getReques…

SparkSQL调优

1、执行计划&#xff08;过往记忆https://www.iteblog.com/archives/2562.html&#xff09; df.explain(true)//显示逻辑计划和物理计划&#xff0c;不加true只显示物理计划 2、逻辑计划优化方法&#xff1a; 谓词下推&#xff0c;列裁剪&#xff0c;常量替换&#xff0c;常量累…

AMD发布APPML源码,构建clMath库

摘要&#xff1a;日前&#xff0c;AMD将加速并行处理数学库&#xff08;Accelerated Parallel Processing Math Library简称APPML&#xff09;开源&#xff0c;内容包含了BLAS和FFT的OpenCL实现&#xff0c;项目托管在GitHub上&#xff0c;命名为clMath&#xff0c;该项目基于A…

最简单的 post 请求发起方式、调用其它系统接口

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 调用其它系统接口&#xff0c;发起一个 post 请求&#xff0c;写法如下&#xff1a; import cn.com.infinitus.yunxiao.jira.vo.EpicV…

CSS基础学习 18.CSS多列

四种常见的浏览器内核&#xff1a; 转载于:https://www.cnblogs.com/songsongblue/p/11050210.html

BGP

BGP&#xff1a;border gateway protocol 边界网关路由协议 路由协议分类&#xff1a;内部网关路由协议IGP&#xff1a;rip ospf isis &#xff08;eigrp&#xff09;外部 网关路由协议EGP&#xff1a;EGP&#xff08;早期淘汰&#xff09; BGP BGP特点&#xff1a;1、针对大型…