摘要:引擎是能运行代码的程序或解释器。代码的运行明显的分成两个阶段,也就是编译阶段和运行字节码阶段。它首先由编译器编译成字节码文件,然后再通过虚拟机从文件中读一行解释执行一行。
Javascript引擎是能运行javascript代码的程序或解释器。做为前端开发人员,了解javascript底层的工作原理,可以用助于写出高效的javascript代码。那我们就来看一下,我们写的代码是如何在javascript引擎中运行的。
javascript引擎如何解释执行javascript代码大家都知道javascript属于解释型语言,所谓解释型语言就是引擎直接读取源码,然后出结果,这样做效率非常低。相对的大家都知道C++代码执行很快,因为C++属于编译型语言,所谓编译型语言就是把源代码编译成可执行程序后才可以运行,C++就是把源代码编译成本地代码后执行的。编译的过程没有时间要求,所以在编译的过程中可以做更多的优化,生成执行更快的代码。
下面我们先来看一下早期JavaScript引擎的执行过程:
再看一下C++语言的编译过程:
开发人员开发完源代码后,使用编译器将源代码编译成本地代码(机器码/汇编代码), 用户只是使用编译后的本地代码,这些本地代码被系统加载器加载后,由操作系统调度CPU直接执行。因为经过编译器源代码被编译成了本地代码,可以由操作系统直接执行,所以它的执行速度飞快。
我们再来看一下另一个老牌语言——Java的运行过程。Java代码的运行明显的分成两个阶段,也就是编译阶段和运行字节码阶段。它首先由编译器编译成.class(字节码)文件,然后再通过JVM(Java虚拟机)从.class文件中读一行解释执行一行。也正是由于不同的操作系统有不同的JVM,所以实现了真正意义上的跨平台。
在这里在给大家介绍一下字节码和本地代码的区别:
字节码是跨平台的一种中间表示,该字节码与平台无关,需要借助虚拟机解释执行
本地代码与操作系统有关,不同的操作系统编译成的本地代码不同
既然Java的执行过程是使用解释器执行字节码,这样肯定比C++直接执行本地代码速度上要慢,为了解决执行的性能问题,Java引入了一个特别NB技术 —— JIT(Just-In-Time)。这个为啥NB呢,因为它的主要作用就是解决解释性语言的性能问题。哈哈^^! 这个技术的主要思想是当解释器解释代码时,不仅仅解释字节码,而且将其中一些字节码(主要是使用率高的部分)转成本地代码,这样就可以被CPU直接执行,从而极大地提高性能。这个技术被广泛地使用在各种语言的执行环境中,如Java虚拟机,JavaScript的众多引擎中。
随着JavaScript越来越受欢迎,JavaScript引擎也在不断的向前辈学习,努力提高Javascript执行速度。我们来看一下现在的JavaScript引擎的执行过程:
在现在JavaScript引擎中,大致的执行过程是:
编译器将源代码编译成抽象语法树,再将抽象语法树编译成字节码;解释器来接收字节码,解释执行这些字节码;JIT工具,分析这些字节码并将其中的部分字节码转换成本地代码。
这个过程和Java的编译和执行过程很像,只是Java语言中这两个阶段是分开执行的,编译阶段可以尽可能的生成高效的字节码,这样在执行阶段可以执行的更快。而对于Javascript而言,它的编译阶段是在网页和JavaScript文件下载后同执行阶段一起在网页的加载和渲染过程中来实施的,所以对于JavaScript引擎执行过程中的每个阶段时间越少越好。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/94049.html
摘要:前端面试题及答案总结掘金技术征文金三银四,金九银十,用来形容求职最好的几个月。因为的存在,至少在被标准化的那一刻起,就支持异步编程了。然而异步编程真正发展壮大,的流行功不可没。 showImg(https://segmentfault.com/img/bVVQOH?w=640&h=319); 1、2017前端面试题及答案总结 |掘金技术征文 金三银四,金九银十,用来形容求职最好的几个月...
摘要:学编程真的不是一件容易的事不管你多喜欢或是多会编程,在学习和解决问题上总会碰到障碍。熟练掌握核心内容,特别是和多线程初步具备面向对象设计和编程的能力掌握基本的优化策略。 学Java编程真的不是一件容易的事,不管你多喜欢或是多会Java编程,在学习和解决问题上总会碰到障碍。工作的时间越久就越能明白这个道理。不过这倒是一个让人进步的机会,因为你要一直不断的学习才能很好的解决你面前的难题...
摘要:与大多数全局对象不同,没有构造函数。为什么要设计更加有用的返回值早期写法写法函数式操作早期写法写法可变参数形式的构造函数一般写法写法当然还有很多,大家可以自行到上查看什么是代理设计模式代理模式,为其他对象提供一种代理以控制对这个对象的访问。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 19 篇。 如果你错过了前面的章节,可以在这里找到它们: 想阅读更多优质文章请...
摘要:本章会对语言引擎,运行时,调用栈做一个概述。调用栈只是一个单线程的编程语言,这意味着它只有一个调用栈。查看如下代码当引擎开始执行这段代码的时候,调用栈会被清空。之后,产生如下步骤调用栈中的每个入口被称为堆栈结构。 原文请查阅这里,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland。 本系列持续更新中,Github 地址请查阅这里。 这是 JavaScript 工作原...
摘要:本章会对语言引擎,运行时,调用栈做一个概述。调用栈只是一个单线程的编程语言,这意味着它只有一个调用栈。查看如下代码当引擎开始执行这段代码的时候,调用栈会被清空。之后,产生如下步骤调用栈中的每个入口被称为堆栈结构。 原文请查阅这里,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland。 本系列持续更新中,Github 地址请查阅这里。 这是 JavaScript 工作原...
阅读 2007·2021-11-18 10:02
阅读 2831·2021-09-04 16:41
阅读 1129·2019-08-30 15:55
阅读 1338·2019-08-29 17:27
阅读 1032·2019-08-29 17:12
阅读 2459·2019-08-29 15:38
阅读 2837·2019-08-29 13:02
阅读 2759·2019-08-29 12:29