学习编译原理的总结1

来源:互联网 发布:新加坡方便面yum 编辑:程序博客网 时间:2024/05/31 19:52

说在前面的唠叨:编译原理这门课是大二下学期的专业课,老师教得非常耐心负责。

一开始,老师让我们做一个简单的编译器,编译一些简单的运算程序,在网上找了很多代码,我没有做出来。说实话,学软件工程这个专业,首先是好奇,然后是失望找不到激情,以至于在自己和同学眼里,我的动手能力都是非常差的。现在明白了激情需要自己创造,以后我会一心一意当个合格的程序猿,为了自己小小的梦想。我会通过这个博客来记录自己的成长历程。就算现在从0开始也不算太迟。

这一篇文章主要针对的是考试,毕竟已经到了六月考试月了。在之后我会尽力自己动手实现一个编辑器,就像小时候自己想过当一个翻译家一样。由于英文教学和考试,所以,我必须得在中文关键词后面补充上英文生气.习惯了中国的应试教育真是一件让人痛苦的事情,很想改变这种学习方式。似乎这两年的大学没生活不旦没有让我沉下心,反而越来越浮。接受这个拯救自己的艰巨任务吧!!!!!!

教材:清华大学的《编译原理》和英文版的龙书

视频 coursera <compiler>  https://class.coursera.org/compilers/lecture

好吧,正式开始了~


引论:编译器做的就是程序语言翻译的工作。人们为了方便程序的设计使之独立于机器,提高工作效率,出现了从机器码(10101010)-汇编码(三元式等)-高级语言程序(java,c,c++)逐步演变。现在的我们比以前用打孔机的程序猿们幸福得多呀!

ps:插入女神介绍:Ada Lovelace,1815年12月10日-1852年11月27日  (37岁逝世,和拜伦一样)

数学家,穿孔机程序创始人,19世纪诗人拜伦的女儿。她建立了循环和子程序概念,为计算程序拟定“算法”,被视为世界上第一位软件设计师,她对计算机的预见超前了整整一个世纪。美国国防部曾将一种计算机语言命名为阿达语言,以纪念这位“世界上第一位软件工程师”。

谁说女生不能当写程序呀~~虽然我天分不好,但是我相信勤能补拙滴~并且,激情是创造出来的!萌萌哒!

回想自己在学习英语的时候怎么做中译英翻译题的,首先得翻译一个个单词的意思和词性,再按语法规则连成句,再做优化修改使其更符合英语表达习惯,到自己满意为止就是翻译成功啦!

编译器这个笨家伙只能按图索骥地工作,而且CPU一次处理一个指令。所有让计算机处理的复杂问题最后都会化为一个个逻辑性很强的简单步骤的重复,执行速度超快这就是计算机的魅力,程序员的魅力就是能把复杂的问题分解成最刻板的计算机能懂的步骤。编译器这门课程有很多精辟的算法,那都是人类智慧的结晶呀!我想我什么时候能自己发明创造出这么glamorous的stuff就好了。有句话说的好:人的一切痛苦,本质上是,对自己无能的愤怒。我从大二开始好像基本处于这么一种痛苦的状态,现在大二快结束了,时间不允许我再去想太多了。

1.另一个翻译家兄弟解释器(interpreter)和编译器(compiler)有神马不同呢?

首先编译器是讲全部代码编译成可执行的文件,执行程序时相对来说会快很多,但是错误的发现也是在整个程序被翻译之后有时候并不容易找到。

而解释器通常会有输入的数据,程序一边解释一边执行所以很慢,遇到错误立即就停止了所以容易发现错误,最后得到的是一个输出结果。

还有不同就是两者的储存结构不同了,这里还不是太懂,忽略先。

很多高级语言两者都有,如:BASIC LISP PASCAL JAVA

2.什么是前端(front end)和后端(back end)?为什么要分成这两部分?

前段是将源程序翻译成IR(intermedia represention),后端的功能是将IR翻译成目标代码。由于有些编译器要(如GCC)处理很多不同的源程序,而且不同机器最后处理的代码也有差别,这样分开的话使得编译器更加高效和扩展性更强吧~我是这么理解的。

3.为什么要将词法分析和语法分析分成两个独立的部分?

a.压缩编译时扫描字符的时间

b.此法规则描述简单,也便于独立处理

c.使得语法分析获得更多信息(上下文环境)

d.便于处理同一种语言的不同表示形式(扩展)



structure of a compiler:

1.lexical analysis 词法分析 将lexeme词素变成token单词符号。

为了复习考试,直接上题目:

a.识别下面程序中构成单词的词素,并给出每个单词的合理属性值:
int max(i,j)int i,j;
/*返回整数i和j的最大者*/
{
return i>j? i:j;
};

solution:

token的表达形式为:<int>,<id,"max"> ,<op,">"> <(>;...等等

注意事项
1. 单词token(终结符),模式pattern(规则),词素lexeme(源程序的字符序列)
2. 可构成的token:关键字,操作符(冒号和问号),标识符,常量,字符串,标点符号(括号,分号。。)
3. 注释是在词法分析时采取忽略处理,词法分析器对程序采取非常局部的观点——词法正确并不能保证语法语义一定正确。
4. 不是每个token都需要有属性(如 int ,return和标点符号)。

b.单词的描述工具

正规表达式
1、偶数:[1-9][0-9]*[02468]|[02468]
2、每个2均在9之前的数字串:(~9)*(~2)*
3、{0, 1}上含有子串010的所有串:.*010.*
4、有且只有3个1的0、1构成的字符串:0*10*10*10*
5、偶数个0和偶数个1的由0和1组成的符号串全体:(00|11)* ((01|10) (00|11)* (01|10) (00|11)* )*
6、按词典递增序排列的所有字母串 :( a | A)* ( b | B)* ( c | C)*......( z | Z)*
7、不包含子串abb的由a和b构成的串: b*( a | (ab) )*

正规式转为正规文法:

A=XY ---->     A→xB B→y

A=x*y ------>  A→xA|y

A=x|y --------> A→x  A→y

c.有穷自动机(FA):自动识别正规集

DAF 每一个状态输入一个字符只能转变成一种状态 而NFA可以转变成多种,有空弧。每个NFA都存在一个相等的DFA。

以下这张图每一个箭头都代表一种题型,一个知识点。

根据一个具体的词法描述构造正规表达式,再把正规表达式转换为NFA(有时直接转换为DFA),DFA最小化。

偶数个0奇数个1且由0和1构成的串:(这个略难)
even0_even1 → (00|11)* ((01|10) (00|11)* (01|10) (00|11)* )*
                     →(00|11|((01|10)(00|11)*(01|10)))*
even0_odd1→1 even0_even1| 0(00|11)*(01|10) even0_even1

明天把习题课和期中考试相关的题目练一练,期末考试这一块问题就不大了。

接下来的章节预告:


2.syntax analysis<重点>

3.semantic analysis<难点>

4.intermedia represention<有些编译器没有这一步>

5.optimizaition<耗时最长>

6.code generation








0 0
原创粉丝点击