在传统编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤。统称为“编译”。
- 分词/词法分析(Tokenizing/Lexing)
例如,var a = 2; 。这段程序通常会被分解成为下面这些词法单元:var、a、=、2、;。空格是否被当做词法单元,取决于空格在这么语言中是否具有意义。(如Python中的代码是以4个空格来进行缩进的,那么空格就会被当作词法单元)
分词(tokenizing)和词法分析(Lexing)之间的主要差异在于词法单元的识别是通过有状态还是无状态的方式进行的。如果词法单元生成器在判断a是一个独立的词法单元还是其他词法单元的一部分时,调用的是有状态的解析规则,这么这个过程就被称为词法分析。反之,如果词法单元生成器在判断a是一个独立的词法单元还是词法单元的一部分时,调用的是无状态的解析规则,那么这个过程就被称为分词。
- 解析/语法分析(Parsing)
- 代码生成
简单来说,JavaScript代码在执行前会先进行编译。