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 | Lexing -> (Tokens) -> Parsing -> (AST) -> Semantic Check ... |