以数之名: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, 如果不熟 ...
随机推荐
- 安装LNMP笔记
安装好centos7,主机ssl连不上 网卡设置为桥接模式或NAT模式 防火墙的原因 首先telnet本机22口 先更新yum源 yum update -y 安装网络常用工具:telnet trace ...
- Exp1 PC平台逆向破解 20164303 景圣
逆向及Bof基础实验 实验对象 文件名为pwn1的linux可执行文件. 实验目标:程序正常执行流程weimain调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同时包含另一个代码片段 ...
- 面向复杂应用,Node.js中的IoC容器 -- Rockerjs/core
Rockerjs Core 项目地址 项目主页 基于 TypeScript 和注解的轻量级IoC容器,提供了依赖注入.面向切面编程及异常处理等功能.Rockerjs Core可在任意工程中引入,是一个 ...
- 【Alpha】Scrum Meeting 11
目录 前言 任务分配 燃尽图 会议照片 签入记录 前言 第11次会议于4月16日18:15在一公寓三楼召开. 交流确认了任务进度,讨论项目发布事宜,分配下一阶段任务.时长45min. 任务分配 姓名 ...
- P4717 【模板】快速沃尔什变换
思路 FWT的模板 FWT解决这样的卷积 \[ C_k=\sum_{i\otimes j=k} A_iB_j \] \(\otimes\)可能是and,or,xor等位运算 几个式子 FWTand: ...
- web前端面试题 -- 2019最新,最全
最近在找工作,面试了好多家公司,结果都不怎么理想.要么公司环境氛围不行,要么工资达不到理想的薪资.大部分公司对程序员的面试流程几乎都一样,来了先填一份登记表,写一套面试题,然后技术面,人事面.至于有的 ...
- 基于vue 、vue-router 、firebase的todolist小项目
第一次写博客,都不知道改怎么写的好. 本着一颗学习的心,也希望一段时间后再回来在看看自己写的代码,会不会让自己有种不忍直视的念头 *-* 还是先上图吧~ 这是首页,主要是展示所有的列表页面,可以通过输 ...
- php日志
// 全局通用日志工具 function setlog($param = [],$result = [],$name='',$filename = 'm.log',$path = '/tmp/bear ...
- 【编程语言】Kotlin之object关键字
在一个体重秤项目里面使用Kotlin开发,考虑到项目比较小型轻量,所以和团队申请决定使用Kotlin开发,以此熟悉和尝试一下Kotlin. 首先使用Kotlin之后,发现能和Java很好的兼容一起,开 ...
- MySQL 存储过程的变量
MySQL 存储过程的变量 变量是一个命名数据对象,变量的值可以在存储过程执行期间更改.我们通常使用存储过程中的变量来保存直接/间接结果. 这些变量是存储过程的本地变量. 注意:变量必须先声明后,才 ...