Luna Tech

Tutorials For Dummies.

Compilers - 1

2021-07-19


0. 前言

今天看了斯坦福大学的一门公开课—— compilers 的第一讲,本文作为学习笔记分享给大家~


1. Compiler vs Interpreter

首先我们要知道 compiler(编译器) 和 interpreter(解释器)都是 programming language 的 implementation approach。

也就是说,它们的目的都是实现编程语言。

那么这两种实现方式有什么不同呢?

interpreter 是直接把 program 和 data 转换成 output;

而 compiler 则是先把 program compile 成 executable code,然后再用这个 executable code 去处理 data,输出 output。

用一个形象的比喻来说,interpreter 是 online processing,compiler 是 offline processing。

那么哪种方法更高效呢?

从处理的速度和所需的资源来看,offline 的 compiler 更加高效。


2. Fortran

第一个用编译器实现的编程语言

Fortran 是第一个用编译器实现的语言,它的出现是因为人们发现 interpreter 占用了太多的内存资源(当时计算机的硬件资源很有限),所以假如能够把所有的 formula 都提前转换成机器可以直接识别的 executable code,再去进行计算,就可以节约内存资源。

Fortran 项目于 1954 年开始,到 1957 年完成(当时预估一年完成,结果搞了三年,哈哈,看来人们一直都没法准确预估项目时间~)。

Fortran 的设计理念至今仍被沿用

Fortran 分为以下五个阶段:

  1. lexical analysis
  2. parsing
  3. semantic analysis
  4. optimization
  5. code generation

lexical analysis 词汇分析

这一步主要是为了把代码分割成 token,就好比我们阅读的时候需要能够根据空格,标点符号和词语来断句。

目标是 divide program text into tokens.

parsing 解析

这一步的目标是看懂每个 token 的角色和代码的结构,就好比我们要知道句子的结构和成分,是主语谓语还是宾语。

semantic analysis 语义分析

这一步的目标是搞懂代码到底写的是什么,这个步骤最最最难,难点在于了解 variable scope。

因为程序要根据上下文搞清楚目前这段代码到底是想要干什么。

optimization 优化

这一步的目标是让代码精简,用尽量少的 token 来代表相同的意思,这样可以让我们的程序跑得更快,用的资源更少。

code gen

这一步的目标是把代码翻译成另一种语言,可能是 byte code,assembly code,也可能是一种 high level programming language。

每个阶段所占的比重不同

以上五个阶段中,在 Fortran 语言时代,semantic analysis 所占的比重相对较小,其他四块的比重相对较大。

在我们今天的时代,lexical + parse + code gen 占比较小,semantic 占比中等,optimization 占比最大。


3. 三个关于编程语言的问题

1. 为什么有这么多不同的编程语言,难道不能全世界通用一种吗?

答案是,因为不同的 application domain 有不同的/相冲突的需求。

比如科学领域的计算,注重的是浮点数、array、parallelism;

而商业领域,注重的是系统稳定、生成报告、分析数据等,SQL 就是这个领域的霸主;

至于系统软件,注重的是资源的使用和控制和对时间这个维度的掌控;

简而言之,每种程序语言都有其擅长处理的问题,而有时候,擅长处理 A 领域的语言不擅长处理 B 领域。

2. 为什么已经有那么多语言了,还有那么多新的编程语言在出现?

开发新语言成本最高的是什么呢?是开发语言本身吗?

不对,成本最高的是用户习惯的培养,也就是 user training。

当一种编程语言有庞大的用户群体之后,每次更新或者作出修改,都会影响很多的用户,这也会导致一些用户量很大的语言难以作出快速灵活的改变(毕竟要考虑成本);

于是,新语言往往会应运而生,这就是语言的生命周期吧~

3. 什么样的编程语言是好语言?

有人说 php 是最好的语言,有人说 java 是最好的语言,从研究的角度来说,没有一个统一的「好语言」的标准,如果非要有一个衡量维度,那么可能用户量最大的语言就是最好的(😀)。

争论这个话题其实没什么太大的价值~用老师的话说,就是「semi religious arguments」,类似宗教的一种争论。


4. 结语

最后,这门课听了第一讲感觉还是收获很大的,有兴趣的小伙伴欢迎和我一起学习!!

课程链接

也可以直接在 edx 网站搜索 standord compiler,课程代码是 SOE.YCSCS1。