我们知道计算机识别的语言并不是我们所看到的代码,而是对这些代码进行编译之后的机器语言,而将我们写的代码,转化成机器语言的过程,就被称为编译。
下面我们会来看一下计算机是如何对一段代码进行编译的,当然我们并不能清清楚楚的介绍每一步,只能说一下大概的步骤,而且真正详细的过程对我们来说也没有必要了解的清清楚楚。
传统的编译语言的流程中,大致可以分为三个步骤:
1. 分词/词法分析
这个过程很容易理解,就是将一段代码,分割成一个个的有意义的代码块,这些代码块被称为词法单元。比如 var a = 2;。分词之后就会产生 var,a,=,2,;。五个词法单元(也不一定是五个,其中的空格会不会被分割成单独的词法单元,要看不同语言对空格不同的解析了)
上面的解释中我们一直没有提词法分析这个词,其实词法分析就是计算机将 var a = 2;这句代码进行分析,转化为一个个词法单元的过程,带入这段代码来说就是分析var是一个词法单元,还是v,a,r三个。
2. 解析/语法分析
这个过程就是将词法单元流(词法单元组成的数组)转换成一个有元素逐级嵌套所组成的代表程序语法结构的树,称作抽象语法树(AST)
3. 代码生成
最后一步就是计算机能识别的代码的生成了,说白了就是将AST转换成可执行代码的过程。
这个过程中的具体细节我们不去了解,也很难理解清楚(滑稽),简单的说,就是var a = 2;转化成机器指令,计算机识别这条机器指令创建一个a的变量,分配内存等,并将2存储在a中。
大部分的语言都会在一开始先将代码进行编译,然后执行,但是我们要学习的JavaScript并不一样,JavaScript的编译发生在代码执行前的几微秒,甚至更短,说白了就是该执行var a = 2;这句代码了才将这句代码编译,然后就直接执行他。