JHHK

欢迎来到我的个人网站
行者常至 为者常成

LLVM(一):简介

目录

简介

在理解 LLVM 之前,先说下传统编译器的工作原理,基本上都是三段式的,可以分为前端、优化器和后端。
前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树;
优化器对这一中间代码进行优化,试图使代码更高效;
后端则负责将优化器优化后的中间代码转换为目标机器的代码,这一过程后端会最大化的利用目标机器的特殊指令,以提高代码的性能。

img

Frontend:前端
词法分析,语法分析,语义分析,生成中间代码

Optimizer:优化器
中间代码优化

Backend:后端
生成机器码

LLVM 是以 BSD 许可来开发的开源的编译器框架系统,基于 C++ 编写而成,利用虚拟技术来优化以任意程序语言编写的程序的编译时间、链接时间、运行时间以及空闲时间,最早以 C/C++ 为实现对象,对开发者保持开放,并兼容已有脚本。目前 LLVM 因其宽松的许可协议,更好的模块化、更清晰的架构,成为很多厂商或者组织的选择,已经被苹果 IOS 开发工具、Facebook、Google 等各大公司采用,像 Swift、Rust 等语言都选择了以 LLVM 为后端。

LLVM 包括了两个概念:一个广义的 LLVM 和一个狭义的 LLVM 。广义的 LLVM 指的是一个完整的 LLVM 编译器框架系统,包括了前端、优化器、后端、众多的库函数以及很多的模块;而狭义的 LLVM 则是聚焦于编译器后端功能的一系列模块和库,包括代码优化、代码生成、JIT 等。

img

不同的前端后端使用统一的中间代码LVM Intermediate Repressentation(LLVM IR);

如果需要支持一种新的编程语言,那么只需要实现一个新的前端;

如果需要支持一种新的硬件设备,那么只需要实现一个新的后端;

优化阶段是一个通用的极端,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改;

相比之下,GCC的前端和后端没分得太开,前端后端耦合在一起,所以GCC为了支持一门新的语言或者为了支持一个新的目标平台,就变得特别困难;

LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族,Java,.NET,Python,Ruby,Scheme,Haskell,D等)

与Clang关系

一、结构图

img

对应到这个图中,可以非常明确的找出它们的关系。整体的编译器架构就是 LLVM 架构;Clang 大致可以对应到编译器的前端,主要处理一些和具体机器无关的针对语言的分析操作;编译器的优化器和后端部分就是之前提到的 LLVM 后端,即狭义的 LLVM。

二、相比于GCC,Clang具有如下优点:

模块化设计:Clang采用基于库的模块化设计,设计清晰简单,容易理解,易于扩张增强;易于IDE继承及其他用途的重用;

编译速度快:在某些平台上,Clang的编译速度显著快过GCC(Debug模式下OC速度比GCC块3倍);

占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右;

诊断信息可读性强:在编译过程中,Clang创建并保留了大量详细的元数据(metadata),有利于调试和错误报告


行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.