更新时间:2023-04-13 16:47
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM 命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写,由于命名带来的混乱,LLVM就是该项目的全称。LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行程序语言的编译器优化、链接优化、在线编译优化、代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。LLVM是伊利诺伊大学的一个研究项目,提供一个现代化的,基于SSA的编译策略能够同时支持静态和动态的任意编程语言的编译目标。自那时以来,已经成长为LLVM的主干项目,由不同的子项目组成,其中许多正在生产中使用的各种 商业和开源的项目,以及被广泛用于学术研究。
(概述内容来源:,图片来源:)
LLVM 是 Illinois 大学发起的一个开源项目,和之前为大家所熟知的JVM 以及 .net Runtime这样的虚拟机不同,这个虚拟系统提供了一套中立的中间代码和编译基础设施,并围绕这些设施提供了一套全新的编译策略(使得优化能够在编译、连接、运行环境执行过程中,以及安装之后以有效的方式进行)和其他一些非常有意思的功能。
2000年LLVM开始开发。
2005年Apple雇了Chris Lattner,LLVM也相当于成了Apple的官方支持的编译器。
2011-12-02 LLVM3.0发布,LLVM包括了一系列子项目,它们也同步发布了新版本,如C/C++/Objective-C前端Clang 3.0改进了C++程序编译支持;改进C++ 2011标准支持;实现支持即将发布的C1x标准的某些特性;更快的生成代码,更快的编译,等等。
对于普通的开发人员来说,LLVM计划提供了越来越多的可以使用、编译器以外的其他工具。例如代码静态检查工具LLVM/Clang Static Analyzer,是一个 Clang 的子项目,能够使用同样的 Makefile 生成 HTML 格式的分析报告。
对关注编译技术的开发人员,LLVM提供了很多优点:
现代化的设计
LLVM的设计是高度模块化的,使得其代码更为清晰和便于排查问题所在。
语言无关的中间代码
一方面,这使得透过LLVM能够将不同的语言相互连结起来;也使得LLVM能够紧密地与IDE交互和集成。
另一方面,发布中间代码而非目标代码能够在目标系统上更好地发挥其潜能而又不伤害可调试性(i.e. 在目标系统上针对本机的硬件环境产生目标代码,但又能够直接通过中间代码来进行行级调试)
作为工具和函数库
使用LLVM提供的工具可以比较容易地实现新的编程语言的优化编译器或VM,或为现有的编程语言引入一些更好的优化/调试特性。
2011年12月2日,LLVM 3.0 正式版发布了,新版本最大的跨越就是一个全新的寄存器分配器,可提供大幅度的性能提升;完全支持全新 C++ 内存模型中的原子操作;改进了 MIPS 后端;支持 gprof/gcov 风格的 profile 信息。
2012年5月22日,LLVM 3.1 发布,是一个主要的更新版本,包含一个新的 AddressSanitizer 工具用于检测内存错误以及一个 ARM 集成汇编工具,另外该版本还提升了机器码的性能,完整的功能特性可从 preliminary release notes 这里了解到。
2015年5月26日,LLVM 3.6 发布。此版本是 LLVM 社区辛苦开发六个月的结果,包括大量 bug 修复,优化改进,Clang 支持更多被提议的 C++1z 功能,更好的原生 Windows 兼容性,本地对象文件中嵌入 LLVM IR,绑定 Go 等等。
2015年9月2日,LLVM 3.7 发布。主要更新内容有:完全支持 OpenMP 3.1(behind a flag),the On Request Compilation (ORC) JIT API,一个全新的后端用于 Berkeley Packet Filter (BPF), Control Flow Integrity 检查,对优化的改进,新的 Clang 警告,许多 bug 修复等等。
Windows
在Windows上可以使用Mingw编译LLVM,
也可以用VisualStudio 编译
GCC编译或者是以LLVM/Clang编译
Xcode自带