LLVM 概览
下面是 LLVM 首页对 LLVM 介绍的中文翻译。
LLVM 项目是一系列模块化、可重用和工具链技术的集合。不必在意它的名称,LLVM 和之前的虚拟机基本没什么关系了,然而也确实提供了对构建这些虚拟机有帮助的库。LLVM 不是首字母的缩写,它就是项目的全称。
LLVM 起源于伊利诺伊大学的一个研究项目,这个项目致力于提供现代化的、基于 SSA编译策略能够同时支持任意语言静态和动态编译。从那时起,LLVM 已经发展为具有多个子项目的巨型项目,它们中很多被用于各种各样商业的和开源的产品中,与此同时也广泛用于学术研究。LLVM 项目的代码遵守“伊利诺伊大学”BSD风格许可。
LLVM 主要的子项目如下:
1. LLVM 核心库提供了一个源代码级别和目标平台无关的优化器开发库,以及许多流行 CPU(当然也包括一些不常见的) 的代码生成支持。这些开发库都是建立在代码表达有良好定义的,称为 LLVM 中间表达(LLVM IR)。LLVM 核心开发库文档齐全,使用 LLVM 作为一个优化器和代码生成器开发你自己的语言(或移植现有编译器)是一件特别容易的事情。
2. Clang 使用一个“LLVM 原生的” C/C++/Objective-C 编译器。它致力于提供令人难以置信快速编译(例如当以调试配置编译 Objective-C 代码时的速度比 GCC 快 3 倍)、高度有用的错误和警告信息以及为构建强大源代码级工具的平台。最好的例子就是有很多工具使用 Clang 前端作为开发库去解析 C/C++代码。
3. dragonegg 整合了 LLVM 优化器代、码生成器以及 GCC 解析器。这样就可以让 LLVM 编译 Ada、Fortran 以及一些 GCC 编译器前端支持的语言,另外可以支持一些 Clang 不支持的 C 特性。
4. LLDB 构建于 LLVM 和 Clang 提供的开发库上,它提供了个强大的原生调试器。它使用 Clang 的抽象语语法树、表达式解析器、LLVM 及时编译、LLVM 反汇编器等,这样使得它给人映象就是“就是如此有效”,而且在加载符号时相较于 GCC 快而且内存使用效率更高。
5. libc++ 和 libc++ ABI 提供了一个标准的、高性能 C++ 标准库的实现,包括对 C++ 11 的完全支持。
6. compiler-rt 提供了经过精心调校实现的底层代码生成器,支持诸如“__fixunsdfdi”这样的过程以及其他用于目标平台没有原生的简短指令实现核心 IR 操作时调用的生成。它同时也为动态测试工具提供了运行时的实现,例如AddressSanitizer、ThreadSanitizer、MemorySanitizer 以及 DataFlowSanitizer。
7. OpenMP 为使用 Clang 中实现的 OpenMP 提供一个 OpenMP 的运行环境。
8. vmkit 是构建于 LLVM 技术之上的 Java 和 .NET 虚拟机的实现。
9. polly 实现了一组局部性缓存优化套件,以及自动并行和多面体模型的矢量化。
10. libclc 致力于实现 OpenCL 的标准库。
11. klee 实现了一个“符号虚拟机”,它基于的原理是,尝试通过查找缺陷和证明函数属性对所有动态路径进行求值。klee 一个主要的特性就是当一个缺陷被探测到时能生成一个测试用例。
12. SAFECode 是一个内存安全的 C/C++ 编译程序。它的指令代码附带了探测内存安全错误的运行时检查(例如,缓冲区溢出),它可以用于软件免受安全攻击,也可以被用作像 Valgrind 一样的内存安全错误的调试工具。
13. lld 致力于为 clang/llvm 提供一个内建的链接器。目前 clang 多半是调用系统的链接器来生成可执行文件。
除了 LLVM 官方子项目,还有大量各种各样使用 LLVM 完成其他各种任务的其他项目。通过这些项目,你可以使用 LLVM 编译 Ruby、Python、Haskell、Java、D、PHP、Pure、Lua 以及其他多种语言。LLVM 主要优势就是多功能性、灵活以及可重用性。这就是为什么它被用于如此广泛而多样的任务中:所有工作均使用轻量级的及时编译完成的嵌入式语言,就像 Lua 为大规模超级计算机编译 Fortran 代码。
像所有其他的开源的项目一样,LLVM有一个由大量而友好的、对构建强大的底层工具感兴趣的人组成的社区。如果你有兴趣加入,略读 LLVM 博客和订阅 LLVM 开发者邮件列表是一个不错的开始。关于如何发送补丁、获取提交权限以及版权和许可的事项,请参考 LLVM 开发者准则。
【译注】看完这篇文章,应该会对 LLVM 这个项目有一个比较全面的了解。
LLVM 概览的更多相关文章
- Activity之概览屏幕(Overview Screen)
概览屏幕 概览屏幕(也称为最新动态屏幕.最近任务列表或最近使用的应用)是一个系统级别 UI,其中列出了最近访问过的 Activity 和任务. 用户可以浏览该列表并选择要恢复的任务,也可以通过滑动清除 ...
- Atitit 软件工程概览attilax总结
Atitit 软件工程概览attilax总结 1.1. .2 软件工程的发展 进一步地,结合人类发展史和计算机世界演化史来考察软件工程的发展史. 表2 软件工程过程模型 表2将软件工程的主要过程模型做 ...
- iOS开发系列—Objective-C之基础概览
概览 前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作.内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会 ...
- iOS开发系列--IOS程序开发概览
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...
- Azure SQL Database (19) Stretch Database 概览
<Windows Azure Platform 系列文章目录> Azure SQL Database (19) Stretch Database 概览 Azure SQL Da ...
- Web前端开发大系概览 (前端开发技术栈)
前言 互联网建立50多年了,网站开发技术日新月异,但web前端始终离不开浏览器,最终还是HTML+JavaScript+CSS这3个核心,围绕这3个核心而开发出来大量技术框架/解决方案. 我从2000 ...
- Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...
- LLVM 笔记(五)—— LLVM IR
ilocker:关注 Android 安全(新手) QQ: 2597294287 LLVM 的 IR (Intermediate Representation) 是其设计中的最重要的部分.优化器在进行 ...
- LLVM 笔记(四)—— three-phase 设计的收益
ilocker:关注 Android 安全(新手) QQ: 2597294287 采用 three-phase 的设计方式,便于编译器支持多种语言和多种目标平台. 如果在优化器阶段采用通用的 IR ( ...
随机推荐
- VMware 12安装Mac OS X 10.11&解决上网的问题
近日想在Win10上安装Mac OS 玩玩,于是上网搜了相关资源,查看了相关经验分享,开始着手安装.系统很快成功安装,但最大问题是虚拟机中的Mac OS无法上网.费了很长时间,最终看到Ping通结果, ...
- 【原创】《从0开始学RocketMQ》—集群搭建
用两台服务器,搭建出一个双master双slave.无单点故障的高可用 RocketMQ 集群.此处假设两台服务器的物理 IP 分别为:192.168.50.1.192.168.50.2. 内容目录 ...
- ios 创建和绘画pdf文件 -转
转自:http://blog.csdn.net/ant1239/article/details/7761676 本方法为项目中画pdf的一个方法,画pdf,一共分为几步,1,获取地址,有两种获取地址方 ...
- ASP.NET URLRewriter重写
URLRewriter重写是微软官方出的第三方重写插件 下载地址:http://download.csdn.net/detail/ysn1314/5421587 下载后在项目中添加引用,然后再配置文件 ...
- Java多线程——线程的优先级和生命周期
Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...
- poj3662 Telephone Lines
思路: 二分+最短路.最短路也可以用来计算从a到达b所需的边权不超过x的边的数量. 实现: #include <cstdio> #include <cmath> #includ ...
- [BZOJ4815][CQOI2017]小Q的表格 数论+分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ...
- 平板&Safari 开发tips
css: *{ margin: 0; padding: 0; /* 禁止用户点选网页内容 */ -webkit-touch-callout:none; -webkit-user-select:non ...
- 基于C++11的call wrapper
要在C++中应用AOP,不像在其他的基于解释器的语言中那么方便,作为一种静态语言,如果给函数或者类的方法造一个wrapper,在wrapper里面嵌入调用前的代码和调用后的代码,也能达到一定程度的代码 ...
- Node.js——post方式提交的图片如何保存
https://www.cnblogs.com/bruce-gou/p/6399766.html 没有使用express框架,主要是对于 request 的监听,data的时候对数据进行保存,end的 ...