前言
- 什么是LLVM
- 官网: [https://llvm.org/](https://llvm.org/)
- LLVM项目是模块化、可重用的编译器以及工具链技术的集合
- 美国计算机协会(ACM)将其2012年软件系统奖项颁给了LLVM,之前曾经活动此奖项的软件和技术包括:Java、the World Wide Web、Smalltalk、UNIX、Eclipse等等
- 创始人
- Chris Lattner,也是Swift之父
- 有些文章把LLVM当做Low Level Virtual Machine(低级虚拟机)的缩写简称,官方描述如下:
- The name "LLVM" itself is not an acronym; it is the full name of the project
- "LLVM"这个名称本身不是首字母缩略词,它是项目的全
一、传统的编译器架构
- Frontend: 前端
- 词法分析、语法分析、语义分析、生成中间代码
- Optimizer: 优化器
- 中间代码优化
- Backend:后端
- 生成机器码
二、LLVM架构
- 不同的前端后端使用统一的中间代码LLVM Intermediate Representation(LLVM IR)
- 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
- 如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
- 优化阶段是一个通用阶段,他针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
- LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskkell、D等)
总结:
相比较之下,GCC的前端和后端没分得太开,前端后端耦合在了一起,所以GCC为了支持一门新的语言,或者为了支持一个新的目标平台,旧变得特别困难。
三、Clang
- 什么是Clang?
- LLVM项目的子项目
- 基于LLVM架构的C/C++/Objective-C编译器前端
- 官网:http://clang.llvm.org/
- 相比GCC,Clang具有如下优点
- 编译速度快:在某些平台,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GCC快3倍)
- 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
- 模块化设计:Clang采用基于库的模块化设计,易于IDE集成及其他用途的重用
- 诊断信息可读性强:在编译过程中,Clang创建并保留大量详细的元数据(metadata),有利于调试和纠错
- 设计清晰简单,容易理解,易于扩展增强
四、Clang和LLVM关系
- 广义的LLVM
- 整个LLVM架构
- 狭义的LLVM
- LLVM后端(代码优化、目标代码生成)
五、OC源文件的编译过程
- 命令行查看编译的过程:clang -ccc-print-phases main.m
preprocessor阶段
- 预处理
- 查看preprocessor(预处理的结果):clang -E main.m
compiler阶段
- 编译器成ir中间代码
backend阶段
- 后端生成汇编
assembler阶段
- 汇编生成目标代码
linker阶段
- 链接静/动态库
bind_arch阶段
- 生成目标架构代码