12

Javascript引擎是能运行javascript代码的程序或解释器。做为前端开发人员,了解javascript底层的工作原理,可以用助于写出高效的javascript代码。那我们就来看一下,我们写的代码是如何在javascript引擎中运行的。

javascript引擎如何解释执行javascript代码

大家都知道javascript属于解释型语言,所谓解释型语言就是引擎直接读取源码,然后出结果,这样做效率非常低。相对的大家都知道C++代码执行很快,因为C++属于编译型语言,所谓编译型语言就是把源代码编译成可执行程序后才可以运行,C++就是把源代码编译成本地代码后执行的。编译的过程没有时间要求,所以在编译的过程中可以做更多的优化,生成执行更快的代码。

下面我们先来看一下早期JavaScript引擎的执行过程:

图片描述

再看一下C++语言的编译过程:

图片描述

开发人员开发完源代码后,使用编译器将源代码编译成本地代码(机器码/汇编代码), 用户只是使用编译后的本地代码,这些本地代码被系统加载器加载后,由操作系统调度CPU直接执行。因为经过编译器源代码被编译成了本地代码,可以由操作系统直接执行,所以它的执行速度飞快。

我们再来看一下另一个老牌语言——Java的运行过程。Java代码的运行明显的分成两个阶段,也就是编译阶段和运行字节码阶段。它首先由编译器编译成.class(字节码)文件,然后再通过JVM(Java虚拟机)从.class文件中读一行解释执行一行。也正是由于不同的操作系统有不同的JVM,所以实现了真正意义上的跨平台。

图片描述

在这里在给大家介绍一下字节码和本地代码的区别:

  1. 字节码是跨平台的一种中间表示,该字节码与平台无关,需要借助虚拟机解释执行
  2. 本地代码与操作系统有关,不同的操作系统编译成的本地代码不同

既然Java的执行过程是使用解释器执行字节码,这样肯定比C++直接执行本地代码速度上要慢,为了解决执行的性能问题,Java引入了一个特别NB技术 —— JIT(Just-In-Time)。这个为啥NB呢,因为它的主要作用就是解决解释性语言的性能问题。哈哈^^! 这个技术的主要思想是当解释器解释代码时,不仅仅解释字节码,而且将其中一些字节码(主要是使用率高的部分)转成本地代码,这样就可以被CPU直接执行,从而极大地提高性能。这个技术被广泛地使用在各种语言的执行环境中,如Java虚拟机,JavaScript的众多引擎中。

随着JavaScript越来越受欢迎,JavaScript引擎也在不断的向前辈学习,努力提高Javascript执行速度。我们来看一下现在的JavaScript引擎的执行过程:

图片描述

在现在JavaScript引擎中,大致的执行过程是:

编译器将源代码编译成抽象语法树,再将抽象语法树编译成字节码;解释器来接收字节码,解释执行这些字节码;JIT工具,分析这些字节码并将其中的部分字节码转换成本地代码。

这个过程和Java的编译和执行过程很像,只是Java语言中这两个阶段是分开执行的,编译阶段可以尽可能的生成高效的字节码,这样在执行阶段可以执行的更快。而对于Javascript而言,它的编译阶段是在网页和JavaScript文件下载后同执行阶段一起在网页的加载和渲染过程中来实施的,所以对于JavaScript引擎执行过程中的每个阶段时间越少越好。


冰果
99 声望5 粉丝