基本信息


编辑推荐
紧密结合LLVM的源码,系统介绍LLVM的模块化设计理念并详解技术细节
内容简介
作译者
拉斐尔·奥勒(Rafael Auler)是巴西坎皮纳斯大学的博士生,并拥有该大学计算机科学硕士学位和计算机工程学士学位。在作为硕士生期间,他编写了一个可以根据体系结构描述文件自动生成LLVM后端的概念验证工具。目前,他的博士研究课题包括动态二进制翻译、即时编译器和计算机体系结构。 Rafael还是微软研究院2013年研究生研究奖学金获得者。
目录
译者序
前言
关于作者
关于审稿人
第1章 构建和安装LLVM 1
1.1 了解LLVM版本 1
1.2 获取预构建包 2
1.2.1 获取官方预构建二进制文件 2
1.2.2 使用软件包管理器 3
1.3 从源代码构建 4
1.3.1 系统要求 4
1.3.2 获取源代码 4
1.3.3 构建和安装LLVM 5
1.3.4 Windows和Microsoft Visual Studio 10
1.3.5 Mac OS X和Xcode 12
1.4 总结 14
第2章 外部项目 15
2.1 Clang外部项目介绍 15
2.1.1 构建和安装Clang外部工具 16
前言
对于Linux或LLVM,许多程序员的贡献使它们迅速成长为一流软件,在质量上可以与现有的任何其他竞争对手相媲美。因此,把任何一个大项目的成功归功于特定个人是不公平的。无可否认的是,在开源社区中,一个学生的软件项目想要飞跃成为复杂且健壮的软件需要一个关键因素:吸引那些愿意在该项目上花费时间的贡献者和程序员。
这样的因素天然存在于充满教育气息的校园氛围之中。教育的重要任务是教会学生理解任务的工作原理,因此对学生而言,他们可以在解开错综复杂的机制并最终掌握它们的过程中享受到胜利的喜悦。伊利诺伊大学厄巴纳–香槟分校(UIUC)的LLVM项目正是在这种环境下发展起来的,它既被用作研究原型,也被用作Lattner的硕士导师Vikram Adve讲授编译器课程的教学框架。学生们为最初的bug排查做出了贡献,这也为LLVM最终成为一个设计良好且易于学习的项目奠定了发展方向。
软件理论和实践之间的显著差异使许多计算机科学专业的学生感到困惑。计算理论中一个简洁明了的概念可能涉及多层级的实现细节,这些细节使得现实中的软件项目变得过于复杂而无法让人们掌握,特别是其所有微妙之处。巧妙的抽象设计是帮助人类大脑掌握项目所有层面的关键:从高层级的视图(抽象意义下的程序实现和工作方式)到最低层级的细节。
理论与实践之间的差异在编译器这一软件中尤为显著。对学习编译器工作原理有极大热情的学生,在理解编译器的实际实现时常常面临艰巨的挑战。尽管学校已经教授了编译器的相关理论,但在LLVM项目之前,如果充满好奇心的学生要学习实现真正的编译器,GCC项目是少数开源选项之一。
然而从最纯粹的意义上说,软件项目反映的是其创建者的观点。这些观点通过跨多个组件对模块和数据表示进行抽象来实现。但对于同一主题,程序员可能有不同的看法。因此,对于GCC这样已有近30年历史的老旧软件库而言,其中集合了不同时代的程序员的不同观点,这使得该软件越来越难以被新程序员和好学者理解。
LLVM项目不仅吸引了经验丰富的编译器程序员,还吸引了许多年轻且具有好奇心的从事科研的学生,他们从中看到一片更干净、更简单的黑客土壤,它代表了一个具有很大潜力的编译器。这一点可以从选择LLVM作为研究原型的科学论文的庞大数量得到验证。学生们做出如此选择的原因很简单:在学术界,学生通常负责项目的具体实现,因此对他们来说,掌握实验框架代码库对于研究是至关重要的。由于LLVM使用C++语言(而不是GCC中使用的C)、模块化(而不是GCC的单一庞大结构)以及更容易映射到现代编译器理论的概念,因此,很多研究人员发现修改LLVM代码以实现他们的科研想法是很容易的,并且有很多这方面成功的例子。LLVM在学术界的成功可以说是理论与实践之间缩小差距的结果。
除了作为科研工作的实验框架之外,与GCC的GPL许可证相比,LLVM项目还有更加自由的许可证,因而引起了产业界的兴趣。对于一个从学术界发展起来的项目,编写其代码的研究人员通常会担心写好的代码在用于单独的某个实验后遭遇被丢弃的命运。为了克服这种局限性,在UIUC的硕士项目中,Chris Lattner决定根据伊利诺伊大学/NCSA开源许可协议对该项目进行许可,该许可只要求保留版权声明就允许包括商用目的在内的使用。Chris的目标是使LLVM被最大限度地采用,最终结果超出预期。2012年,LLVM荣获ACM软件系统奖,这是对为科研做出杰出贡献的软件的高度认可。
许多商业公司基于不同的需求使用LLVM项目,也为该项目做出不同的贡献,扩展了基于LLVM的编译器可以使用的语言范围以及能够为其生成代码的机器范围。最终,LLVM项目具备了前所未有的成熟的库和工具,进入了新的阶段:从学术软件的实验状态,进入被商业产品使用的健壮框架状态。因此,项目的名称也从低级虚拟机(Low Level Virtual Machine)更改为缩写LLVM。
停用低级虚拟机的名称,转而使用LLVM,这一决定反映了该项目在不同时期的目标。起初,LLVM是一个硕士科研项目,目标是成为一个可以用于研究程序终身优化的框架。相关工作成果发表在2003年MICRO(微体系结构国际研讨会)的一篇名为《LLVA: A Low-level Virtual Instruction Set Architecture》的论文以及2004年CGO(代码生成和优化国际研讨会)的一篇名为《LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation》的论文中。前者描述了LLVM的指令集,而后者对整个框架进行了描述。
在学术环境之外,LLVM被广泛用作一个设计良好的编译器,它具有将中间表示写入磁盘等有用的特性。在商业系统中,它从未真正像Java虚拟机(JVM)一样被使用,因此继续使用低级虚拟机名称毫无意义。另一方面,其他一些奇怪的名字仍然作为LLVM的历史遗产而存在。在磁盘文件中存储的LLVM中间表示程序称为LLVM位码。位码的名称类似于Java的字节码,但前者反映了LLVM中间表示所需的空间,与Java字节码的含义不同。
我们编写此书有双重目的。首先,由于LLVM项目发展速度很快,我们希望将其循序渐进地呈现给你,使本书的内容尽可能简单易懂,同时让你享受使用功能强大的编译器库的乐趣。 其次,我们希望唤起你开源黑客的精神去探索超出本书的概念,永远不要停止扩充知识的脚步。
祝你阅读愉快!
本书包含的内容
第1章介绍如何在Linux、Windows或Mac上安装Clang / LLVM软件包,包括有关在Visual Studio和Xcode上构建LLVM的讨论。本章还将介绍LLVM不同发行版的风格,以便于你根据自身需要选择最合适的发行版本:预构建的二进制文件、软件分发包或源代码。
第2章介绍包含于单独的软件包或仓库中的外部LLVM项目,例如额外的Clang工具、DragonEgg GCC插件、LLVM调试器(LLDB)和LLVM测试套件。
第3章解释LLVM项目中不同工具的组织形式,并通过一个实例介绍如何使用它们将源代码编译成汇编语言。本章还将介绍编译器驱动程序的工作原理,以及如何编写你的第一个LLVM工具。
第4章介绍LLVM编译器前端,即Clang项目。本章将一步一步地完整呈现前端涉及的所有步骤,同时还将解释如何编写调用前端不同功能的小程序。本章最后介绍如何使用Clang库编写一个小型编译器驱动程序。
第5章解释LLVM设计中的一个关键部分,即其中间表示(IR)。本章将解释它的重要特点、语法、结构以及如何编写生成LLVM IR的工具。
第6章介绍LLVM的编译器后端,它负责将LLVM IR转换为机器代码。本章将逐步介绍后端涉及的所有步骤,并介绍编写自己的LLVM后端所需的知识。本章最后展示如何创建一个后端编译流程。
媒体评论
布鲁诺·卡多索·洛佩斯(Bruno Cardoso Lopes) 在巴西坎皮纳斯大学获得计算机科学博士学位。自2007年以来,他一直是LLVM的贡献者,从头开始实现MIPS后端,并且已经维护了几年。另外,他还编写了x86 AVX支持方案,并改进了ARM汇编器。他的研究兴趣包括代码压缩技术和对ISA进行位宽压缩。之前他还开发了Linux和FreeBSD操作系统的驱动程序。
拉斐尔·奥勒(Rafael Auler) 是巴西坎皮纳斯大学的博士生,并拥有该大学计算机科学硕士学位和计算机工程学士学位。在作为硕士生期间,他编写了一个可以根据体系结构描述文件自动生成LLVM后端的概念验证工具。目前,他的博士研究课题包括动态二进制翻译、即时编译器和计算机体系结构。 Rafael还是微软研究院2013年研究生研究奖学金获得者。