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

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





学习编译原理的总结1相关推荐

  1. 对学习编译原理的看法

    我认为编译原理这本书是一门与代码做斗争的课程,学习编译原理能够追寻程序设计语言的本质,了解计算机各种语言编译的原理.学习了编译原理能够更加深入的了解计算机各种高级语言使用的原理,能使自己更加容易更加好 ...

  2. 每天两小时学习编译原理——一个学期的第三天,希望能坚持长久✨

    上一篇:每天两小时学习编译原理--一个学期的第二天,希望能坚持长久✨ 下一篇:每天两小时学习编译原理--一个学期的第四天,希望能坚持长久✨ 继续学习 编译程序过程 词法分析 语法分析 语义分析与中间代 ...

  3. 学习编译原理对下面这段java跳不出死循环大概能有较好的解释吧

    java 线程问题? public class ThreadTest {public static void main(String[] args){System.out.println(" ...

  4. 编译原理学习笔记一(待续)

    这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的 ...

  5. [编译原理学习]词法分析

    此前一直没能系统完整地学过编译原理,只有很粗浅的理解,虽然其实对工作里的任务也没啥影响,但总觉得缺了一大块知识,加上对所谓程序员三大浪漫(编译器,操作系统,图形学)的向往,所以最近跟着网易云课堂推出的 ...

  6. 编译原理 - 学习/实践

    1.应用背景 编译技术,与我们的工作[很多编程语言的工作原理]息息相关, 同时, 除了丰富的应用场景,学习编译技术对于提升程序员的竞争力也很重要. 2.学习/实践 文档阅读 JointJS - Jav ...

  7. 计算机编译原理有必要学吗,计算机程序编译原理学习心得

    计算机程序编译原理学习心得 <编译原理>是计算机专业的一门重要课程,正如教材:第一章的引论所述,"编译程序是现代计算机系统的基本组成部分之一"."一个编译程序 ...

  8. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  9. 我看过的编译原理方面的好文章

    本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...

  10. 计算机的编译原理pdf,计算机编程基础--编译原理.pdf

    第一章 引论(1) 1.1 什么叫编译程序 编译程序:是指这样的程序,它能够把某种 语言的程序转换成另一种语言的程序, 而后者与前者在逻辑上是等价的.如果 源语言是诸如FORTRAN.Pascal.C ...

最新文章

  1. 通过libjpeg-turbo实现对jpeg图像的解码
  2. Java项目:在线婚纱摄影预定系统(java+javaweb+SSM+springboot+mysql)
  3. 七彩岁月【我与51CTO一“七”成长】
  4. 《实施Cisco统一通信VoIP和QoS(CVOICE)学习指南(第4版)》一导读
  5. Windows系统下黑客(极客)学习发展流程图
  6. java基础知识陷阱
  7. 信息学奥赛C++语言: 数字方阵
  8. Eureka 微服务注册中心搭建
  9. .Net Remoting与Web Service
  10. 牛客网 多校3 I三角形(皮克定理)
  11. 达叔的正交化(第三课3.2)
  12. golang 同一个包下不同文件之间函数调用问题
  13. TensorFlow 卷积神经网络之猫狗识别(二)
  14. 炫酷恶趣强大的制作神器小程序源码_支持多种流量主模式
  15. 有限覆盖定理证明其他实数完备性定理
  16. scrapy指定item输出项顺序到csv
  17. 联合体(union)的使用方法及其本质
  18. Java jdk 环境配置
  19. 生信识图之 点图进阶-4 (PCA下篇)
  20. Retrofit源码学习

热门文章

  1. PlatformIO中arduino框架下stm32编程实现原理
  2. 周立功烧写器(ZLG SMARTPRO5000U-Plus)烧写验证
  3. visio连接线文字背景填充_文字稿:visio中如何调整连接线上文字的位置?
  4. 设置虚拟机桥接模式以及解决桥接模式上不了网以及ping不通主机的问题
  5. mysql max connects_出现mysql max-connections问题解决解决办法
  6. Android渐变折线图,自定义View之颜色渐变折线图
  7. 德国-帕德博恩大学轴承数据集解读
  8. TIM无法打开本地文件
  9. 22fall 游戏/数字媒体/人机交互DIY留学申请经验贴
  10. pdf增强锐化软件_分享一波图像处理软件神器,绝对牛皮!!