CS3110总结

总体感觉

总体感觉CS3110这门课程像是一个关于Coding的“大杂烩”,这里完全没有贬义,相反这门课对我这种转行背景的程序员非常有帮助。
正如这么课程介绍中说:

This course is about making you a better programmer.

为了实现这一目的,这门课程的内容涉及了较多方面的内容,而且每一个部分都有为这个目的贡献了力量:

  • Functional Programming with Ocaml:为了说明如何系统化学习任何一门新的计算机预言
  • Modular Programming: 为了说明如何构建大型程序
  • Data Structures: 深度讲解了基本的数据结构,Mutable and Immutable, 比如流、红黑树、哈希表等等
  • Interpreter: 讲解了计算机预言解释器,即更加了解程序员的工具:计算机语言
  • Formal Methods: 讲解进行软件Formal verification

课程虽然选择Ocaml,但是讲解的内容多数可以应用于任何语言,通过学习背后动机,可以帮助学习和理解其他计算机语言。

同时,这门课的很多主题为深入学习其他领域奠定了基础,比如:

  • CS4110/6110 Programming Languages and Logics,如何设计一门语言
  • CS4120 Compilers,如何实现一门语言
  • CS4160 Formal Verification,如何证明程序的正确性 :+1:

几个大的主题

语言可以系统化学习

计算机语言可以有系统化的学习方法,任何一门计算机语言特性都可有通过如下三个规则进行分析:

  • 语法,Syntax
  • 静态语义,static semantic, 即 typing rule
  • 动态语义,dynamic semantic,即 Evaluation rule

分治,Divide-and-conquer,无处不在。

计算机语言可以从数学的角度精确定义。

计算机语言不是魔法

  • 编写一个语言的解释器非常简单!
  • DSL,可能是一个好的选择

优雅的抽象确实是魔法

  • 语言特征:product types, union types
  • Higher order functions: map, fold..
  • Data structures: lists, tree, dictionary, monad
  • Module system: abstraction, functors
  • Use abstraction and decomposition
  • Think in multiple levels of abstractions

编写软件需要系统化的方法

  • 设计:动手编程以前,先想。
  • 同理心:编写可以被人轻易看懂的代码
  • 保证:测试和证明
  • 团队合作

这门课教给我的

  • 复杂的系统可以被分解成小的、容易理解的部分
  • 学习小的部分更加容易
  • 学习小的部分如何配合形成复杂系统

模块化编程

模块化编程的核心在于,通过构建抽象以实现局部化。具体实现的工具包括:

  • 命名空间,Namespace,把相关的数据结构和函数放在一起
  • 抽象,Abstraction,隐藏具体的数据结构和函数实现,仅保留接口和文档
  • 代码复用,Code reuse

这些概念通常在OO中已经比较常见和熟悉,但是这门课程同时强调了文档和测试的重要性。

好的文档应该区别对待接口和实现,接口文档是写给Client看的,而实现文档是写给内部程序员。

好的接口文档应该包含:

  • Return clause
  • Requires clause
  • Raises clause
  • Example clause

好的实现文档应该包含:

  • AF, Abstract Function,实现数据结构到抽象结构的映射关系
  • RI, Representation Invariant, 那些实现数据结构是合法的抽象结构

解释器

1
2
Lexing -> (Tokens) -> Parsing -> (AST) -> Semantic Check ...
-> (Intermediate Representation) -> (Target code)

Lab 解答

CS3110 Labs

参考