刷完UW Programming Languages的一点感想
二月份没有做什么别的项目,主要的时间花在三门Coursera的课上了。确切的说,其实是同一门课:UW的Programming Language课。
这门课是华盛顿大学的CSE341课程的Coursera版本,根据官网的介绍,大概是「简要介绍了编程语言的基本概念,包括抽象(Abstraction mechanisms)、静态和动态类型、作用域、语法(Syntax)和语义(Semantics)、闭包(First-class function closures)以及数据类型(Algebraic datatypes),以此为基础对各种编程范式例如函数式编程进行深入探讨」。
之前也关注了很久,这次也算是一口气把这门课修完了。Coursera上面安排的是5+3+3=11周的预期时间,不过我本身在FP和compiler方面有些了解,每周稍微多花点时间的话,也就花一个月多点的时间啃完了。
就像刚才说的,课程的讲解其实比较偏向于FP的风格,但是也有讲解不少OOP相关的概念,例如双重分派(Double dispatch)以及如何使用Visitor pattern来实现,例如Mixins(其实我更熟悉Traits的称呼),还有协变和逆变(variant/contravariant)。FP部分,基于closure,也就自然引出了thunk、promise、stream的概念,这些倒也是现在蛮热门的话题。整体来说,虽然同时涵盖了FP和OOP,但与其说是一门关于FP或者OOP的课,倒不如说FP或者OOP只是楔子,然后通过SML、Racket和Ruby这三种截然不同的语言来分析编程语言设计里面的一些共有的理念。
当然也少不了关于soundness和completeness的讨论。
不过,印象最深刻的,大概是「Subtyping is not a matter of opinion」,这里Dan用了nested subtyping来举例,证明了只有在所有变量都是immutable的前提下,nested subtyping才是sound的。简单说来,就是编程语言设计并不是可以随便组合功能的事情,一个编程语言中既有的语法和规则的设计,会对这个编程语言未来的扩展有决定性的影响。
当然,这也不是OOP独有的概念。在之前讨论Scope(lexical vs dynamic)的时候,已经提到了dynamic scope难以reasoning的问题。但是更重要的,大概还是只有在lexical scope的语境下,closure才有讨论的意义……而closure几乎是FP的核心内容了。
说到这里,这就又回应了沙沙关于组合性的讨论。
这门课的课程作业也很有趣。一开始只是写一些简单的函数,然后加上数据类型,然后再一点点往上面加,最后几个大作业分别实现了一个pattern matching,一个简单的(图灵完备的)编程语言的解释器,还有一个俄罗斯方块和一个基于visitor的解释器。
其实整体来说,课程内容算是偏简单,例如关于类型的讨论,比起TAPL里面关于unification、parametric polymorphism甚至functional OOP的讨论,这门课的内容算是蛮基础的。对于FP的讨论也停留在ADT和closure,并不需要涉及monad、typeclass、GADT这些深奥的知识。
换句话说,在修这门课之前很多概念我都已经了解,不过感觉还是一个很不错的梳理知识总结的机会。
说起来,学完这门课之后,也自己试着把课程要求的MUPL作业实现了一个Java的版本,也意识到了其实不需要FP的基础,完全可以在OOP里面实现许多FP的核心概念。然后发现了MUPL的扩展作业还真的会让你写出一些比较复杂的概念,例如前面提到的unification,例如equality。相当于写完整个作业之后,也就实现了一个简单但完整的FP语言的编译器了。
不过这门课似乎很久没更新了,还是停留在2014年的内容。很不方便的一点就是Ruby的配置至少在macOS版本上已经完全跟不上现在的情况了。我还是专门开了Windows备用机来安装旧版Ruby的。讨论区也没什么人,交完作业也要等很久才能等来评分。
后来也看了一下341课程的网站,发现似乎最近几年这门课已经有很多变化了,比如用OCaml而不是SML做第一部分的讲解,用Racket的OOP编程来代替Ruby。小作业和大作业的内容也变了很多。
倒是有个叫CSE425S的课,看wiki似乎基本上是按照2014年的进度的,不过也只找到2022年的课程信息。
之后的话,打算抽时间也把作业的扩展部分做完,看看能不能port到Java上。
然后可能再找找有没有别的课程吧,感觉61A和61B或者EPFL的FP课就不错。
或者回过头啃一下Programming Language Pragmatics这本书。