版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28788687/article/details/82502137
中国大学Mooc - 编译原理学习1
首先附上视频原链接
https://www.icourse163.org/learn/HIT-1002123007#/learn/content?type=detail&id=1004566059&cid=1005737096&replay=true
以及使用的教程地址:链接: https://pan222(取这三个2掉).baidu.com/s/1aCAXpALoGgb09f1SYHOyfA 密码: btkm
- 什么是编译??
① 编译:将高级语言翻译成汇编语言或机器语言的过程.(什么叫做语言?)
②编译器在语言处理系统中的位置
搞清清楚这个问题的同时,我们也要搞清楚图中其他几种“部件”的作用,这是大有裨益的。
预处理器:将储存在不同的文件中的源程序汇聚在一起。把称为宏的扩展缩写语句转化为原始语句。
链接器:将多个重定位的机器代码,包括库文件连接到一起,解决外部内存地址问题。
加载器:修改可重定位地址。将修改后的指令和数据放到内存中适当的位置。
汇编器:将汇编语言翻译为机器语言的程序。(详见简要理解源程序到可执行文件) - 编译器的结构
注意:因为优化是可选的,所以图中所示的两个优化步骤之一可以被省略。
In the room,he broke the windows with a hammer.
①词法分析/扫描: 从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型,并生成token(词法单元)序列。一个词法单元形如<抽象符号,属性值(指向符号表中关于这个词法单元的条目)>.详见书1.2.1节。
②语法分析:从生成的token序列中识别出各类短语,并构造语法分析树。实际上并不会真正生成一颗树。
③语义分析:收集标识符的属性信息(种属种类、储存位置、长度、值、作用域、参数和返回值信息),储存在符号表中;语义检查(如数组下表不为整数等)
注:这张图只是一个编译器的逻辑组织方式,实际完全可以将不同过程放在一起实现,如下位的“中间代码生成”与”语义分析“.
中间代码生成和编译器后端
①中间代码生成:生成一个明确的低级的或类机器语言的中间表示。
②代码优化:为改进代码所进行的等价程序变换,使其运行得更快,更节约空间。如int x = 5;int y = x + 2;在某些情况下会被替换为int y = 5; (实际中该工程可能会很复杂).