iOS 关于编译器 - AlvinSunny/OC-TheUnderlying GitHub Wiki

Xcode 的默认编译器ClangClang 的功能是首先对 Objective-C 代码做分析检查,然后将其转换为低级的类汇编代码:LLVM Intermediate Representation(LLVM 中间表达码)。接着 LLVM 会执行相关指令将 LLVM IR 编译成目标平台上的本地字节码,这个过程的完成方式可以是即时编译 (Just-in-time),或在编译的时候完成。

LLVM是一个模块化和可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 CC++Objective-C 编译器,目的是提供惊人的快速编译,比 GCC 快3倍,其中的 clang static analyzer 主要是进行语法分析、语义分析和生成中间代码,当然这个过程会对代码进行检查,出错的和需要警告的会标注出来。LLVM 核心库提供一个优化器,对流行的 CPU 做代码生成支持。lld 是 Clang / LLVM 的内置链接器,clang 必须调用链接器来产生可执行文件。

LLVM 的优点主要得益于它的三层式架构。 第一层支持多种语言作为输入(例如 C, ObjectiveC, C++ 和 Haskell),第二层是一个共享式的优化器(对 LLVM IR 做优化处理),第三层是许多不同的目标平台(例如 Intel, ARMPowerPC)。在这三层式的架构中,如果想要添加一门语言到 LLVM 中,那么可以把重要精力集中到第一层上,如果想要增加另外一个目标平台,那么没必要过多的考虑输入语言。 

目前LLVM包含的主要子项目包括:

  • LLVM Core:包含一个现在的源代码/目标设备无关的优化器,一集一个针对很多主流(甚至于一些非主流)的CPU的汇编代码生成支持。
  • Clang:一个C/C++/Objective-C编译器,致力于提供令人惊讶的快速编译,极其有用的错误和警告信息,提供一个可用于构建很棒的源代码级别的工具.
  • dragonegg:gcc插件,可将GCC的优化和代码生成器替换为LLVM的相应工具。
  • LLDB:基于LLVM提供的库和Clang构建的优秀的本地调试器。
  • libc++libc++ ABI: 符合标准的,高性能的C++标准库实现,以及对C++11的完整支持。
  • compiler-rt:针对__fixunsdfdi和其他目标机器上没有一个核心IR(intermediate representation)对应的短原生指令序列时,提供高度调优过的底层代码生成支持。
  • OpenMP: Clang中对多平台并行编程的runtime支持。
  • vmkit:基于LLVM的Java和.NET虚拟机实
  • polly: 支持高级别的循环和数据本地化优化支持的LLVM框架。
  • libclc: OpenCL标准库的实现
  • klee: 基于LLVM编译基础设施的符号化虚拟机
  • SAFECode:内存安全的C/C++编译器
  • lld: clang/llvm内置的链接器

【说明】:从功能的角度来说,微观的LLVM可以认为是一个编译器的后端,而Clang是一个编译器的前端