Clang/LLVM/lldb/GCC/gdb 关系
// 编译,就是Compile,由 C 编译程序对你写的代码进行词法和句法分析,发现并报告错误,有错时编译不能通过。如若无错,则生成中间代码,扩展名为 obj,此时它便是二进制的了;
// 连接,在汇编里称 Link,在 C 里叫生成,即 Build,它的作用是生成可执行的 exe 文件。由于一个程序的源码可由多个文件组成。这些文件在第二步中分别编译,生成各自的目标文件,这一步的作用便是将这些 obj 文件,以及程序中需要的其它库文件(dll 除外),统一到一个文件中来,形成单个的 exe 文件。此 exe 文件便可以在操作系统下直接运行了。
Clang 是 LLVM 编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言 。Clang支持C、C++、Objective C。
LLVM 提供了完整编译系统的中间层,它会将中间语言(Intermediate form,IF)从编译器取出与最优化,最优化后的 IF 接着被转换及链接到目标平台的汇编语言。LLVM 后端也可以接受来自GCC工具链所编译的 IF。lldb 是 LLVM 调试器(断点原理)
GCC(GNU Compiler Collection)在所有平台上都使用同一个前端处理程序(支持很多语言),产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。gdb 是 GCC 调试器
GCC 接口结构:
- 前端的功能在于产生一个可让后端处理之语法树。此语法解析器是手写之递归语法解析器。
- 中介接口用来最优化语法树
- 后端:编译成汇编,再编译成机器码
例子:Rust 的编译器 rustc 采用了 LLVM 做为它的后端