前言
我们把偏向硬件的语言称为低级语言,可以通过低级语言直接来控制硬件的行为,最低级的语言就是机器语言
而把偏向人类, 人类更易读的语言称为高级语言,可以通过高级语言间接的控制硬件的行为,最高级的语言就是人类的语言
高级语言和低级语言对比
越高级的语言越简单越抽象,更方便读和写,但执行效率越差,高级语言需要逐步转换成更低级的语言才能被硬件使用,越高级中间的转化时间越长,效率越低
越低级的语言执行速度越快,但是不易读,很难编写代码,并且编写的代码容易出错,比如很难做内存管理,经常导致内存泄漏并且很难追踪、解决问题,同时低级语言很难兼容众多的CPU平台

Javascript就是一门高级语言
运行时编译(Just-In-Time Compilation)
Javascript是一门动态类型语言,它虽然是一门动态语言,但执行起来依然很快,尤其是在启动时,用node运行一段代码,几乎瞬间完成,这是因为现代的Javascript引擎都是用了一项技术:
Just-In-Time Compilation(运行时编译JIT),JIT就是在运行阶段生成机器代码,JIT把代码的运行和生成机器代码是结合在一起的,在运行阶段收集类型信息,然后根据这些信息编译生成机器码,之后再运行这些代码时,就直接使用生成好的机器代码。

Javascript引擎
Javascript是一门高级语言,它被计算机CPU执行前,需要通过某种程序将JS转换成低级的机器语言并执行。这种程序就被称做为Javascript引擎,比如:
谷歌Chrome使用的V8引擎
webkit使用的JavaScriptCore
Mozilla的SpiderMonkey
FeacBook的QuickJS
React Native的Hermes
虽然引擎众多,但在编译javascript的流程是差不多的

Javascript引擎编译js的流程
首先将JS源码通过解析器,解析成抽象语法树AST,接着再通过解析器将AST编译成字节码bytecode,字节码是跨平台的一种中间表示,不同于最终的机器代码,字节码与平台无关,能够在不同操作系统上运行,字节码最后通过编译器生成机器代码。由于不同的平台使用的机器代码会有差异,所以编译器会根据当前平台来编译出相应的机器代码,这里的机器码其实就是汇编代码。



小结
拓展学习最著名的V8引擎的一个工作原理,更深入理解JS引擎的运行机制。
网友评论