JS运行原理

  • JS概述
  • 动态类型语言(js)与静态类型语言(c++)的区别
  • js引擎大致运行过程


JS概述

动态类型语言(js)与静态类型语言(c++)的区别

Javascript借鉴了C语言的基本语法,Java语言的数据类型和内存管理,借鉴了Schema语言的函数式子编程,同时又借鉴了Self语言,使用了基于原型prototype的继承机制。所以javascript语言实际上是这两种语言风格的混合产物。

javascript和C的语法 js和c语言的关系_动态类型


在Js中我们只需定义一个变量,然后可以给这个变量赋任何类型的值,但这在C++中不一样,在C++中我们必须提前声明变量类型,并且还要付对正确的值。所以我们称javascrirpt是一门动态类型语言,而C++是静态类型语言。

由于提供的信息太少,Js的语言特性让我们没有办法在运行前知道变量的类型,只有在运行期间确定各个变量的类型,这就导致了在js在运行前无法编译出机器代码;而在C++中,我们会提供足够多的类型信息来帮助编译器编译出机器代码。虽然js是一门动态语言,但它执行起来依然很快,这是因为现在的js引擎都使用了一项技术叫Just-In-Time Compliation(运行时编译),JIT是在运行阶段生成机器代码,而不是提前生成(在运行阶段收集类型信息,然后根据这些信息编译生成机器码,之后再运行这些代码时就直接使用编译好的机器代码)。

PS:还有另外一种方式叫AOT(ahead of time),就是在运行前提前生成好机器代码,比如像C++这样的语言用的就是这种方式

javascript和C的语法 js和c语言的关系_javascript和C的语法_02

js引擎大致运行过程

JavaScript引擎有许多种比如谷歌Chrme使用的V8引擎,Mozilla的SpiderMonkey等等。

javascript和C的语法 js和c语言的关系_js引擎_03


这些引擎编译Js时大致流程都差不多,首先将Js语法通过解析器解析成抽象语法树(AST)

javascript和C的语法 js和c语言的关系_字节码_04


接着再通过解释器将AST编译成字节码bytecode

javascript和C的语法 js和c语言的关系_javascript和C的语法_05


字节码是跨平台的一种中间表示。

不同于最终的机器代码,字节码与平台无关,能够在不同的操作系统上运行。

字节码最终通过编译器生成机器代码。

javascript和C的语法 js和c语言的关系_javascript和C的语法_06


由于不同的处理器平台使用的机器码会有差异,所以编译器会根据当前平台来编译出相应的机器代码