之前一直想学习Coursera上Programming Languages系列课程,但去年一直在看SICP,所以这部分推迟到现在开始学习,这次回顾Week1的内容,主要是一些课程介绍。

课程主页:

https://www.coursera.org/learn/programming-languages/home

B站搬运:

https://www.bilibili.com/video/BV1dL411j7L7

Week 1

欢迎!(以及一些课程机制)

欢迎!

  • 这是一个具有挑战性的学习编程语言基本概念的机会。
  • 通过努力工作、耐心和开放的心态,本课程使你成为一个更好的程序员 :
    • 即使是我们不会使用的语言 ;
    • 学习每种语言的核心思想,尽管表面上存在着无数的差异和变化;
    • “糟糕”的课程摘要:“使用ML、Racket和Ruby”;

介绍性材料

本视频:

  • 课程机制,结构

其他介绍性视频:

  • 我是谁和员工致谢
  • 最初的“为什么这样学习编程语言”
    • 2-3周内的真实课程动机
  • 讨论推荐背景
  • 为什么“课程”分为A、B和C部分
  • 评分策略
  • 总体“路线图”,特别是接下来的几周

简洁的待办事项清单

  1. 熟悉网页上的所有材料
    • 无论这是否是你的第一门Coursera课程
    • 几件不同/不寻常的事情
  2. 使用Emacs[可选]和SML[必需]进行设置
    • 网页上的安装/配置/使用说明
      • 以及视频(如果需要)
    • 必要,非智力因素
      • 没有理由拖延
  3. 可选的“虚拟”作业0

课程材料

  • 视频讲座:最必要的,其他标记为“可选”
  • 阅读材料
    • 与讲座内容相同,但更精确、更完整
    • 因此:可选但推荐
  • 讲座代码
    • 避免从mp4/.pptx/.pdf中重新复制
  • 家庭作业
    • 根据测试案例进行评分,并进行同行评分
  • 考试
    • 涵盖了“单纯的编程”很难再加强的主题,因为这不仅仅是一个编程课程

家庭作业

  • 每个主要课程部分一个(减去1)
    • 每个作业都是“一次性”提交
    • 比许多MOOCS更像一门具有挑战性的大学课程[10-12小时/周?]
  • 做家庭作业包括:
    1. 理解正在讨论的概念
    2. 编写代码,展示对概念的理解
    3. 测试你的代码以确保你理解并拥有正确的程序
    4. “玩弄”变体、错误答案等。
      只有(2)被评分,但专注于(2)会使家庭作业更难。
  • 挑战问题:低分/难易比
  • 不要公开解决方案

请注意我的写作风格

  • 家庭作业的措辞往往非常精确和简洁
    • 我是一名计算机科学家,并且我的写作风格很好(一件好事!)
    • 技术问题值得精确的技术写作
    • 简洁是重视读者的时间
    • 你也应该努力做到精确
  • 略过或不理解为什么选择某个词或短语,会使作业变得更难
  • 如果有问题感到困惑,可以通过各种方式询问他人
    • 感到困惑是正常的,可以理解的,甚至是鼓励的
    • 一旦你不感到困惑,你可能会同意问题的措辞并没有引起困惑

欢迎!

  • 对我们所有人来说都是一次伟大的冒险
    • 希望能支持一个活跃的、有活力的社区
    • 即使我不能见到你们所有人,也能一起获得更多的乐趣
  • 这次MOOC是“我做过的最简洁的事情”之一
    • 我希望你们也这么认为
  • 希望在每一步都能扩展你的思维和带给你挑战
    • 同时为你们提供成功所需的一切

我是谁/致谢

主要是老师的介绍,这部分略过。

课程动机

本课程是关于什么的

  • 与任何编程语言相关的许多基本概念
    • 以及这些部分如何组合
  • 使用ML、Racket和Ruby语言:
    • 它们让许多概念“闪耀”
    • 使用多种语言展示了同一概念如何“看起来不同”或实际上略有不同
    • 在许多方面比Java、C#、Python等更简单
  • ·重点关注函数式编程
    • 不使用mutation(赋值语句)(!)
    • 使用first-class函数(还不能解释这一点)
    • 但还有许多其他主题

为什么要学这门课?

  • 这是课程动机的“正常”位置
    • 为什么要学习这些材料?
  • 但根据我的经验,我们没有足够的共享词汇表
    • 因此,将全部动机推迟到函数闭包(第3节)之后
    • (将在第1节末尾会介绍不可变数据)
  • 在这期间,必须在没有太多证据的情况下“断言事情”
    • 除了很多以前的学生
    • 示例反馈:“我以前曾多次尝试学习。但在你的课程结束后,我很快就完成了教程…”

我的观点

一个陌生的环境

  • 接下来的4-5周将使用
    • ML语言
    • Emacs编辑器
    • 用于评估程序的读取-评估-打印-循环(REPL)。
  • 需要把东西安装和配置好
    • 看书面说明(仔细阅读;欢迎反馈)
    • 可选:展示Windows安装的视频
  • 只有这样,你才能专注于“真正的内容”和家庭作业1
  • 在陌生环境中工作是一项计算生活技能

不是关于语言的

  • 不能过分强调ML(A部分)、Racket(B部分)和Ruby(C部分)是“达到其他目的的手段”
    • 被选为“特别适合这些主题”
    • 也有其他可能的选择
  • 也欣然承认,特别是ML不再被实际使用。
    • 与之密切相关的语言有:OCaml, F#, Scala, Haskell
    • 可以说是一个特点,而不是一个错误
      • 没有人因为“已经知道它”而分心
      • 对“空手道小子”的方法更有效
      • 专注于核心功能,而不是库、花哨的东西,等等。
      • 非常“干净、合成、优雅”的语言

文字已经够多了

  • 非介绍性的讲座将编写代码
    • 加上关键概念的幻灯片
    • 加上“视频中的问题”
  • 比这些“介绍性”视频要好得多
    • 所以请原谅“无聊的介绍内容”

推荐背景

主要参加这门课程的先修背景,例如一到两门编程语言,以及一些基本的编程概念即可。

为什么分为A部分,B部分,C部分

拆分的原因

  • 总的来说,比“大多数MOOC”更具实质性和挑战性
  • 为你提供值得认可的艰难但中等的目标
  • 在继续之前给你一个“休息”的机会
    • 更接近“不同的步调”

如何拆分

  • 不幸的是“按语言拆分的,而这并不是重点
  • A部分大致相当于B部分和C部分的总和
    • 在我看来,没有自然的地方可以细分A部分
  • A部分:3个家庭作业,1个考试
  • B部分:2个家庭作业(1个更具挑战性)
  • C部分:2个家庭作业(1个更具挑战性),1个考试

评分策略

主要介绍了评分策略,这里略过。

非常高层次的大纲

课程概述

  • 很难描述我们尚未介绍的主题
  • 所以不要被吓倒,也许可以跳过这个这部分

A部分:

  1. 软件安装
  2. 基础知识、函数、递归、范围、变量、元组、列表……
    • 为第1节留出额外时间
  3. 数据类型,模式匹配,尾递归
  4. first-class函数,闭包[和课程动机!]
  5. 类型推理,模块

B部分:

  1. 在动态类型的语言中快速“重做”(指再次学习)
    • 延迟评估
  2. 用解释器实现语言
    • 静态类型vs动态类型

总体而言,对函数式编程进行了精确的介绍,并逐条进行了阐述。

C部分:

  1. 动态类型的面向对象编程
  2. OOP与功能分解
    • 高级OOP主题(如mixins, double dispatch)
    • Generics vs Subtyping

小结

  • 即使你“已经知道OOP”,也要“完成这个课程”。
    • 一些有OOP背景的人认为第7部分 “不那么有趣”,但请继续关注第8部分。
    • 有些人认为C部分是“反OOP”的,这大多不是真的
      • 关于与许多“已经思考/知道”的内容进行对比
      • 是的,有些人专注于“纯OOP”的承诺可能是不明智的,即使在“一种OOP语言”中也是如此(指的是不要专注于OOP)

环境配置

在网址https://www.smlnj.org/下载操作系统对应的版本,这里是windows,直接下载.msi文件然后安装即可。

测试,打开终端并运行sml:

λ sml

REM sml.bat

REM

REM Copyright 2020 The Fellowship of SML/NJ (http://www.smlnj.org)

REM All rights reserved.

REM

REM The standard driver for SML/NJ under the new runtime system

REM
Standard ML of New Jersey (32-bit) v110.99.2 [built: Tue Sep 28 13:04:14 2021]
-

运行指令并得到如下结果就说明安装成功:

- 1 + 1;
val it = 2 : int