以数之名:In Praise of APL 后记
原文: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可以理解为歌词式编程(念经大概也算把
以数之名:In Praise of APL 后记的更多相关文章
- Github上Laravel开源排行榜Star数61-90名
Github上Laravel开源排行榜Star数61-90名,罗列所有 Laravel 开源扩展包,含 Github Star 数量,下载数量和项目简介.默认排序是按Star数量从多到少来排 61.c ...
- Github上Laravel开源排行榜Star数31-60名
Github上Laravel开源排行榜Star数31-60名,罗列所有 Laravel 开源扩展包,含 Github Star 数量,下载数量和项目简介.默认排序是按Star数量从多到少来排 31.c ...
- Windows PowerShell 入門(8)-関数編3
この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...
- CET4
Directions: For this part, you are allowed 30 minutes to write a short essay on the challenges of st ...
- 前端学HTTP之缓存
前面的话 Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关内容 功能 ...
- 使用 Visual Studio Online 进行协同开发
Visual Studio Online(原来的 Team Foundation Service),是项目数据在云中的主页.在我们的云基础架构中只需数分钟便可启动并运行,无需安装或配置任何服务器.设置 ...
- 某中国500强企业BI系统成功应用案例
随着某集团20多年的不断发展发展,现已成为中国500强.中国大企业集团竞争力前25强.中国信息化标杆企业和国家重点火炬高新技术企业.拥有总资产数十亿元.员工数万名,涉足电力.家电.能源.等多个行业,并 ...
- WCF的三个名称/命名空间,你是否傻傻分不清楚?
在定义和寄宿WCF服务的时候会面临三个名称/命名空间,它们分别是ServiceContractAttribute.ServiceBehaviorAttribute和Binding的Name和Names ...
- HTTP协议学习---(六)缓存
本文介绍浏览器和Web服务器之间如何处理"浏览器缓存",以及控制缓存的http header. 本文会使用Fiddler来查看HTTP request和Response, 如果不熟 ...
随机推荐
- mysql时间相加函数DATE_ADD()
mysql中的DATE_ADD()函数 1.定义:函数向日期添加指定的时间间隔. 2.语法:DATE_ADD(date,INTERVAL expr type) date 参数是合法的日期表达式.exp ...
- vue scrolle在tab 中使用
1. 使用npm 安装 npm i vue-scroller -S 地址: https://github.com/wangdahoo/vue-scroller2. 引入 main.js: import ...
- OpenCV自带dnn的Example研究(1)— classification
这个博客系列,简单来说,今天我们就是要研究 https://docs.opencv.org/master/examples.html下的 6个文件,看看在最新的OpenCV中,它们是如何发挥作用的. ...
- VMware虚拟机扩展Ubuntu系统磁盘空间
1 首先给虚拟机扩容 虚拟机->设置->硬盘->实用程序->扩展磁盘容量 2 启动Ubuntu系统 2.1 打开终端安装gparted,sudo apt-get install ...
- scala链接mysql
方法一:链接并操作mysql //链接Mysqlval driver = "com.mysql.jdbc.Driver"val url = "jdbc:mysql://1 ...
- 记flask连接容联云时提示172001,网络错误
直接用sms.py发送没有问题,直接从写好的注册页面发送就不行.在网上查了不少方法,试过了依然没用,结果换了一个网络就好了,估计是部分网络无法正常发送..后来问了下是环境问题,开发环境不稳定
- python-文字转语音-pyttsx3
pyttsx3 python 文字转语音库,支持英文,中文,可以调节语速.语调等. 安装 pip install pyttsx3 示例 import pyttsx3 teacher = pyttsx3 ...
- Notepad++的Json格式化插件
安装 :1.下载插件压缩包并解压出dll:Jsonviewer2.dll(64位)或NPPJSONViewer.dll(32位); 2..拷贝对应dll到Notepad++安装目录下的plugins ...
- webpack dllPlugin使用(基于vue-cli webpack模板)
由于本例单入口时打包的文件体积过大,将其分成多入口. 主要涉及到的几个文件为: /index.html, /webpack.dll.config.js, /build/webpack.base.con ...
- 实验十一 团队项目设计完善&编码测试
任务一: 根据OOD详细设计工作要点,修改完善团队项目系统设计说明书和详细设计说明,将完善后内容以<XX团队项目软件设计方案>为名发布在团队博客中,博文中要突出对完善内容的陈述说明,修改部 ...