youtube : 1.1| Introduction to Compilers and interpreters
1.1| Introduction to Compilers and interpreters – 编译器解释器介绍
- 两种主要的实现编程语言的方法 – 编译器和解释器
这个课程主要讲编译器,编译器通过产生汇编语言或者字节码等等,可以认为是off-line的,解释器则可以认为是on-line的。
- 编译器和解释器开发历史
1954年,IBM开发了名为704的机器,用户购买该机器后发现软件成本远大于硬件成本。这让人们思考如何更容易的创造程序。
1953年,John Backus开发了Speedcoding,类似于我们今天说的解释器。不过有两个主要的缺点,第一是比直接编写的程序慢10-20倍,第二是占用了300字节的内存,虽然今天看来很小,但是这在当时相当于704机器的30%内存。因此并未流行。
Formulas Translated – 公式翻译项目或者叫做FORTRAN(原来是这么取的名字呀!)在1954年开始一直到1957年,不过有趣的是,他们之前以为只需要1年。到1958年,一半以上的代码都是FORTRAN编写的,非常流行。
- FORTRAN 1
因此FORTRAN 1是第一种成功的高级语言(怪不得教材少不了它),并对之后的编译器产生了深刻的影响。编译器迷人的地方在于它结合了Theory – 理论 Practice – 实践。
FORTRAN 1包含了五个组成部分:
Lexical Analysis
– 词法分析Parsing
Semantic Analysis
– 语义分析Optimization
– 优化Code Generation
– 代码生成
1.2| Structure of a Compiler – 编译器结构
让我们用英语的方法对编译器结构进行简单介绍。
- 第一步,认识单词 – 字母以上的最小单元
Lexical Analysis
– 词法分析的目标是将程序的文本划分为“words”和“token”。
- 第二步,明白句子的结构
Parsing = Diagramming Sentence
– 图解句子,这里的“图”是一棵树
- 第三步,明白意思,这对于编译器来说很困难
Semantic Analysis
– 语义分析,编译器执行有限的语义分析来捕获程序的不一致之处(程序是否有歧义、语法错误)
- 第四步,优化,这里有一点像编辑(看成把白话文写成文言文吧 /W\ )
Optimization
– 优化,让程序运行更快,或者占用更少的内存等等。
- 第五步,翻译成另一种语言(这不是英语白痴的我看懂句子经历的5步吗 (╯°Д°)╯︵ ┻━┻ )
Code Generation
– 代码生成,翻译成机器码或者其他语言。
几乎每一个编译器都包含这5步,但是从上一节介绍的FORTRAN
开始,这5步所占比重却发生了改变。
图片上面的是传统的编译器,语义分析比重较小,其他比较平衡。
图片下面的是现代编译器,代码优化比重非常大,语义分析比重一般,其他几步比重小。(过于真实)
1.3| The Economy of Programming Languages – 程序设计语言的经济性
为什么有这么多编程语言?
因为编程领域有很多特殊/矛盾的需求,很难设计一门语言完成所有情形。
比如:
科学计算(Scientific Computing
) 比如 FORTRAN
- 需要好的浮点运算(FP,floating point)的支持。
- 需要好的数组、矩阵(Arrays)的支持。
- 需要好的并行计算(parallelism)的支持。
- …
商业应用(Business Applications
) 比如 SQL
- 需要可靠的持久化(persistence)的支持。
- 需要好的报告(report facility)的支持。
- 需要好的数据分析(data analysis)的支持。
- …
系统编程(System programing
) 比如 C\C++
- 需要对资源控制(control of resource)的支持。
- 需要好的实时约束(real time constraint)的支持。
- …
为什么我们有新的编程语言?
对于一门编程语言,训练程序员使用它(Programmer training)是最大的成本。(即让程序员学习这门语言、让这门语言流行是最困难的)
结论:
- 广泛使用的编程语言的变化速度将会越来越慢。(就是说你呢,C)
- 开始一门新的编程语言将很简单。
于是,如果 productivity
> training cost
(生产率>学习成本) 那么就会去学习这门新语言。
- 编程语言将一次又一次的填补空白。
- 新的编程语言将和旧的编程语言非常相似(就比如Java vs C++)
什么是好的编程语言?
没有普遍接受的语言设计标准。