一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
LLVM概述
LLVM是架构编译器(compiler)的框架系统,以C++编写而成。用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼任已有脚本
LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006年Chris Lattner加盟Apple Inc,并致力于LLVM在Apple开放体系中的应用
Apple也是LLVM计划的主要自助者
目前LLVM已经被苹果iOS开发工具、Xilinx Vivado、Facebook、Google等各大公司采用
传统编译器设计
- 源码(
Source Code),经过编译器前端(Frontend)→优化器(Optimizer)→编译器后端(Backend),生成机器代码(Machine Code)- 机器代码(
Machine Code):就是CPU可执行的二进制代码 - 从源码到机器码的生成,这个过程都是编译器负责完成的
- 机器代码(
iOS的编译器架构
Objective-C、C、C++使用的编译器前端是Clang,Swift使用的编译器前端是swiftc,而它们使用的编译器后端都是LLVM
各个模块的职责:
- 编译器前端(
Frontend)- 编译器前端的任务是解析源代码。它会进行:词法分析、语法分析、语义分析,检查源代码是否存在错误,然后构建抽象语法树(
Abstract Syntax Tree, AST) LLVM的前端还会生成中间代码(intermediate representation, IR)
- 编译器前端的任务是解析源代码。它会进行:词法分析、语法分析、语义分析,检查源代码是否存在错误,然后构建抽象语法树(
- 优化器(
Optimizer)- 优化器负责进行各种优化。改善代码的运行时间,例如:消除冗余计算等
- 后端(
Backend)/代码生成器(Code Generator)- 将代码映射到目标指令集。生成机器代码,并进行机器代码的相关优化
LLVM的设计
当编译器决定支持多种源语言或多种硬件框架时,LLVM最重要的地方就来了。其他的编译器如GCC,它方法非常成功,但由于它是作为整体应用程序设计的,因此它们的用途受到了很大的限制
LLVM设计的最重要方面是,使用通用的代码表示形式(IR),它是用来在编译器中表示代码的形式。所以LLVM可以为任何编程语言独立编写前端,并且可以为任意硬件架构独立编写后端
- 简单来说,
LLVM最大的优势,就是将编译器的前后端分离,从而提高可扩展性
Clang
Clang是LLVM项目中的一个子项目
它是基于LLVM架构的轻量级编译器,诞生之初为了替代GCC,提供更快的编译速度
它是负责编译C、C++、Objective-C语音的编译器,它属于整个LLVM架构中的编译器前端
对于开发者来说,研究Clang可以给我们带来很多好处