源自 1993 年第二届编程语言历史会议(HOPL-II)记录,此讲座为开场。作者是 Frederick P. Brooks, Jr.,是《人月神话》作者,在六十年代 IBM 设计过数个编程语言,也设计过房屋等。

亮点

  • 设计中最难的是决定要设计啥
  • 设计过程往往牵一发而动全身
  • 编程语言的生产率(productivity)可用完成同样功能所需代码量衡量,所需代码越少,生产率越高
  • 高级语言的最大贡献是,形成了用于思考和交流的软件术语系统,并不断激发新想法

详细笔记

幻灯第 1 页

讲座提纲:

  • 啥是设计过程
  • 为啥要做语言设计
  • 一些设计原则
  • 技术设计中的美学
  • 断言:好设计来自好设计者,而不是委员会(committees)

3-4页

编程语言设计与房屋设计大同小异。由此可问:“可否通过学习其他语言的设计过程提升设计水平呢?”

5-6 页

工程式的找寻最佳设计的思路是:树形最优解搜索

7 页

这种思路的几个问题:

  • 设计中最难的是决定要设计啥
  • 专家会犯的错是视野不够高远或打破常规(vision is either not high enough or not fresh enough)
  • “树”上的各种方案往往要在真正设计过程中才逐渐清晰

8 页

最重要的第四个问题:desiderata 的持续变化。直译是亟需之物,用了个例子意会: 两年前设计房屋时,一直忽视了个关键功能:大型聚会时宾客放大衣的位置,而这影响了整个设计。(同感!牵一发而动全身的确与语言设计类似)

设计过程中会碰到的情况:本以为重要的被发现不那么重要、以及相反;发现已设计的内容让一些之前没发现的 desiderata 很容易加入(霍霍这是多运气)

限制也会持续变化,有时灵感起了作用。同事 Gerrit(下称 Gerry) Blaauw 就有个能在不可能的选项中想出独到解决方案的天赋。

上面房屋设计过程中,碰到个搞不定的问题:乐室放不下所有乐器和预留位置。最终——向邻居买了五尺地搞定。软件设计也类似,往往解决方案与设计和技术无关(哈哈哈比如钱的问题?)

当然还有外部要求变化的问题。

9 页

今天为啥有人费劲设计电脑语言(霍霍永恒的问题)?只重造和改进(redo the old ones better)吗?我(作者自称,下同)试着 使 PL/1 替代 Fortrain 但败了。一个原因是,随着一个领域的发展,更进一步的边际效用(marginal utility)会越来越少。Gerry 还指出先发优势(the persistence of established technology)。与 Fortran 的竞争就是如此,对手出现时,现有技术往往会跟进新发现的需求。

10 页

现有高级编程语言的贡献何在?

Fortran的生产率是汇编语言的五倍(five-to-one productivity improvement):语句数约是十分之一,但每句更长和复杂,综合下来大约是五倍。其他语言如 Excel、LISP、Smalltalk 等也类似(相对各自领域的原始语言)。可以想象一下,在Fortran基础上再提高五倍会有多么困难,即边际效用降低。

更重要的是,高级语言改进了软件可靠性:如果说不了,就说错不了(if you cannot say it, you cannot say it wrong)。各种易出错的细节(概念、语法、笔误等等)往往被抑制、抽象、隐含掉。

我认为最重要的贡献是:高级语言提供了思考和交流的方式。比如现在常讨论的 binding time(PL 专家请告知翻译),如果以汇编器思考的话就不会用到。现在还常说 recursive-descent parsing。一个新概念不仅可用于交流,还会激发其他想法。高级语言的相关技术,包括编译,都为其他算法贡献了思路。

【待续】

万一续不了:“语言设计”,注意!是“设计”!不是上来就做编译器!中文编程的大航海时代早已开始,祝各位一路顺风~