编译技术(1)-前置知识

2023-04-12发布于计算机科学与技术专业知识 | 最后更新于2023-04-12 09:04:00

编译原理 编译技术

第1章 前置知识

编译器及其基本结构

  1. 编译器本质上就是一个“翻译”程序,可以将用某种语言编写的源程序“翻译”为另一种语言(显然包括机器语言)编写的目标程序。当源程序有错误时,编译器显然也要有所反应。

    需要注意的是,相较于编译器,解释器不会生成目标程序,而是直接根据源程序和用户输入执行程序。

  2. 上述的翻译过程非常复杂,往往无法一下子完成,总的来说,这样的“翻译”会分为前端和后端两个部分

    编译器的前端与后端

    前端(理解源程序):分解源程序为若干组成元素并附加语法结构,构建源程序的IR,处理符号表

    后端(映射程序到目标机器):根据IR和符号表构建目标程序

  3. IR可能不止一个,为了简化前端和后端的处理,可以将其细分为更小的部分,这也是典型的处理方式

    典型编译过程

  4. 编译器的伙伴程序

    • 预处理器:处理宏定义、文件包含等信息
    • 汇编器:将汇编语言转为目标机器指令
    • 链接器:链接从汇编器中得到的多个汇编语言程序
  5. “遍”,即读入一个输入文件并产生一个输出的过程。在实现编译器时,可以将多个步骤放在同一遍中完成,也就是多个步骤同时进行与完成。

    显然,单遍编译器不用构造中间表示,多遍编译器编译时每一遍都将一种IR转换成另一种,循序渐进的完成整个编译过程

典型编译过程

词法分析

  1. 目的:从源程序的连续字符序列中识别出有意义的单词(token),并将其转换为词法单元作为词法分析的输出,作为语法分析的抽象记号输入
  2. 词法单元:一个词法单元可以由词法记号属性组成,词法记号指出了单词的类别(例如运算符、标识符、关键字、整数、实数),属性则保存了编译后面步骤要使用到的东西(例如标识符的名字、整数的数值)

语法分析

  1. 目的:从词性和语法规则上判定词法单元序列是否符合语言的语法结构,并构造中间表示(例如语法树)
  2. 语法树:以层次定义关系反映语法元素之间的语法结构
  3. 语法关系采用上下文无关文法描述

语义分析

  1. 目的:根据语言的语义约束检查程序的一致性(例如考虑变量的类型),将相关信息存到符号表或语法树中
  2. 语义分析和符号表密切相关,符号表在整个编译过程中都很重要

中间代码生成

  1. 目的:化解从源语言到目标语言翻译时较大的语义跨度,使编译器更易于优化和移植
  2. 中间代码的两个性质:容易生成、容易转换为目标机器上的程序

代码优化

  1. 目的:提高程序执行的时空效率
  2. 可以分为机器有关优化(目标代码优化)、机器无关优化(中间代码优化)

目标代码生成

  1. 目的:将中间表示转换为目标机器代码,需要考虑指令选择、寄存器分配、指令调度等问题