Chapter1. 编译原理引论Note
一. 详解三大编译器:gcc、llvm 和 clang - 知乎 (zhihu.com)
LLVM利用gcc作为前端产生IF,分析结果——代码优化和生成
clang作为llvm2.0的前端,devised as API,can be integrated into other 源代码分析工具和IDE
二. 编译器的Compile process(编译过程)
- 词法分析:表达式——》(记号,属性值)二元组
- 语法分析:1. 分析各运算符的使用是否正确,2. 常用语法树来组织运算符与变量
- 语义分析:分析代码的语义,
1.语法分析器能够确定一个源程序的语法结构,能够检测出源程序中的语法错误,并且能够从常见的错误中恢复并继续处理程序的其余部分。
2. 语法制导的语言翻译负责将符号流根据制导规则翻译;
3. 变量类型检查验证类型的正确性?~~
了解运行时存储空间的组织和管理的目的:1. 考察未被调用时与活动时过程中静态的名字与运行时数据对象的绑定关系
2. 优化活动记录的数据布局与组织方式 3. 根据数据的寿命分配存储位置 - 中间代码生成:把源代码适合形成汇编的中间代码,常用三地址中间代码
- 代码优化:根据语义删除一些不必要的代码,
- 如60转换成浮点数可在编译时自动完成,省去t1=inttofloat(60);
- 只作为单独右值赋值一次的变量可以省去初始化,t1=t2*70
- 代码生成:中间代码——汇编程序(——进一步二进制.exe执行程序)
补充:生成可执行二进制文件后——装入操作系统目标位置(一般设为D盘)——加入动态链接库——向注册表中写入相应的项——生成桌面快捷方式、开始菜单等
三. Intepretor(解释器)与编译器的区别
- compile&execute;
- 解释一句/小段代码)
四. 编译器衍生的应用:
1. 指令集(汇编语言)方面:to simplify编译生成的汇编语言,promote 精简指令集发展
2. 对于普适的指令集(体系结构)有x86; specialized 指令集is various,编译器要把源代码翻译成不同的指令集程序;
3. based on COD,要提高计算机效率,可以采用
程序多发射技术(多线程), 对内存进行分层,将访问频繁的放在高层等等,
根据这些技术调整编译器编译方案,使得
- 生成的代码提高访存效率:
1. 改变数据的布局,如搜索树
2. 改变代码的布局
3. 改变数据的访问方式(如OS经典的arr[100][100]在内存与磁盘间的访问次数问题) - 自动控制多线程的通信、管理
4. 优化技术催生了程序优化程序(也叫错误探测器),功能有:
- 类型检查; 2. 作用域检查; 3. 内存使用检查
5. 编译器本身是源代码到二进制程序的语言翻译工具,
引导人们创造出二进制——》Alpha等高级语言、SQL——》二进制语言等翻译工具
五. gcc翻译实例
gcc -E test.c -o test.i
//预处理——由test.cC语言源程序生成test.i
gcc -S test.i -o test.s
//编译——由test.i生成汇编程序test.s
gcc -c test.s -o test.o
/汇编——由test.s生成二进制文件test.o
gcc test.o -o test
//链接——将单独的test.o文件与要用到的库文件链接,生成可执行文件
小资料:
小常识:
java有虚拟机(运行时系统),可将编译后生成的Java代码转化成当前系统能汇编的指令集(汇编语言程序),
C语言也有类似的运行时库——C Runtime,
mingw(minimal GNU for windows)含有API,允许访问本地标准的C Runtime,
可利用mingw-get.exe下载mingw32-make.exe
(windows命令行指令: .\mingw-get.exe install mingw32-make.exe
)
设置为全局变量后即可使用cmake软件的make命令——根据makefiles生成目标文件
愿偿少年泪,犹趁未老时!
本文来自博客园,作者:clfire,转载请注明原文链接:https://www.cnblogs.com/sky1water/p/16720553.html