课程主页:

https://www.edx.org/course/compilers

课程视频:

https://www.bilibili.com/video/BV1NE411376V?p=20&t=6

最近开始学习编译原理,选择斯坦福的编译原理进行学习,这次回顾第一周的内容,这一周主要是课程介绍以及Cool变成语言。

介绍

编译器和解释器的区别

编译器编译完程序后,运行是离线的,解释器运行程序是在线的,区别如下:

编译器的结构

编译器由如下几个部分构成:

  1. 词法分析(Lexical Analysis)
  2. 解析(Parsing)
  3. 语义分析(Semantic Analysis)
  4. 优化(Optimization)
  5. 代码生成(Code Generation)

第一步:识别单词(字母以上最小单位)

词法分析

词法分析将程序文本分为“单词”或“符号”:

解析

一旦单词理解了,下一步就是理解句子结构。解析=句子绘图,这里的图是一棵树:

语义分析

一旦理解了句子结构,我们可以试着理解“含义”,这一步是非常难的,来看如下例子:

上述句子中的his指谁是不明确的。

编程语言定义了严格的规则以避免这种模糊性,例如c语言中使用大括号:

{
    int Jack = 3;
    {
        int Jack = 4;
        cout << Jack;
    }
}

除了变量绑定之外,编译器还执行许多语义检查。例子

Jack left her homework at home.

her和Jack的类型不匹配,我们知道他们是不同的人。

优化

优化是指自动修改程序,使其运行的快一点,使用更少的内存。但是优化不能随意进行,考虑如下例子:

X = Y * 0 is the same as X = 0

当Y=NAN时不能使用上述优化。

代码生成

生成程序代码(通常) ,即翻译成另一种语言,类似于人工翻译。

现在的编译器侧重于优化,过去和现在编译器的结构对比:

程序设计语言的经济性

简单介绍了如下三个问题:

  • 为什么会有这么多的编程语言?
  • 为什么会有新的编程语言?
  • 什么是好的编程语言?

这部分的内容这里略过。

Cool语言简介

  • Classroom Object Oriented Language = COOL
  • 设计为可在短时间内实现
  • 体会现代语言的实现
    • 抽象
    • 静态输入
    • 重用(继承)
    • 内存管理
    • 和更多 …
  • 但是很多该语言忽略了很多内容
  • 本课程将完成一个完整的编译器
    • Cool -> MIPS汇编语言
  • 5个编程作业(PA)中
    • 写一个Cool程序
    • 词法分析
    • 解析
    • 语义分析
    • 代码生成
    • 当然也包括优化