原文:http://www.jsoftware.com/papers/perlis77.htm

标题:In Praise of APL: A Language for Lyrical Programming

作者:Alan J. Perlis,1977-06

作者背景: 艾伦·佩利 <-Wikipedia

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可以理解为歌词式编程(念经大概也算把

以数之名:In Praise of APL 后记的更多相关文章

  1. Github上Laravel开源排行榜Star数61-90名

    Github上Laravel开源排行榜Star数61-90名,罗列所有 Laravel 开源扩展包,含 Github Star 数量,下载数量和项目简介.默认排序是按Star数量从多到少来排 61.c ...

  2. Github上Laravel开源排行榜Star数31-60名

    Github上Laravel开源排行榜Star数31-60名,罗列所有 Laravel 开源扩展包,含 Github Star 数量,下载数量和项目简介.默认排序是按Star数量从多到少来排 31.c ...

  3. Windows PowerShell 入門(8)-関数編3

    この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...

  4. CET4

    Directions: For this part, you are allowed 30 minutes to write a short essay on the challenges of st ...

  5. 前端学HTTP之缓存

    前面的话 Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关内容 功能 ...

  6. 使用 Visual Studio Online 进行协同开发

    Visual Studio Online(原来的 Team Foundation Service),是项目数据在云中的主页.在我们的云基础架构中只需数分钟便可启动并运行,无需安装或配置任何服务器.设置 ...

  7. 某中国500强企业BI系统成功应用案例

    随着某集团20多年的不断发展发展,现已成为中国500强.中国大企业集团竞争力前25强.中国信息化标杆企业和国家重点火炬高新技术企业.拥有总资产数十亿元.员工数万名,涉足电力.家电.能源.等多个行业,并 ...

  8. WCF的三个名称/命名空间,你是否傻傻分不清楚?

    在定义和寄宿WCF服务的时候会面临三个名称/命名空间,它们分别是ServiceContractAttribute.ServiceBehaviorAttribute和Binding的Name和Names ...

  9. HTTP协议学习---(六)缓存

    本文介绍浏览器和Web服务器之间如何处理"浏览器缓存",以及控制缓存的http header. 本文会使用Fiddler来查看HTTP request和Response, 如果不熟 ...

随机推荐

  1. 服务器硬件与linux系统

    服务器的特性: 高速度的CPU运算能力 长时间的可靠运行 强大的I/O外部数据吞吐能力 服务器通常具有更高的性能,效率,高可靠,高可用性,以及更好的扩展性. 服务器的分类 (1)服务器按外形分类 塔式 ...

  2. RESTClient 使用

    Wisdom RESTClient 一款自动化测试REST API的工具,它可以自动化测试RESTful API并生成精美的测试报告,同时基于测试过的历史API,可以生成精美的RESTful API文 ...

  3. 第十五节 JS面向对象实例及高级

    实例:面向对象的选项卡 把面向过程的程序,改写成面向对象的形式 原则:不能有函数套函数,但可以有全局变量 过程: onload —— 改写成 构造函数,其中window.onload的功能是在页面加载 ...

  4. ElasticSearch(十二)删除数据插件delete-by-query

    在ElasticSearch2.0之后的版本中没有默认的delete-by-query,想使用此命令需要安装这个插件. 首先需要进入ES的目录 [root@node122 elasticsearch] ...

  5. SQL实践遇到的知识点

    聚集函数count() count()统计元组的个数,即行数 count(0).count(1)与count(*)的执行效率是一样的 count(column)与count(*) 如果column中含 ...

  6. jmeter 学习笔记

    beanshell内置对象 vars是针对单线程,使用${varName}访问var变量值 props是所有线程共享,使用${__P(propName,)}访问prop变量值 如何让variable在 ...

  7. Vue-admin工作整理(十一):Vuex-动态注册模块

    概述: 动态注册模块分为两种,一种是在根state下注册一个模块,一种是在模块下再自动注册一个模块 第一种:根state下动态注册模块: 思路:通过store来实现,this.$store来获取当前的 ...

  8. 二、Python数据类型(一)

    一.Python的基本输入与输出语句 (一)输出语句 print() 示例: print('你好,Python') print(4+5) a = 10 print(a) 输出的内容可以是字符串,变量, ...

  9. 出错:(unicode error) 'unicodeescape' codec can't decode bytes in position 8-9: malformed \N character escape

    报错原因:python 中 \N 是换行的意思.这里要把 N 前面的 \ 转义一下.用  \\  代替即可. Nokia_mac = np.loadtxt('data\oui\\NokiaMac201 ...

  10. Go语言学习之11 日志收集系统kafka库实战

    本节主要内容: 1. 日志收集系统设计2. 日志客户端开发 1. 项目背景    a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题    b. 当系统机器比较少时,登陆到服务器上查看即可 ...