编译过程
- 预处理
- 编译
- 汇编
- 链接
预编译
- 删除所有 #define,并展开宏定义
- 处理所有预编译指令,#if、#ifdef、#elif #else #endif
- 处理 #include
- 删除所有注释
- 添加行号和文件标识
- 保留 #pragma 编译器指令
编译器
- 词法分析
- 语法分析
- 语义分析
- 中间语言生成
- 目标代码生成与优化
汇编器
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
链接器
人们把每个源代码模块独立地编译,然后按照需要将它们“组装”起来,这个组装的过程就是链接。
主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的衔接。
主要过程包括:
- 地址和空间分配
- 符号决议
- 重定位
重定位:由于编译器在没法确定地址的情况下,会将这条mov指令的目标地址置为0,等待链接器在将目标文件A和B链接起来的时候再将其修正,给程序中每个这样的绝对地址引用的位置“打补丁”,使它们指向正确的地址,这个过程就被叫做重定位
符号:用来表示一个地址,这个地址可能是一段子程序的起始地址,也可以是一个变量的起始地址。
swift
编译过程
- 词法分析
swiftc main.swift -dump-parse
- 语义分析
swiftc main.swift -dump-ast
- 生成 SIL
swiftc main.swift -emit-sil
- 生成 IR
swiftc Main.swift -emit-ir
- 生成汇编
swiftc Main.swift -emit-assembly
- 生成可执行文件
swiftc Main.swift
其他的使用 swiftc 命令的时候查看后面的注释,其实就很好理解了。
引用
- 程序员的自我修养纸质书