编译-第01章-概论

基本概念

  1. 源程序(Source Program)

    指用汇编语言或高级语言(如C、Java等)编写的程序,是程序员直接编写的代码形式。

  2. 目标程序(Target Program)

    指由翻译程序处理源程序后生成的程序,使用目标语言表示。目标语言可以是:

    • 中间语言(如字节码、IR中间表示),
    • 某种计算机的机器语言(二进制代码),
    • 或某种汇编语言。
  3. 翻译程序(Translator)

    指将源程序转换为目标程序的程序,是广义的翻译工具总称。它包括:

    • 编译程序(Compiler):将高级语言源程序整体翻译为目标程序。
    • 汇编程序(Assembler):将汇编语言源程序翻译为机器语言。
    • 其他变换程序(如转换工具)。

编译执行 vs. 解释执行

特性 编译执行 解释执行 JIT(混合)
执行方式 提前编译成机器码 逐行解释执行 先编译成中间码,再动态编译
执行速度 较快(优化后接近编译执行)
跨平台性 差(依赖平台) 好(解释器跨平台) 好(如 JVM、CLR)
错误检查 编译时发现 运行时发现 编译 + 运行时检查
典型语言 C、C++、Go Python、JS Java、C#

编译过程

  1. 词法分析
    1. task:分析和识别单词
  2. 语法分析
    1. task:根据规则,分析和识别程序中的各种语法成分,进行语法正确性检测
  3. 语义分析,生成中间代码
    1. 对识别出的各种语法成分进行语义分析,并产生相应的中间代码
    2. 便于优化
    3. 方便移植
  4. 代码优化
    1. task:得到高质量的目标程序
  5. 生成目标程序

编译程序构造

  1. 逻辑结构
    1.

    alt text

    1. 按照五个阶段
    2. 每个阶段都要做两件事
      1. 表格管理
      2. 出错处理
    3. 以上7个部分
  2. 遍:从头到尾扫描一次(很多遍扫描)

    1. 在一遍扫描即可完成整个编译过程→一边扫描编译程序
  3. 前端和后端

    1. front:负责分析与源语言相关的部分,将源代码转换为中间表示
    2. back:负责与目标机器相关的部分,将中间表示转换为目标机器代码