LLVM编译器架构

LLVM概述

LLVM项目是模块化和可重用的编译器及工具链技术的集合。尽管名称如此,LLVM与传统虚拟机关系不大。名称“ LLVM”本身不是缩写。它是项目的全名。

LLVM最初是伊利诺伊大学的一个研究项目,目的是提供一种基于SSA的现代编译策略,该策略能够支持任意编程语言的静态和动态编译。从那时起,LLVM逐渐发展成为一个由多个子项目组成的总体项目,其中许多子项目已用于各种商业和开源项目的产品中,并广泛用于学术研究。LLVM项目中的代码已根据“具有LLVM例外的Apache 2.0许可”获得许可

LLVM的主要子项目是:

  1. 该LLVM内核库提供一个现代化的源代码与目标无关的优化,随着代码生成支持许多流行的CPU(以及一些不太常见的!),这些包都是围绕着建立以及指定被称为LLVM中间表示的代码表示(“ LLVM IR”)。LLVM核心库有充分的文档记录,特别容易发明自己的语言(或移植现有的编译器)以将LLVM用作优化器和代码生成器。
  2. Clang是“ LLVM本机” C / C ++ / Objective-C编译器,旨在提供惊人的快速编译,极其有用的错误和警告消息,并为构建出色的源代码级工具提供平台。该Clang静态分析器和clang-tidy工具,代码自动发现错误,而且是那种可以使用clang前端的库来解析C / C ++代码生成工具的很好的例子。
  3. 该LLDB项目建立在由LLVM和Clang提供了极大的机调试库。它使用Clang AST和表达式解析器,LLVM JIT,LLVM反汇编程序等,从而提供了一种“可行”的体验。在加载符号时,它还比GDB速度更快,存储效率更高。
  4. 在libc中++和libc ++ ABI项目提供了一个标准的conformant和高性能执行的C ++标准库,包括C ++ 11和C ++ 14的全力支持。
  5. 当目标没有简短的本机指令序列来实现核心IR操作时,compiler-rt项目将对底层代码生成器支持示例(例如__fixunsdfdi)和其他调用进行高度优化的实现。它还为动态测试工具(例如AddressSanitizer,ThreadSanitizer,MemorySanitizer和DataFlowSanitizer)提供了运行时runtime库的实现 。
  6. 该MLIR子项目是一种新的方法来构建可重用和可扩展的编译架构。MLIR旨在解决软件碎片,改善异构硬件的编译,显着降低构建特定于域的编译器的成本以及帮助将现有编译器连接在一起的问题。
  7. 该OpenMP的子项目提供的OpenMP与在clang的OpenMP实现使用运行时间。
  8. 该polly工程实施缓存局部性优化,使用多面体模型套件以及自动并行和矢量化。
  9. 该libclc项目旨在实现的OpenCL标准库。

10. 该klee项目实现了“象征性的虚拟机”,它采用一个定理证明,试图评估在努力发现问题和证明的功能性,通过程序中的所有动态路径。Klee的一个主要功能是,它在检测到错误时可以生成一个测试用例。

11. 该LLD项目是一个新的链接。这是系统链接程序的直接替代,并且运行速度更快。

除了LLVM的官方子项目之外,还有许多其他项目将LLVM的组件用于各种任务。通过这些外部项目,可以使用LLVM来编译Ruby,Python,Haskell,Rust,D,PHP,Pure,Lua和许多其它语言。LLVM的主要优势在于它的多功能性,灵活性和可重用性,这就是为什么它被用于各种各样的任务:从轻量级JIT编译嵌入式语言(如Lua)到为大型超级电脑编译Fortran代码的原因。

LLVM拥有广泛而友好的社区,这些社区对构建出色的低级工具感兴趣。如果有兴趣参与其中,那么最好的方法是浏览LLVM博客并注册LLVM Developer邮件列表。有关如何发送补丁程序,获取提交访问权限以及版权和许可主题的信息,请参阅《 LLVM开发人员政策》。

LLVM编译器架构的更多相关文章

  1. 编译器架构Compiler Architecture(下)

    编译器架构Compiler Architecture(下) Combining Scanning and Parsing 实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开.基于P ...

  2. 编译器架构Compiler Architecture(上)

    编译器架构Compiler Architecture(上) 编译器是程序,通常是非常大的程序.它们几乎都有一个基于翻译分析综合模型的结构. CONTENTS Overview • Compiler C ...

  3. LLVM编译器

    LLVM 1. 说说 LLVM(Low Level Virtual Machine)到底是什么吧 先说编译器:编译器是把程序员的代码翻译成机器可以理解的语言的工具: 再谈 LLVM:一个模块化和可重用 ...

  4. cmake构建时指定编译器架构(x86 or x64)

    vs2015 x64编译器为例,cmake命令如下: cmake -G "Visual Studio 14 Win64" path\to\source\dir 去掉Win64,就是 ...

  5. LLVM与Clang的概述及关系

    LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time).链接时间(link-time).运行时间(run-time ...

  6. LLVM和clang

    LLVM编译器架构 LLVM项目是一套工具的集合,它包括模块化.可复用的编译器及一些列工具链技术. LLVM最开始是Low Level Virtual Machine的简称,但现在它并不是传统意义上的 ...

  7. 转:LLVM与Clang的概述及关系

    转:http://www.cnblogs.com/saintlas/p/5738739.html      LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言 ...

  8. iOS开发系列-LLVM、Clang

    LLVM LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展. 我们可以认为LLVM是一个完整 ...

  9. 深入理解iOS开发中的BitCode功能

    前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而 ...

随机推荐

  1. Think5之ajax批量删除数据功能

    //批量删除学员信息 public function deleteMany() { $id = input('post.'); //判断id是数组还是一个数值 if(is_array($id)){ f ...

  2. 【CPU100%排查】CPU100%问题排查方案

    1.使用top -c 查看CPU 占用情况 ,按P(大写)可以倒序查看占CPU占用率  2.找到占用率高的进程以后,再定位到具体线程 比如 此时进程ID 14724 CPU占用高,进一步使用top - ...

  3. DexClassLoader动态加载分析

    转载自:http://www.blogfshare.com/dexclassloader.html 看到原来有把原始的dex文件加密保存,然后解密后使用DexClassLoader加载文件的方法,就来 ...

  4. hdu3449 有依赖的背包问题

    题意:       给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值 <提示:多个物品可能同时对 ...

  5. Redis 的持久化

    原文链接:https://www.changxuan.top/?p=1386 Redis 是一个非关系型的内存数据库,使用内存存储数据是它能够进行快速存取数据的原因之一. 在实际应用中,常有人提倡把 ...

  6. (二)SQL语句

    语法规则 不区分大小写,但是建议关键字大写,表名.列名小写 SELECT * FROM user; 支持多行编写sql语言(在SQLyog中可以用F12来快速格式化语句) # 查询cno=20201/ ...

  7. Java对象内存分布

    [deerhang] 创建对象的四种方式:new关键字.反射.Object.clone().unsafe方法 new和反射是通过调用构造器创建对象的,创建对象的时候使用invokespecial指令 ...

  8. Hbase问题小结(一)

    1. Hbase读写优化 写: 批量写.异步批量提交.多线程并发写.使用BulkLoad写入.表优化(压缩算法.预分区.合理的rowkey设计.合理关闭WAL或异步WAL) SKIP_WAL:只写缓存 ...

  9. SparkSQL电商用户画像(二)之如何构建画像

    四. 如何构建电商用户画像 4.1 构建电商用户画像技术和流程 构建一个用户画像,包括数据源端数据收集.数据预处理.行为建模.构建用户画像 有些标签是可以直接获取到的,有些标签需要通过数据挖掘分析到! ...

  10. 基于RestAssured实现接口自动化

    RestAssured是一款强大的接口自动化框架, 旨在使用方便的DSL,简化的接口自动化. 下面是基于RestAssured扩展的一个简单框架示例, 先看看用例的风格: package testca ...