0
点赞
收藏
分享

微信扫一扫

编译原理 CS-143(更新至week1)

编译原理 CS-143

Pre-Course Survey

image-20220114183629932

一个小调查,无伤大雅

实验所需虚拟机
链接: https://pan.baidu.com/s/16KXICHhpBb22v4CyNQugMg 提取码: n44a

Navigation Your Course

课程导览

属性bar用的

image-20220114183851092

介绍了 课程模块,大纲模块,讨论模块,测评模块,测评模块会打分

image-20220114184149658

讨论模块要遵守规则,不发一些不必要的内容,淫秽色情,垃圾邮件,抄袭的内容

01-01: Introduction (8m20s)

image-20220114184612313

编程语言又两种实现,也就是编译器和解释器

解释器做了啥

image-20220114184845505

我们将数据和程序发送给了解释器,解释器开始运行,有了输出,解释器相当于是一个在线的

image-20220114185018915

写一个程序,产生了一个可执行文件,当然不只是可执行文件

可能是汇编,字节码之类的,

现在你不需要输入数据,就能得到输出

在结构中就是线下,

当然是相对于解释器的,解释器需要结合一个数据进行执行,而编译器不需要

image-20220114185325263

因此,我们不需要对程序进行重编译或者做其他处理,我们就能对可执行程序传入很多不同的值或数据集进行处理

编译器开发历史:

IBM 704软件成本超过了硬件成本

image-20220114185938859

image-20220114190037039

用解释器比你直接跑代码会慢很多,10-20倍

fortran

直接翻译成机器可执行的,会快很多

formulas translated 公式翻译

image-20220114190246583

image-20220114190625171

有些仍然保留了FORTRAN 1的框架

什么是fortran 1 框架呢

lexical Analysis 词法分析

parsing 解析

这两个共同关注语言的语法部分syntactic

semantic analysis 语义分析,关注语义方面,包括类型和作用域

optimization 优化 运行的更快,更节省

code generation 也就是translation 转换,转换结果可以是字节码,机器码,或者是另一种高级语言

image-20220114191008501

01-02: Structure of a Compiler (13m53s)【编译器结构】

first step:recognize words

对单词的认识/理解

image-20220114214214204

image-20220114214239789

this is a sentence

你需要理解 大小写,空格,句点才能够正确的理解这个意思

如果给我们一个其他的

ist his ase nte nce

is this a sentence

我们也无法很容易得到结果

image-20220114214432046

词法分析的目标,就是将程序代码文本按照他的方式进行分词,

也就是对词的一个区分

这个句子,分为几个token呢(词法单元)

if,then,else,

x,y,z

1,2

=,空格

同时,我们仍然要区分一个等于号和两个等于号

句法分析

image-20220114214723666

image-20220114214749082

分析词的意思后(名词,动词,形容词),我们就会有句法

(主语subject,谓语verb,宾语object)

image-20220114214856668

image-20220114214906888

共同构成了一个句子树,这就是一个英文句子进行语法分析的例子

代码也同理

image-20220115120728962

针对if then else进行分析

if-then-else就是解析树的树根

如下为if-then-else的分析树

image-20220115120852555

if then else

分成了三个部分,断言部分,then部分,else部分

if包含了 x == y

then包含了 z = 1

else 包含了 z = 2

句意分析

image-20220115121122792

当理解句子结构厚,我们就要去理解这句话写了什么内容

编译器只能做有限的语义分析,找到自相矛盾的地方,

image-20220115121401909

example

jack said jerry left his assignment at home

这里的his 我们无法知道他是指定jack还是jerry

image-20220115121713821

worse

jaca said jack left his assignment at home

这个更糟糕的情况,我们不知道有几个人,jack是两个人,his是一个人?

可能性很多

image-20220115121826017

image-20220115121900533

编程语言中,为了避免这种尴尬,就有了变量绑定

非常严格的规则,防止歧义

如上的程序,会输出4

外层的定义jack会被隐藏

image-20220115122012038

编译器执行文本的语义分析时,不需要考虑对变量进行作用域的绑定分析

jack和her的类型不匹配,肯定不是一个人

optiimization(优化)

image-20220115123507823

比较像一个专业的编辑在一定的字数范围内对文章长度做删减

but a little bit like editing

替换为

but akin to editing

意思没变,但是词变少了,节省了资源

run faster,use less memory,lower power,database,network

一个需要优化的程序

y*0 和给x赋值为0 是一致的,因此我们比起乘法,仅仅做赋值即可

但是这个不是一个正确的规则

仅仅对integer有效

image-20220115123941638

浮点数无效,

finally code Gen

image-20220115124119383

也就是翻译成其他语言,编译器把高级语言转换为汇编语言

image-20220115124227579

最基本的fortran对于语义分析会很小

而现代的编译器,优化会占据很大

image-20220115124308263

01-03: The Economy of Programming Languages (19m51s)【编译器性价比】

image-20220115180537506

本节课,将会谈论这三个问题,

为什么这么多的语言
为什么又新的语诞生
什么是一个好的编程语言

首先第一个

why are there so many progamming languages

image-20220115181057596

首先我们是有三个大概的范围,应用领域不同

他们的优势不同,作用域不同,语言不同

科学研究:需要好的浮点数运算,FP,好的数组支持,大并行支持(parallelism)FORTRAN语言 (公式 翻译)fomulate translate

商业领域:需要好的稳定性,防止丢失数据,而且要可靠,需要报告的生成,数据分析,数据处理之类的, 也就是SQL比较常用

系统编程:也就是嵌入式,控制设备之类的,我们需要控制一些底层的资源,细粒度控制,需要能够预判时间(实时控制),在一定时间内做出反应,或者对网络进行大量的响应 广泛的就是c和c++

why are there new programming languages?

为什么需要设计一个新的语言

image-20220115181648133

培养程序员以及培养某种语言程序员的成本 这个比较重要,如何教会他们去使用

因为去开发,去开发一个新的编译器的成本并不是很高

有如下的预测

有两点,也就是

第一个预测是 广泛使用的编程语言改变的很慢,会越来越保守

第二个预测是 很容易的去开发一个新的语言,培训成本为0,新的编程语言进化的会很快。

productivity > tranning cost

生产力要大于学习耗费

就会选择新的语言

image-20220115184117460

什么时候呢?

需要一种语言去填补空白的时候(新的应用领域),往往 会选择新的语言

旧的语言不一定能够支持新的应用领域

新的语言有时候会看起来像旧的语言,就比如java很像c++

猜测:为了降低培训成本,通过学过的语言更轻松的去解除

image-20220115184353195

what is a good programming language?

从语言设计的通用性来说,没有一个好的编程语言

image-20220115184510989

讨论这个问题,无法达成共识,关于什么是好的语言,也没有普遍接受的共识,

讲师的猜测:

是大众的接受度/使用度,可以作为是一个好的语言的标准

image-20220115184637859

Summarize

image-20220115182920040

很难设计出一个整合你所有想要功能的语言

培养程序员花费了大量成本

02-01: Cool Overview (19m58s)【cool语言概述】

classroom object oriented language = cool

课堂专用面向对象语言

被设计短期内/一个学期内写出编译器,需要易于编写

image-20220115191815059

本课程的目的:完整的编译器编写,包括MIPS 指令集

image-20220115192007173

我们可以运行编译器,也可以生成mips汇编语言,然后可以在你能访问的任何机器上模拟mips汇编语言

分为五个任务,编译器本身包含四个阶段

词法分析

语法分析

语义分析

代码生成

我们编写如上模块采用的是 插件兼容

也就是,我们可以使用模板填充其他几个,然后我们只是去编写词法分析,然后和标准输出进行比对,保证自己编写的足迹按没问题

image-20220115192358338

优化可以当一个可选的作业

image-20220115192530573

开始编写程序

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指令,和一些分支的数量

举报

相关推荐

0 条评论