LLVM(low level virtual machine)起源于伊利诺伊大学的一个编译器实验项目,目前已经发展成一个集编译器和工具链为一体的商业开源项目,因此其英文名称的含义被扩大,不再仅仅是字面意思。其创始人为 Chris Lattner。LLVM项目遵循的开源许可协议是 Apache 2.0License。LLVM 从2003 年10月24 日发布第一个开源版本 LLVM1.0 以来,截止2020 年第一个季度,已经发布到LLVM10.0.0 版本,十几年间开发者社区也在不断壮大,从 2007 年起至今,每年都会举办 1-2 次 LLVM 开发者大会,在大会上有很多优秀的开发者们分享他们对于LLVM项目的一些技术问题研究。2012年LLVM获得了2012ACM软件系统奖。
最开始LLVM在项目初期,定向研究终身程序优化,后来随着项目成熟,维护编译器IP在磁盘上表示的设计成决策仍然是为了实现连接时优化,而较少关注终身优程序优化的原始想法。
最后,LLVM核心库通过放弃低级虚拟机(Low Level Virutal Machine)这个名称,正式表明成为一个平台不感兴趣,而仅仅由于历史原因,所以用LLVM这个名字,而要成为强大和实用的C/C++编译器,而不是java的竞争对手
经典的编译器如gcc在设计上都是提供一条龙服务的: 你不需要知道它使用的IR是什么样的,它也不会暴露中间接口来给你操作它的IR。 换句话说,从前端到后端,这些编译器的大量代码都是强耦合的
编译原理主要过程分为两个:
LLVM的核心设计是LLVM IR
它使用的静态单赋值形式(SSA)两个重要特征:
同时作为编译器IR,用于指导核心库开发的两个LLVM IR的基本原则:
LLVM采用了功能划分更为明确的模块化设计。LLVM将优化的部分单独提取出来,不再将编译器的优化功能与前端或者后端的功能代码耦合在一起!
LLVM进行代码混淆保护,实际上需要改造的是优化器部分,通过编写用于代码混淆的定制的Pass来完成混淆处理,不需要对后端的Pass进行改造
Pass就是“遍历一遍IR,可以同时对它做一些操作”的意思
LLVM Pass分为两种类型:
LLVM Pass可以用于各种目的,例如:
LLVM Pass是LLVM编译器的核心组件,是LLVM编译器的灵活性和可扩展性的基础。
以下是一些常见的LLVM Pass:
用户可以根据自己的需要来编写或使用LLVM Pass。LLVM提供了丰富的API和文档,可以帮助用户快速入门。
LLVM的核心是一个库,而不是一个具体的二进制程序。 不过,LLVM这个项目本身也基于这个库实现了周边的工具, 下面列出了几个重要的命令行工具,光看名字就可以知道它们大概在做什么
Clang 是 LLVM 编译器工具集的前端,支持 C、C++、Objective-C 和 Objective-C++ 等编程语言。它采用了 LLVM 作为其后端,由 LLVM2.6 开始,一起发布新版本。
Clang 的目标是提供一个 GNU 编译器套装的替代品,支持了 GNU 编译器大多数的编译设置以及非官方语言的扩展。
Clang 的主要功能包括:
Clang 在许多操作系统和平台上都有可用版本,包括 macOS、Linux、Windows、iOS 和 Android。
Clang 是一个开源项目,由 LLVM 开发小组维护。
以下是 Clang 的一些优势:
Clang 是一个功能强大、高效的编译器,可以用于各种目的。