编译原理 CS-143
- Pre-Course Survey
Pre-Course Survey
一个小调查,无伤大雅
实验所需虚拟机
链接: https://pan.baidu.com/s/16KXICHhpBb22v4CyNQugMg 提取码: n44a
Navigation Your Course
课程导览
属性bar用的
介绍了 课程模块,大纲模块,讨论模块,测评模块,测评模块会打分
讨论模块要遵守规则,不发一些不必要的内容,淫秽色情,垃圾邮件,抄袭的内容
01-01: Introduction (8m20s)
编程语言又两种实现,也就是编译器和解释器
解释器做了啥
我们将数据和程序发送给了解释器,解释器开始运行,有了输出,解释器相当于是一个在线的
写一个程序,产生了一个可执行文件,当然不只是可执行文件
可能是汇编,字节码之类的,
现在你不需要输入数据,就能得到输出
在结构中就是线下,
当然是相对于解释器的,解释器需要结合一个数据进行执行,而编译器不需要
因此,我们不需要对程序进行重编译或者做其他处理,我们就能对可执行程序传入很多不同的值或数据集进行处理
编译器开发历史:
IBM 704软件成本超过了硬件成本
用解释器比你直接跑代码会慢很多,10-20倍
fortran
直接翻译成机器可执行的,会快很多
formulas translated 公式翻译
有些仍然保留了FORTRAN 1的框架
什么是fortran 1 框架呢
lexical Analysis 词法分析
parsing 解析
这两个共同关注语言的语法部分syntactic
semantic analysis 语义分析,关注语义方面,包括类型和作用域
optimization 优化 运行的更快,更节省
code generation 也就是translation 转换,转换结果可以是字节码,机器码,或者是另一种高级语言
01-02: Structure of a Compiler (13m53s)【编译器结构】
first step:recognize words
对单词的认识/理解
this is a sentence
你需要理解 大小写,空格,句点才能够正确的理解这个意思
如果给我们一个其他的
ist his ase nte nce
is this a sentence
我们也无法很容易得到结果
词法分析的目标,就是将程序代码文本按照他的方式进行分词,
也就是对词的一个区分
这个句子,分为几个token呢(词法单元)
if,then,else,
x,y,z
1,2
=,空格
,
同时,我们仍然要区分一个等于号和两个等于号
句法分析
分析词的意思后(名词,动词,形容词),我们就会有句法
(主语subject,谓语verb,宾语object)
共同构成了一个句子树,这就是一个英文句子进行语法分析的例子
代码也同理
针对if then else进行分析
if-then-else就是解析树的树根
如下为if-then-else的分析树
if then else
分成了三个部分,断言部分,then部分,else部分
if包含了 x == y
then包含了 z = 1
else 包含了 z = 2
句意分析
当理解句子结构厚,我们就要去理解这句话写了什么内容
编译器只能做有限的语义分析,找到自相矛盾的地方,
example
jack said jerry left his assignment at home
这里的his 我们无法知道他是指定jack还是jerry
worse
jaca said jack left his assignment at home
这个更糟糕的情况,我们不知道有几个人,jack是两个人,his是一个人?
可能性很多
编程语言中,为了避免这种尴尬,就有了变量绑定
非常严格的规则,防止歧义
如上的程序,会输出4
外层的定义jack会被隐藏
编译器执行文本的语义分析时,不需要考虑对变量进行作用域的绑定分析
jack和her的类型不匹配,肯定不是一个人
optiimization(优化)
比较像一个专业的编辑在一定的字数范围内对文章长度做删减
but a little bit like editing
替换为
but akin to editing
意思没变,但是词变少了,节省了资源
run faster,use less memory,lower power,database,network
一个需要优化的程序
y*0 和给x赋值为0 是一致的,因此我们比起乘法,仅仅做赋值即可
但是这个不是一个正确的规则
仅仅对integer有效
浮点数无效,
finally code Gen
也就是翻译成其他语言,编译器把高级语言转换为汇编语言
最基本的fortran对于语义分析会很小
而现代的编译器,优化会占据很大
01-03: The Economy of Programming Languages (19m51s)【编译器性价比】
本节课,将会谈论这三个问题,
为什么这么多的语言
为什么又新的语诞生
什么是一个好的编程语言
首先第一个
why are there so many progamming languages
首先我们是有三个大概的范围,应用领域不同
他们的优势不同,作用域不同,语言不同
科学研究:需要好的浮点数运算,FP,好的数组支持,大并行支持(parallelism)FORTRAN语言 (公式 翻译)fomulate translate
商业领域:需要好的稳定性,防止丢失数据,而且要可靠,需要报告的生成,数据分析,数据处理之类的, 也就是SQL比较常用
系统编程:也就是嵌入式,控制设备之类的,我们需要控制一些底层的资源,细粒度控制,需要能够预判时间(实时控制),在一定时间内做出反应,或者对网络进行大量的响应 广泛的就是c和c++
why are there new programming languages?
为什么需要设计一个新的语言
培养程序员以及培养某种语言程序员的成本 这个比较重要,如何教会他们去使用
因为去开发,去开发一个新的编译器的成本并不是很高
有如下的预测
有两点,也就是
第一个预测是 广泛使用的编程语言改变的很慢,会越来越保守
第二个预测是 很容易的去开发一个新的语言,培训成本为0,新的编程语言进化的会很快。
productivity > tranning cost
生产力要大于学习耗费
就会选择新的语言
什么时候呢?
需要一种语言去填补空白的时候(新的应用领域),往往 会选择新的语言
旧的语言不一定能够支持新的应用领域
新的语言有时候会看起来像旧的语言,就比如java很像c++
猜测:为了降低培训成本,通过学过的语言更轻松的去解除
what is a good programming language?
从语言设计的通用性来说,没有一个好的编程语言
讨论这个问题,无法达成共识,关于什么是好的语言,也没有普遍接受的共识,
讲师的猜测:
是大众的接受度/使用度,可以作为是一个好的语言的标准
Summarize
很难设计出一个整合你所有想要功能的语言
培养程序员花费了大量成本
02-01: Cool Overview (19m58s)【cool语言概述】
classroom object oriented language = cool
课堂专用面向对象语言
被设计短期内/一个学期内写出编译器,需要易于编写
本课程的目的:完整的编译器编写,包括MIPS 指令集
我们可以运行编译器,也可以生成mips汇编语言,然后可以在你能访问的任何机器上模拟mips汇编语言
分为五个任务,编译器本身包含四个阶段
词法分析
语法分析
语义分析
代码生成
我们编写如上模块采用的是 插件兼容
也就是,我们可以使用模板填充其他几个,然后我们只是去编写词法分析,然后和标准输出进行比对,保证自己编写的足迹按没问题
优化可以当一个可选的作业
开始编写程序
1- 每个cool程序必须要有一名为main的class
class main{
};
class 后面跟名字,然后花括号带分号结尾
一个程序包含若干类
main类中,main方法必须存在,这个方法用来启动程序,此外,这个方法必须无参,main方法永远无参
class Main{
main():Int{
1
};
};
在main类中,有一个main方法
cool中,需要对方法指明返回值的类型,这里写int
cool是一种表达式语言,也就是一段代码
表达式可以写的随意一点,即这个表达式对于这个方法的表达而言没有显示的返回语句
() -> a+b ,返回a+b的值
上面那个方法体中只有一个数字1 所以运行程序的时候,返回的就是这个方法的值
那么如何编译?
coolc就是cool的编译器,
coolc 1.cl
就会生成1.s的新文件,
我们尝试运行,spim(mips模拟器)
接着出现了一些数据,例如 执行了多少条指令,load指令,store指令,和一些分支的数量