0%

Static Linking

编译和链接


编译

  • 编译:扫描 -> 语法分析 -> 语义分析 -> 源代码优化 -> 代码生成 -> 目标代码优化

  • 下图为从源代码Source Code到最终目标代码Final Target Code的过程

      flowchart TD
        A(Source Code) --> |Scanner| B(Tokens)
        B --> |Parser| C(Syntax Tree)
        C --> |Semantic Analyzer| D(Commented Syntax Tree)
        D --> |Source Code Optimizer| E(Intermediate Representation)
        E --> |Code Generator| F(Target Code)
        F --> |Code Optimizer| G(Final Target Code)

词法分析

Lexical Analysis

  • 扫描器scanner
  • 有限状态机FSM (Finite State Machine)算法:将源代码的字符分割成一系列的记号Token
  • lex:按照用户描述好的词法规则将输入的字符串分割成一个个记号

语法分析

Syntax Analysis

  • 语法分析器Grammar Parser
  • 语法树Syntax Tree
  • 上下文无关语法Context-free Grammar
  • yacc:Yet Another Compiler Compiler,根据用户给定的语法规则对输入记号序列进行解析,从而构建出一颗语法树

语义分析

Semantic Analysis

  • 语义分析器Semantic Analyzer
  • 编译器能分析的是静态语义Static Semantic:静态语义通常包括声明类型的匹配,类型的转换

中间语言生成

  • 源码级优化器Source Code Optimizer

  • 中间代码Intermediate Code

    使得编译器分为前端和后端,前端负责产生机器无关的中间代码,后端负责将中间代码转换为目标机器代码,通常同一个前端可以通过组合不同的后端适配不同的平台

    • 三地址码Three-address Code

      1
      x = y op z
    • P-代码P-Code

  • 编译器后端

    • 代码生成器Code Generator

    • 目标代码生成器Target Code Optimizer

链接器

  • 符号Symbol:表示一个地址,可能是一段子程序(函数)的地址,也可能是一个变量的起始地址
  • 模块间通信方式:符号引用
  • 链接Linking
    • 地址和空间分配Address and Storage Allocation
    • 符号决议Symbol Resolution(or Symbol Binding, Name Binding, Name Resolution, Address Binding, Instruction Binding)
    • 重定位Relocation
  • 运行时库Runtime Library:支持程序运行的基本函数的集合
  • 重定位入口Relocation Entry

目标文件


格式

  • COFF:Common file format –> .obj (windows) & .o (Linux)
  • 动态链接库 (Dynamic Linking Library):.dll (windows) & .so (Linux)
  • 静态链接库 (Static Linking Library):.lib(windows) & .a(linux)