【编译原理】 CS143 斯坦福大学公开课 第一周:简介

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包含了五个组成部分:

  1. Lexical Analysis – 词法分析
  2. Parsing
  3. Semantic Analysis – 语义分析
  4. Optimization – 优化
  5. 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)是最大的成本。(即让程序员学习这门语言、让这门语言流行是最困难的)

结论:

  1. 广泛使用的编程语言的变化速度将会越来越慢。(就是说你呢,C)
  2. 开始一门新的编程语言将很简单。

于是,如果 productivity > training cost (生产率>学习成本) 那么就会去学习这门新语言。

  1. 编程语言将一次又一次的填补空白。
  2. 新的编程语言将和旧的编程语言非常相似(就比如Java vs C++)

什么是好的编程语言?

没有普遍接受的语言设计标准。

发布了39 篇原创文章 · 获赞 79 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40515692/article/details/102939102