编译原理

在传统编译语言的流程中,程序中的一段源代码在执行 之前 会经历三个步骤,统称为“编 译”。

词法分析(Lexing)

这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代 码块被称为词法单元(token)。

例如,考虑程序 var a = 2; 。这段程序通常会被分解成 为下面这些词法单元:

var 、 a 、 = 、 2 、 ; 。

空格是否会被当作词法单元,取决于空格在这门语言中是否具有意义。


语法分析

这个过程是将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法

结构的树。这个树被称为“抽象语法树”(Abstract Syntax Tree,AST。

var a = 2; 的抽象语法树中可能会有一个叫作 VariableDeclaration 的顶级节点,接下 来是一个叫作 Identifier (它的值是 a )的子节点,以及一个叫作 AssignmentExpression 的子节点。 AssignmentExpression 节点有一个叫作 NumericLiteral (它的值是 2 )的子 节点。


代码生成

将 AST 转换为可执行代码的过程称被称为代码生成。这个过程与语言、目标平台等息 息相关。

抛开具体细节,简单来说就是有某种方法可以将 var a = 2; 的 AST 转化为一组机器指 令,用来 创建 一个叫作 a 的变量(包括分配内存等),并将一个值储存在 a 中。


比起那些编译过程 只有 三个步骤的语言的编译器, JavaScript 引擎要复杂得多。 例如, 在 语法分析和代码生成阶段有特定的步骤来对运行性能进行优化,包括对冗余元素进行优化 等。

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-10-18 03:22:12

results matching ""

    No results matching ""