原文:http://www.jsoftware.com/papers/perlis77.htm
标题:In Praise of APL: A Language for Lyrical Programming
作者:Alan J. Perlis,1977-06
1943年于卡内基理工学院(现卡内基梅隆大学)获得化学学士学位。二战中,在美军服役,开始对数学感兴趣。后改学数学,1949年获得硕士学位。1950年在麻省理工学院获博士学位。他的博士论文题目是“On Integral Equations, Their Solution by Iteration and Analytic Continuation”(积分方程中的迭代和解析开拓解法)。
1948年-1949年和1952年,他参加了“旋风”计算机计划,为“旋风”编制程序。1952年出任普渡大学计算中心的第一任主任,1956年任卡内基理工学院计算系的首任主任。1962年-1964年当选为ACM主席。1971年,加盟耶鲁大学计算机系,多次任系主任,直至去世。期间1977年-1978年曾在加州理工院执教。
1990年2月7日,因心脏病在康涅狄格州的纽哈芬去世,享年68岁。
荣誉:1966年成为首届图灵奖的获得者。颁奖词:for his influence in the area of advanced programming techniques and compiler construction(即主要指在Algol 58和Algol 60的形成和修改过程中的核心和关键作用)。其图灵奖演讲稿为:“The Synthesis of Algorithmic Systems”(算法系统的合成)
其他文章:
1:https://cpsc.yale.edu/epigrams-programming
2:Almost Perfect Artifacts Improve only in Small Ways: APL is more French than English http://www.jsoftware.com/papers/perlis78.htm
part1:计算机科学的教学意义
Perlis首先列出了5条:(1) 学会并且能够编写算法 (2) 了解计算机的组织和构造方式 (3) 熟练掌握至少一门编程语言 (4) 通过系统设计来理解复杂度控制的必然性 (5) to appreciate the devotion of computer scientists to their subject and the exterior consequences (to the student as citizen) of the science’s development.
其次是提到了CS和其他学科在教学上的区别。其他学科可以基于一些现有的基础和常识来展开教学,而计算机这块没有(1977年)。Perlis认为,计算机科学[deals with symbolic objects whose nature we study mathematically],以及,编程是CS学习实践的最佳方法。
接着他引出了几个问题:学生应该编写什么样的程序?学习编程应当用什么编程语言?
同时Perlis补充了自己的一个观点,他认为初学者不应该过度使用现有的工具(比如现成的第三方库)。
it is more important to master self-expression during this initial contact.
关于这个观点,Perlis补充了一点,即学生的学习时间也是一个限制因素。换言之,如果时间充足,学生可以自己多造*等等(而现实情况是一个学期只有16周)。当然,在有限的时间内完成目标,也是一种能力的锻炼。
学习编程的过程总是伴随着排错。低级错误越来越少,往后则会被其他更深层的错误取代。然而,由于很多编程语言设计的结构存在缺陷,这会增加初学者的调试时间(比如为了解决一些文本层面的语法错误,可能需要把代码片段的位置重新调整,以便成功通过编译)。为此,学生在编程的时候,同时还需要掌握相对程序设计本身无关的一些,可以加快编译调试流程的相关技巧(注:比如Makefile)。
综上所述,Perlis相信, APL is the most rational first language for a first course in computer science.
虽然BASIC 和 FORTRAN确实比APL更容易上手,但相对前面的五点要求而言,APL更值得掌握。
Part2:Style and Idiom
APL的特性:简洁,组合性[composability]与自然语言一致[字/词/句/段,英文是symbol->word->sentence];而APL语句的简洁,可以更好的体现程序本身的结构(而这种结构的体现,在其他编程语言里面通常需要几页的代码量)。基于APL的简洁和特性,使得一门16周的课程可以设计安排的更丰富合理,而后期一系列练习可以相互间组成更复杂的任务。
注:这段主要强调的是idiom的形成,以及在学习APL的过程中这种意识和习惯的培养。{ One begins to appreciate the emergence and significance of style and to observe that reading and writing facility is tied to the development of an arsenal of idioms which soon become engraved in one’s skull as units. }
Part3:In Teaching Computer Organization
要了解计算机科学,需要先了解计算机(组成原理)。解释了这点之后,Perlis指出,使用APL可以很方便的对整个计算机结构进行建模/模拟,而且代码只需约40行(注:以前的计算机是真的"计算"机,所以软硬件结构不算复杂)。如果用APL写一个汇编处理程序,复杂度类似,也需要约40行。
而文本和图形处理,这些相对非底层的应用,相关练习的实践代码量则更少。例如:做标题列表的排列索引(约12行),[显示,旋转和缩放]复合多边形(约20行) ,函数示意图(约5行),等等。而一些文件处理问题,如工资单和人员搜索,不论是否使用内置函数,都只需几行就可以搞定。
这里引出了一个不容小视的结论,在APL的学习实践过程中,学生会最终意识到,自己不用依赖现有的复杂系统和第三方库也能实现很多自己想要的功能,进而激励自己编写自己需要的程序,构建出属于自己的一个完善的体系(走到这一步,则说明他已经对系统的各个细节都有了足够的了解)。
还有一点值的注意的是,无论任务有多复杂,APL通常都是FBAPP (FORTRAN or BASIC or ALGOL or PL/I or Pascal) 的语句或行数的1/5到1/10。 由于APL通过其primitive functions的组合控制,代替其他编程语言中通过显式控制语句实现的业务流程,因此APL程序中的错误数量远远少于FBAPP中的任意一门编程语言。
接着,Perlis提到了结构化编程和程序验证的话题。他认为,两者都很重要,但它们的内容和重要性在很大程度上取决于程序所用的编程语言。之后他列举了几点APL在结构化编程和程序验证方面的优势(简单说就是APL大法好)。
注:FBAPP类编程语言,现在可以归类成,类C编程语言,因为FBAPP里面AP已经进博物馆了(FB和Pascal还没死。
part4:APL与硬件架构
简单说,APL不适合当时的主流架构(注:比如冯诺依曼架构),相比较之下,类C编程语言更适合。但是,除此之外,也有其他更适合APL的架构,比如新的[array processing computer]。换言之,Perlis认为,我们不应该抛弃APL或限制它的发展。我们必须设法将它与通用计算机相匹配。我们必须设计更适合APL的编译器和计算机。
part5:性价比高,学到就是赚到 / More Cost-Effective than BASIC
成本是教学过程中需要考虑的一个重要问题。集成APL的计算机系统,1977年每个终端的成本约为10000美元,大约是BASIC成本的两倍。However,随着APL系统设计逐渐成熟,集成电路的成本下降,这些都将成为历史。Perlis同时给出了一个说法:假设APL在当时变得跟BASIC环境一样便宜,那么在相同的时间内APL还是能干BASIC两倍的活。
最后,Perlis提了一下关于在计算机科学入门课程中使用APL的另外两个问题。首先,大多数大学计算机科学家并不真正了解APL。他们还没有意识到在APL中思考它意味着什么:
They haven’t appreciated what it means to think in APL — to think about parallel operations in arrays and to distribute and submerge explicit looping among its primitive functions.
这时Perlis类比了当年,许多大学的数学系在尝试用新的课程安排取代微积分时遇到的困难(总有第一个吃螃蟹的人)。
其次是:
The second issue is of a different kind. I am firmly convinced that APL and LISP are related to each other along an important axis of language design and that acquiring simultaneous expertise in both languages is possible and desirable for the beginning student. Were they unified, the set of tasks that succumb to terse, flexible and expressive descriptions will enlarge enormously without overly increasing the intellectual burden on the student over his initial 16 week contact period.
Above all, remember what we must provide is a pou sto to last the student for 40 years, not a handbook for tomorrow’s employment.
注:最后这句话,有点类似最近有人提到的一个说法,叫完美的苍蝇。
PS:epigrams programming 这个写的挺有意思,推荐阅读。标题的Lyrical Programming可以理解为歌词式编程(念经大概也算把