在线课程推荐:Programming Languages from UW

很久没和大家见面了,因为我实在太懒了。

圣诞的时候想起我曾经有过刷这门课的计划,于是差不多到元旦期间就一直闷声在扫尾该课程。虽然课程内容,作业和考试差不多1月7日就完全完成了,但因为存在一些peer review的作业所以等到足够的来自他人的打分到1月12日才出成绩算正式完成了。

以各位长期关注者对我的了解,都知道我又懒又笨,但也能在上述时间坚持完成了下来,所以在难度上没有特别大的障碍。接下来我简单的介绍一下这门课的历史,内容和推荐完成路线。

华盛顿大学的《程序设计语言》是Coursera建站时期最早开设的在线优质课程之一,早期Coursera用户很多也对此课赞不绝口,认为这是让人打开了编程新视角受益匪浅的课程。经历了Coursera站点的多次运营改革后,虽然课程内容没有什么变化,但为了更方便学习者规划时间,这门课内容被划分成了三个部分,每个部分大约3-5周内容。开设班次几乎无缝对接,随时可以参加和转换。当然相比以前,最让人不适的地方是Coursera开始了全站收费,如果你非常在意这件事,可以选择不要证书参与旁听课程的免费注册,或者申请Coursera提供的课程助学金,申请方法见我的豆瓣日记,现在全站需要提前15天提交助学金申请以便审核,请需要者提前规划好时间

这门课程给了很多包括科班学生在内的机会去接触一些不那么热门但非常有特点的编程语言,第一部分的Standard ML是完全为了教学目的创造出来的搭载了类型推断的静态函数式编程语言,让你开始快速入手函数式编程,第二部分的Racket是Lisp的一种流行方言,同样优雅强大的函数式编程语言,并开始感受动态类型的自由,第三部分的Ruby是相对来说热度还不错的面向对象编程语言,通过最后这部分的教学来对比OOP与FP分别适合解决哪些程序问题。当然,全程都穿插着一些optional部分用流行语言Java/C++/C#该如何实现讲解过程中提到的问题,有了这些熟悉的语言的示例,很容易去理解抽象的编程语言理论(PLT)上的概念和问题,从而把程序设计思想贯通联系起来。

纲要概览:

Part A:

Syntax vs. semantics vs. idioms vs. libraries vs. tools

ML basics (bindings, conditionals, records, functions)

Recursive functions and recursive types

Benefits of no mutation

Algebraic datatypes, pattern matching

Tail recursion

Higher-order functions; closures

Lexical scope

Currying

Syntactic sugar

Equivalence and effects

Parametric polymorphism and container types

Type inference

Abstract types and modules

Part B:

Racket basics

Dynamic vs. static typing

Laziness, streams, and memoization

Implementing languages, especially higher-order functions

Macros

Eval

Part C:

Ruby basics

Object-oriented programming is dynamic dispatch

Pure object-orientation

Implementing dynamic dispatch

Multiple inheritance, interfaces, and mixins

OOP vs. functional decomposition and extensibility

Subtyping for records, functions, and objects

Class-based subtyping

Subtyping

Subtyping vs. parametric polymorphism; bounded polymorphism

在作业上以编程作业为主,主要评分形式为使用大量测试用例的自动评分器和学习者互相对代码进行评价。作业内容设计很巧妙,循序渐进,如Part B最后一次作业就是直接要求用Racket实现一种新语言的解释器。第一部分SML的使用连带着简单的教了Emacs的基础用法,第二部分Racket则推荐了DrRacket这样成熟的环境。独立完成全程的作业对于编程能力的帮助很大。

当然,最重要的是这门课让完全没有系统接触过编程语言理论的人开始入门,一些很基础的概念(如类型推断)都通过生动的例子作出了解释,这对于哪怕不想做PLT的人来说,也是对计算机科学学习很有意义的事。

不过可能时间上会来不及或者心态上不屑去完整的听这么一门“过于基础”的课,如果想速成学习关键部分,只需要阅读每周的Reading Notes部分就可以了解需要知道什么了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190115G14YMS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券