源自 1993 年第二届编程语言历史会议(HOPL-II)记录,此讲座为开场。作者是 Frederick P. Brooks, Jr.,是《人月神话》作者,在六十年代 IBM 设计过数个编程语言,也设计过房屋等。
讲座提纲:
编程语言设计与房屋设计大同小异。由此可问:“可否通过学习其他语言的设计过程提升设计水平呢?”
工程式的找寻最佳设计的思路是:树形最优解搜索
这种思路的几个问题:
最重要的第四个问题:desiderata 的持续变化。直译是亟需之物,用了个例子意会: 两年前设计房屋时,一直忽视了个关键功能:大型聚会时宾客放大衣的位置,而这影响了整个设计。(同感!牵一发而动全身的确与语言设计类似)
设计过程中会碰到的情况:本以为重要的被发现不那么重要、以及相反;发现已设计的内容让一些之前没发现的 desiderata 很容易加入(霍霍这是多运气)
限制也会持续变化,有时灵感起了作用。同事 Gerrit(下称 Gerry) Blaauw 就有个能在不可能的选项中想出独到解决方案的天赋。
上面房屋设计过程中,碰到个搞不定的问题:乐室放不下所有乐器和预留位置。最终——向邻居买了五尺地搞定。软件设计也类似,往往解决方案与设计和技术无关(哈哈哈比如钱的问题?)
当然还有外部要求变化的问题。
今天为啥有人费劲设计电脑语言(霍霍永恒的问题)?只重造和改进(redo the old ones better)吗?我(作者自称,下同)试着 使 PL/1 替代 Fortrain 但败了。一个原因是,随着一个领域的发展,更进一步的边际效用(marginal utility)会越来越少。Gerry 还指出先发优势(the persistence of established technology)。与 Fortran 的竞争就是如此,对手出现时,现有技术往往会跟进新发现的需求。
现有高级编程语言的贡献何在?
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。一个新概念不仅可用于交流,还会激发其他想法。高级语言的相关技术,包括编译,都为其他算法贡献了思路。
【待续】
万一续不了:“语言设计”,注意!是“设计”!不是上来就做编译器!中文编程的大航海时代早已开始,祝各位一路顺风~