一款强大的编译器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来进行编译

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)作用是通过代入预定义等程序段源程序补充完整。

 

编译器前端(frontend)前端主要负责解析(parse)输入的源代码,由语法分析器和语意分析器协同工作

 

编译器后端(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文件。
再经过链接器的链接就可以生成最后的可执行代码了。
有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。

最新文章

  1. java中打印变量地址
  2. 学习mongo系列(六)limit(munber),skip(number)
  3. ssis trainning
  4. 【LeetCode】58 - Length of Last Word
  5. 跟我学习dubbo-简介(1)
  6. 算法对比:Prim算法与Dijskra算法
  7. linux下各种文件格式的压缩以及解压缩命令
  8. 2-Bom
  9. DispatcherServlet介绍
  10. [Cerc2013]Magical GCD
  11. CentOS7 安装Python
  12. VBoxManage安装
  13. Java细节整理——数组与内存控制
  14. jmeter 启动jmeter-server.bat远程调用报错: java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
  15. 如何传递参数给ASP.NET Core的中间件(Middleware)
  16. box-shadow outline 实现双边框 阴影
  17. Change Jenkins time zone
  18. 《Agile Web Development With Rails》读后感--rails基于web设计的best Practices
  19. K:双栈法求算术表达式的值
  20. jeecms上传文件限制导致413-Request Entity Too Large

热门文章

  1. 【Qt】命令行编译Qt程序(nmake)【转】
  2. 为Eclipse设置背景色
  3. 【译】Android系统简介
  4. Log Parser 2.2
  5. cadence PCB绘制步骤
  6. Error_code: 2003
  7. 这些年,我收集的JavaScript代码
  8. mysql笔记整理
  9. 学习asp.net mvc5心得
  10. python3 学习总结与建议