Skip to content

Instantly share code, notes, and snippets.

@FrankHB
Created April 23, 2020 06:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FrankHB/92897eff7820a20a06f78e0201229f2a to your computer and use it in GitHub Desktop.
Save FrankHB/92897eff7820a20a06f78e0201229f2a to your computer and use it in GitHub Desktop.
Comment of videos
https://www.bilibili.com/video/BV1EW411u7th
12 集开始的一些讲法是给外行看的,实际上效果非常反计算机科学(姑且算是科学的话),尽管很多科班也是这么被误导的……
注意抽象的目的不是为了提供一道从外面看起来简单的套娃,更重要的是相同的高层次接口可以对应底层不同的实现(最直接的做法:在 spec 里写上 unspecified ),允许 non-trivial equational reasoning ,使预期普遍的性质不会被破坏。例如,大部分情况下,(因为体系结构方法上的困难)具体的精确性能指标是一个计算机系统中没法纠结而被抽象掉的,这不会使计算机系统上的其它一些设计(例如支持的编程语言)失效。
这个系列的视频没有澄清这个目的,所以容易让观众形成“高层的抽象仅仅是为了简化底层的实现”的错误认知。而实际的情况正好相反。像“程序”“算法”之类的概念,是数学模型定义的对象,机器的实现只是其中的一种。知道了一种实现,并不表示理解实质。
这在个别概念上看起来不会有很大麻烦,但是在一个系统的课程中就很有问题。
例如,“变量”基于指令式(imperative) 语言这种范型(paradigm) 讲解,会让人误认为变量一定能储存可变(mutable) 的值。这种讲法犯了缩小外延的错误,且并不是很难找到反例——例如 Haskell 的类型变量就不可变。“变量”的“变”是指变量绑定可变(variable) ,也就是一个变量名可以对应不固定的实体,而非储存的值可被修改——这也是传统上(数学)“变量”的含义。
再如,“函数”被指令式语言的过程实现这种方式来讲,有很微妙的问题。更地道一点地用所谓计算机科学的讲法,应该是 lambda abstraction 这样的基本(primitive) 操作引入的结果。
所谓的 loop 之类的 control operator ,而是组合 primitive 得到的 derivations 。从抽象的目的而不是实现上来讲,这应该是函数之后引入的东西。然而很遗憾,大部分语言是没有受过严格训练也没有多少想象力的计算机科学外行设计和实现的,这些语言提供的抽象往往弱到不足以让用户直接实现这样理所当然的组合(除非另外发明语言写解释器之类),所以以这样的语言入门的用户,在足够的补课之前,在这里很容易存在理解偏差。
这种讲法也导致将来若有需要理解一些简单的变体(例如 coroutine ),需要极大地返工。
另外,statement 拎出来单独作为语法设计这种做法也不值得提倡(其实 control flow 这种 control effect 的片面简化手段当入门知识来讲都能算 considered harmful 了 )。
所谓的 statement 本质上是附加了限定串行计算的作用(effect) 顺序的 expression ;单独的 statement 在完善抽象能力的语言中很大程度上不配被作为 primitive ,单独提供是冗余的。
如何用 primitive 组合出 sequence operator ,倒是可以留作 PL 入门作业。(Hint:可以用附加了求值规则约定的函数实现。)
(更贴近实质的讲法是从高层到底层,这样讲到实现就不会发散多挖坑。不过这样核心基本上就是一坨数学了,也不方便穿插历史,篇幅上也比较困难,所以也不是完全不能理解为什么不这样讲。)
再提点关于 Alan Turing 的历史贡献,实际上是出道即巅峰——提供了 Turing-Church Thesis ,明确了 effective method ,给严格的算法(algorithm) 这个概念的定义提供了可能(之前不存在严格的普遍意义的“算法”)。
至于 Turing machine 本身实际上并不那么重要——相比相近时代的 Post machine 之类的其它 model of computation ,Turing machine 的设计并没有值得一提的亮点。所谓的“简单”,也是个别人的一厢情愿。之后的计算机也并没有按 Turing machine 制造,只是相对 lambda calculus 来讲更接近一点,和其它类似的 model 来讲并没有特别匹配。
相反,(untyped) lambda calculus 倒是能被认为是任何带有“变量”和“函数”的编程语言的原型(尽管严格的扩展直到 1980 年代以后才有进展),并且基本不可能存在更简化的设计(更简单的 combinatory logic 没有变量也没有能提供 alpha equivalence 的 lambda 抽象的等价设施)。不论是理论地位还是历史影响,远远比 Turing machine 更重要。
说 Turing machine 这种 model of comuptation 配当 model of computer 乃至当作计算机设计的基础,和把 C 这种本质 PDP-11 描述语言(模型上是 PRAM, parallel random access machine ,比 Turing machine 倒是更接近实际的机器)一厢情愿当作所谓的“底层”一样可笑——明明根本就不符合现在的实际机器的设计还不得不抽象掉不一致的部分。
很遗憾,大部分半桶水咣当响的并没有机会理解这些常识便以讹传讹了。这个系列的作者在这方面可能也是这种工地计算机科学的受害者,所以在内容取舍上有很大偏差。(其实只是当码农也就算了……)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment