VLIM指令调度算法分析
http://wenku.baidu.com/view/919d18868762caaedd33d413.html
调度算法:
http://wenku.baidu.com/view/d6432ed5c1c708a1284a4422.html
流水线技术
http://baike.baidu.com/view/61745.htm#2
关键路径
http://baike.baidu.com/view/288224.htm
__attribute__详解
http://wenku.baidu.com/view/a63fe6c56137ee06eff91836.html
LLVM
http://people.cs.nctu.edu.tw/~chenwj/dokuwiki/doku.php?id=llvm
LLVM2.0自带汇编器不支持Intel汇编语法
http://www.cocoachina.com/bbs/read.php?tid-53788.html
编译器后端,寄存器分配算法
http://blog.csdn.net/lm2302293/article/details/6790812
前瞻-全时优化和LLVM-2
http://blog.csdn.net/lm2302293/article/details/6798745
前瞻-全时优化和LLVM-1
http://blog.csdn.net/lm2302293/article/details/6798736
编译器后端寄存器分配算法SSA(静态单一赋值法)
http://blog.csdn.net/lm2302293/article/details/6791752
http://wenku.baidu.com/view/045ec6dba58da0116c174977.html:
The LLVM Compiler System
http://wenku.baidu.com/view/8a2516da50e2524de5187e39.html:
基于LLVM架构的ARM后端移植!!
http://llvm.org/pubs/2002-12-LattnerMSThesis.pdf:
LLVM: An Infrastructure for Multi-Stage Optimization!
LLVM(Low Level Virtual Machine),底层虚拟机,是一个编译器的基础建设,以C++写成。
LLVM属于编译器的中间层,它的输入是编译器的IF代码,输出经过最佳化的IF代码。然后再被编译器转化为机器相关的汇编代码。
LLVM支持语言无关的指令集和类型系统。指令采用静态单赋值形式。
LLVM是为了任意一种编程语言写成的程式,利用 虚拟技术,创造出 编译时期, 链结时期, 执行时期以及“闲置时期”的最佳化。它最早是以 C/C++为实作对象,目前它支援了包括 Objective-C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL以及其他语言。LLVM 专案起源于2000年伊利诺伊大学厄巴纳-香槟分校 Vikram Adve 与 Chris Lattner 的研究发展而成,他们想要为所有静态及动态语言创造出动态的编译技术。LLVM是以 BSD 授权来发展的开源码软件。在2005年,苹果电脑雇用了Chris Lattner及他的团队,为了苹果电脑开发应用程式系统。
LLVM定义了一个虚拟机的语言。然后再这个语言的基础上,实现了很多的功能,例如大多数的优化都是基于这个虚拟机的语言来进行的。(这是和GCC很大的 不同,我想也是delphij提到的更好的优化的原因.) 你可以这么理解,LLVM就是建立了很多个积木块,写编译器就是搭积木。
LLVM-GCC就是一个积木块,它把C代码编译成LLVM的语言。
LLVM-GCC 模块 => LLVM CODE
-> optimize
-> xxx不同的积木块
x86代码生成模块binary <=
这样,我们写两个积木就实现了一个编译器。如果要不同的平台,我们换最后那个。不同的语言,我们换第一个。
另外,我认为这是一个趋势。微软的phoeni项目和LLVM是非常的类似的。
用VB+LLVM写一个山寨编译器:http://www.vbgood.com/thread-98641-1-1.html
llvm-gcc的前端是gcc。
clang是llvm项目自己写的编译器。clang目前还缺少一些语法的支持,不过FreeBSD未来计划采用的是clang,因为它的结构更清晰,而且将会支持最新的C/C++标准。
学习LLVM的方法:
http://hi.baidu.com/zhanghuikl/blog/item/4d6a25f31e7dc05c342acc15.html
LLVM 与 Clang 介绍:
参见:http://linuxtoy.org/archives/llvm-and-clang.html
LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。
Clang 开发事出有因,Wiki 介绍如下:
Apple 使用 LLVM 在不支持全部 OpenGL 特性的 GPU (Intel 低端显卡) 上生成代码 (JIT),令程序仍然能够正常运行。之后 LLVM 与 GCC 的集成过程引发了一些不快,GCC 系统庞大而笨重,而 Apple 大量使用的 Objective-C 在 GCC 中优先级很低。此外 GCC 作为一个纯粹的编译系统,与 IDE 配合很差。加之许可证方面的要求,Apple 无法使用修改版的 GCC 而闭源。于是 Apple 决定从零开始写 C family 的前端,也就是基于 LLVM 的 Clang 了。
Clang 的特性:
- 快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
- 内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。
- 诊断信息可读性强:我不会排版,推荐去网站观看。其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天书。
- GCC 兼容性。
- 设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
- 基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。
当然,GCC 也有其优势:
- 支持 JAVA/ADA/FORTRAN
- 当前的 Clang 的 C++ 支持落后于 GCC,参见 http://clang.llvm.org/cxx_status.html。(近日 Clang 已经可以自编译,见 http://www.phoronix.com/scan.php?page=news_item&px=Nzk2Mw)
- GCC 支持更多平台
- GCC 更流行,广泛使用,支持完备
- GCC 基于 C,不需要 C++ 编译器即可编译
相信介绍到这里大家能够对 Clang 和 LLVM 有所了解了。除去 Clang 之外,LLVM 还被用在 Gallium3D 中进行 JIT 优化,Xorg 中的 pixman 也有考虑使用 LLVM 来优化执行速度,llvm-lua 使用 LLVM 来编译 Lua 代码,gpuocelot 使用 LLVM 可以令 CUDA 程序无需重新编译即可运行在多核 X86CPU、IBM Cell、支持 OpenCL 的设备之上... 我个人感觉 Apple 在开源界口碑较差(也许是我的错觉?),不过 Apple 也为开源界贡献了不少,Webkit,OpenCL(虽说只是个标准),Clang。我最为佩服的是虽然出身于命令行之上的 Unix 族系统,但有魄力写出自成体系的图形栈,其图形界面优美而人性化,可谓也为开源界贡献了自己的精神与思想。 对于 Clang 这个很有潜力的项目,我希望其 C++ 支持(尤其是 template 支持)能够早日完善。因为 GCC 在 template 出错时的诊断信息如同小说一般...