斯坦福大学CS143编译原理课程笔记:1.编译器与解释器简介

目录

 

前言

第一节课:编译器与解释器简介

线上与线下的概念

线上

线下

编译器与解释器的区别

编译器

解释器

FORTRAN 1结构

它包含五个阶段

1.词法 分析

2.语法解析

3.语义分析

4.优化

5.代码生成

 


前言

最近博主在上斯坦福大学的CS143课程系列的编译原理,为了便于日后的重温以及给它人学习的帮助我会更新这一系列的文章,这一系列的所有文章都是博主自己记的随堂笔记,也有很多自己的理解与见解。

第一节课:编译器与解释器简介

 

线上与线下的概念

线上

在程序中,执行属于线上,即被操作系统加载到内存中并被cpu开始解码并执行属于线上操作,标识单词:on-line

线下

不执行程序,仅仅只是生成可执行代码或者数据或者其它输出,但它不会去执行程序属于线下,标识单词:off-line

 

编译器与解释器的区别

编译器

编译器属于线下,它只通过源文件生成可执行代码,不需要在使用它时给它参数或者一些其它数据,它只需要编译源代码文件就生成可执行程序或者编译数据或者其它输出,这取决于编译器的实现,编译器不能够直接执行程序,它需要编译,同时它也不会去执行程序。

解释器

解释器属于线上,它必须输入一些参数,或者数据才能执行,它通过将输入的数据或者命令进行解释并做相应的处理,然后输出结果,解释器属于线上因为它会去执行我们输入的命令,就像shell脚本一样,shell会解析我们的脚本代码,然后解析shell代码,并进行转译成shell自己内部的命令指令集,接着去按个执行它们,同时解释器只能一行一行的转译然后一行一行的执行,不能一次性转译全部命令然后统一执行,这是规范。

通常情况下解释器相较于会慢许多,因为解释器执行的不是二进制代码,它需要转译然后在执行,而编译器编译出来的程序,是直接运行。

两者区别

编译器:编译器属于线下,只需要源代码文件,就能生成可执行程序,它不属于程序运行的一部分,属于生成程序的一部分。

解释器:解释器属于线上,它需要与解释器对应的指令集,它通过解析指令集然后执行,它属于程序运行的一部分。

 

编译器和解释器的开发历史

20世纪50年代(1950年),IBM打造了一台名为704的机器(再次之前IBM也生产过其它机器,但只有704最为成功),当时704的成本里软件最高,在当时那个硬件相对于昂贵的情况下,704的软件成本要大于硬件成本,这是因为IBM为了让用户更好的使用计算机,他们投入了大量的人力资源去编写软件,但是那个年代编程变得极其困难,不像现在,打开电脑,打开IDE就可以开始写代码了,那个时候只有0101,用打孔机来做,还要去制作打孔机所需要的指令纸,同时那个年代也不好debug,因为都是实打实的硬件环境。

这就使得一群人去思考如何更好地写软件,以及如何使编程更具有生产力。

最早用来提升编程生产力的编程语言是由John Backus(1977年授予图灵奖)在1953年开发的Speedcoding(这是专门为IMB电脑开发的高级语言,具有过程化、命令式、结构化、面向对象的特点),Speedcoding属于解释器类型,属于线上。

它的优势在于你不需要去写复杂的代码,你只需要去描述要做的功能,Speedcoding就能解释你的输入并执行,它不具备编译的过程,这让开发者们能更快的开发程序,不用再去记0101这样的指令集了。

但是它的缺点在于代码执行效率很低,比手写代码低了10-20倍,同时Speedcoding解释器占用300字节内存(在那个年代编译出来的程序都很小,但是对于现在的程序来说小到不能在小,因为现在的编译器为了运行会附加许多依赖代码,许许多多用来初始化的汇编代码或者其它依赖文件),虽然300字节很小,但是在那个年代已经占用来IBM 704电脑的30%。

因为解释器不光需要转译,还要运行,相对于更需要更大的内存空间。

Speedcoding并没有流行起来,原因是因为那个年代内存本身就小,如果运行Speedcoding那么意味着就要减少更多的内存来存储其它资料或者运行其它程序,同时效率较低。

但这也给john backus一个新的项目灵感,在当时最重要的应用程序是科学计算(数学运算),那个时候的科学运算不是像现在一样输入3+4这样的代码,而是以机器(CPU)可以执行的形式写下公司,也就是把指令拼接成一个公式,加法公式或者减法,同时要计算的数都要转化成0101这种,然后在让机器去执行最后得到输出结果。

john backus认为Speedcoding是先将指令集转译成自己认识的命令,再去执行相对于会很慢,他又想到如果让程序员先写好代码,自己在转译成CPU的可执行程序,然后在让CPU去执行效率会更高,因此FORTRAN(公式翻译)项目就诞生了,专门用于翻译计算公式的,程序员不需要写0101这种代码,只需要按照FORTRAN的代码格式来写就可以了,如3+4等等。

FORTAN开发总共用了三年,从1954年到1957年。

那个时候开发人员们认为只需要一年,但是实际用了三年,就像现在一样,程序员们仍然不能很好的预测软件开发周期,因为你不知道会出什么样的问题。

FORTAN的出现使其更快的流行了起来,当时超过50%的代码都是由FORTAN完成的,FORTAN也是最早一款编译器。一直持续到1958年。

那个时候程序员们非常开心,因为不用在去记0101这样的指令了,可以使用高级语言来进行开发,大家都能更好的使用IBM的机器了(注意那个年代凡是用电脑的,都需要输入指令,让电脑工作,也就是说每个人都需要写代码)。

FORTRAN是第一个成功的高级语言,并且对计算机科学有巨大的影响,它推动了计算机理论的发展以及程序和编译器的规范,为计算机行业打下了基石,同时FORTRAN只有一个版本1,所以被成为FORTRAN 1

编程是需要理论与实践结合的,如果你没有一定的理论与良好的专业技术,你是不可能将这门语言用好的(如果你的理论知识不够,专业不强,你学再多的编程语言都没用,编程语言就像你的工具,它只负责实现你的想法,最主要的还是你个人的动手能力以及逻辑思维能力),这也促使了许多的系统以及编程语言的但是,同时也产生了一个微妙的互动,那就是互相促进,共同成长,在当时许多充满想象力的开发者们为不同的环境以及不同的领域开发了不同的系统和编程语言,同时他们之间会互相攀比,促使相互进步,这也是计算机科学最吸引人的地方。

直到现在当代编译器仍把FORRTRAN作为基础框架。

 

FORTRAN 1结构

它包含五个阶段

1.词法 分析

2.语法解析

上面两个共同负责语法方面的问题,词法分析负责分析语法的错误和书写是否正确,词法分析确定语法没问题后交给词法解析进行解析语法的含义。

3.语义分析

语义分析负责解析变量类型,作用域规则等待

4.优化

负责对程序代码进行优化,使其更快运行,减少内存的使用。

5.代码生成

就是将代码转换成CPU可认识的可执行代码,或者其它的语言,可以根据编译器开发者的目标,FORTRAN的目标是转换成机器码(也就是CPU的指令集)。只要你愿意,你可以写出编译器来将这个代码转换成另一个高级语言的代码也一样可以。

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值