编译过程
分析
把源程序分解成为多个组成的要素,并在要素之上加上语法结构.然后它使用这种结构来创建该源程序的一个中间表示.如果分析部分检查出源程序没有按照正确的语法构成,或者语义不一致,它就必须提供有用的信息,使得用户按此进行改正.分析部分还会收集有关源程序的信息,并把信息存放在一个称为符号表(symbol table)的数据结构中.符号表将和中间表示形式一起传送给综合部分.
综合
根据中间表示和符号表中的信息来构造用户期待的目标程序.分析部分经常被称为编译器的前端,而综合部分称为编译器的后端.
编译步骤
如图,在实践中,多个步骤可能被组合在一起,而这些被组合在一起的步骤之间的中间表示不需要被明确的构造出来.存放整个源程序的符号表可由编译器的各个步骤使用.
有些编译器在前端和后端之间有一个与机器无关的优化步骤.这个优化步骤的目的是在中间表示上进行进行转换,以便后端程序可以生成更好的目标程序.如果基于未经过优化步骤的中间表示来生成代码,则代码的质量会受影响.
词法分析
词法分析器读入组成源程序的字符流,并将他们组成有意义的词素(lexeme)的序列.对于每个词素,词法分析器产生如下形式的词法单元作为输出:
<token-name, attribute-vlaue>
token-name是一个由语法分析步骤使用的抽象符号, attribute-vlaue指向符号表中关于这个词法单元的条目.符号表条目的信息会被语义分析和代码生成步骤使用.
语法分析/解析
语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示.该中间表示给出了词法分析中的词法单元流的语法结构.一个常用表示是一个语法树,树中的每个内部节点表示一种运算,而该节点的子节点表示该运算的分量.
语义分析
语义分析器使用语法树和符号表中的信息来检查源程序是否和语言定义的语义相一致.它同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用.
语义分析的一个重要部分是类型检查.编译器检查每个运算符是否具有匹配的运算分量. eg,浮点数作为数组下标,就会出错.
程序语言可能允许某些类型转换,称为自动类型转换
中间代码生成
很多编译器生成一个明确的低级的或类机器语言的中间语言. 这种中间语言应该易于生成并且能够轻松的被翻译为目标机器上的语言.
网友评论