一款强大的编译器LLVM:http://llvm.org/docs/GettingStarted.html#layout
http://llvm.org/docs/LangRef.html
http://blog.csdn.net/banyao2006/article/details/7045216(中文版)
转载:http://blog.163.com/newcountry@126/blog/static/164768490201302847113/
入门指导里介绍如何使用llvm的tool来进行编译html
http://llvm.org/docs/GettingStarted.html#id34前端
LLVM笔记(八) 关于pass的摘录
http://blog.163.com/newcountry@126/blog/static/164768490201329102423113/编程
LLVM笔记(九) 关于pass的摘录2
http://blog.163.com/newcountry@126/blog/static/164768490201321195754879/后端
llvm笔记(十):IR
http://blog.163.com/newcountry@126/blog/static/1647684902013213113342194/数组
一个现代编译器的主要工做流程:
源代码 (source code) →
预处理器 (preprocessor) → 编译器 (compiler) →
汇编程序 (assembler) →
目标代码 (object code) →
连接器 (Linker) → 可执行程序 (executables)
源代码通常为高级语言 (High-level language)
目标语言(Target language)则是
汇编语言或目标机器的
目标代码(Object code),有时也称做机器代码(Machine code)。
编译器能够生成用来在与编译器自己所在的计算机和
操做系统(平台)相同的环境下运行的
目标代码,这种编译器又叫作“本地”编译器。另外,编译器也能够生成用来在其它平台上运行的
目标代码,这种编译器又叫作
交叉编译器。
预处理器(preprocessor)做用是经过代入预约义等程序段将源程序补充完整。
编译器后端(backend)编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。
通常说来全部的
编译器分析,优化,变型均可以分红两大类: 函数内(intraprocedural)仍是函数之间(interprocedural)进行。很明显,函数间的分析,优化更准确,但须要更长的时间来完成。(interprocedural很重要,是我此次看的point)
编译器分析(compiler analysis)
编译器分析的对象是前端生成并传递过来的
中间代码,现代的优化型编译器(optimizing compiler)经常用好几种层次的
中间代码来表示程序,高层的中间代码(high level IR)接近输入的
源代码的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源代码的结构;中层的中间代码(middle level IR)与输入语言无关,低层的中间代码(Low level IR)与
机器语言相似。 不一样的分析,优化发生在最适合的那一层
中间代码上。
常见的编译分析有
函数调用树(call tree),控制
流程图(Control flow graph),以及在此基础上的
变量定义-使用,使用-定义链(define-use/use-define or u-d/d-u chain),
变量别名分析(alias analysis),
指针分析(pointer analysis),数据依赖分析(data dependence analysis)等等。
上述的
程序分析结果是编译器优化(compiler optimization)和程序变形(compiler transformation)的前提条件。常见的优化和变新有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化
循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),
数组填充(array padding),等等。 优化和变形的目标是减小代码的长度,提升内存(memory),缓存(cache)的
使用率,减小读写磁盘,访问
网络数据的频率。更高级的优化甚至能够把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,
multi-threadedcode)。
编译器工做方式:
首先编译
编译器缓存
器进行
语法分析,也就是要把那些字符串分离出来。
最后生成的是目标文件,也称为obj文件。
有些时候须要把多个文件产生的
目标文件进行连接,产生最后的代码。这一过程称为交叉连接。