程序员的自我修养笔记(二)

92 阅读2分钟

编译过程

  • 预处理
  • 编译
  • 汇编
  • 链接

预编译

  • 删除所有 #define,并展开宏定义
  • 处理所有预编译指令,#if、#ifdef、#elif #else #endif
  • 处理 #include
  • 删除所有注释
  • 添加行号和文件标识
  • 保留 #pragma 编译器指令

编译器

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 中间语言生成
  5. 目标代码生成与优化

汇编器

汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。

链接器

人们把每个源代码模块独立地编译,然后按照需要将它们“组装”起来,这个组装的过程就是链接。

主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的衔接。

主要过程包括:

  1. 地址和空间分配
  2. 符号决议
  3. 重定位

重定位:由于编译器在没法确定地址的情况下,会将这条mov指令的目标地址置为0,等待链接器在将目标文件A和B链接起来的时候再将其修正,给程序中每个这样的绝对地址引用的位置“打补丁”,使它们指向正确的地址,这个过程就被叫做重定位

符号:用来表示一个地址,这个地址可能是一段子程序的起始地址,也可以是一个变量的起始地址。

swift

编译过程

  1. 词法分析
swiftc main.swift -dump-parse
  1. 语义分析
swiftc main.swift -dump-ast
  1. 生成 SIL
swiftc main.swift -emit-sil
  1. 生成 IR
swiftc Main.swift -emit-ir
  1. 生成汇编
swiftc Main.swift -emit-assembly
  1. 生成可执行文件
swiftc Main.swift

其他的使用 swiftc 命令的时候查看后面的注释,其实就很好理解了。

引用

  • 程序员的自我修养纸质书