在计算机时代的第一个50年中发明了数以千计的编程语言。它们中的许多编程语言都大同小异,而且许多编程语言都沿着一条传统、演进之路,从其前辈那里一路走来。不过,一些具有革命性的语言却有种异乎寻常的倾向,使其有别于其他更为通用的编程语言。LISP用于表处理(list processing)。SNOBOL用于字符串操作。SIMSCRIPT用于模拟。还有APL用于数学,其重点是阵列处理(array processing)。

image

图:肯尼斯·艾佛森(Kenneth E. Iverson或Ken Iverson)在哈佛大学

在计算机时代的第一个50年中发明了数以千计的编程语言。它们中的许多编程语言都大同小异,而且许多编程语言都沿着一条传统、演进之路,从其前辈那里一路走来。

不过,一些具有革命性的语言却有种异乎寻常的倾向,使其有别于其他更为通用的编程语言。LISP用于表处理(list processing)。SNOBOL用于字符串操作。SIMSCRIPT用于模拟。还有APL用于数学,其重点是阵列处理(array processing)。

尽管最终成为APL编程语言,然而它最初却是由哈佛大学的肯尼斯·艾佛森(Kenneth E. Iverson)教授于1957年发明的一种数学表示法,而非计算机编程语言。虽然存在其他面向矩阵的符号系统,其中就包括由爱因斯坦(Einstein)发明的简洁张量表示法(concise tensor notation),它们更多地倾向于数学分析,而更少地倾向于算法综合。艾佛森是霍华德·艾肯(Howard Aiken)的学生,他把“艾佛森表示法”(Iverson Notation)教给其哈佛的学生们,以便用于解释算法。

艾佛森于1960年受雇于IBM,并与Adin Falkoff及其他人一起合作研究他的表示法。在至今仍久负盛名、他1962出版的《A Programming Language》[1]一书中他说,表示法是为了对“步骤……即所谓的算法或程序”进行描述,而且那是一种语言,因为它“展示了相当多的语法结构”。但是,在那时它不过是一种供人阅读的表示法,而非一门计算机编程语言。该书提供了许多示例,他既可用作描述工具(例如用于记录计算机指令集的定义),又可用作表达通用算法(例如用于排序及搜索)的方法。由于预见到如此新奇的东西会有阻力,因此他在序言中说道,“此书的中心论点是,对于一门能胜任的编程语言,其描述及分析能力足以偿还为掌握它所要付出的巨大努力。”或许他是在警告,掌握这门语言并非易事。或许他也是在暗示,在他看来,其他表示法语言都不足以“胜任”。

当然,团队不久就发现,可以把这种表示法变成计算机编程语言。这种语言被称为APL始于1966年,APL强调阵列操作,并采用了一套非常规符号。它一点儿也不像其他那些已经发明出来的计算机编程语言。

当IBM为了他们的System/360大型机引入“APL\360”时,APL才变得流行起来。与那时候的大多数其他语言不同,APL\360还是一个完整的交互编程环境。程序员坐在一台与分时计算机相连的电动打字机前,输入APL语句,并获得即时响应。可以对程序进行定义、调试、运行,而且可以将程序保存在供多人同时使用的计算机上。

这个版本的APL完全是用360汇编语言编写的,它控制着整台计算机。除了一种高级语言之外,APL实现了完整的分时操作系统。

经IBM许可,计算机历史博物馆(Computer History Museum)很荣幸地提供用于System/360的1969-1972年“XM6”版本的APL源代码,而且该源代码只能用于非商业用途。

该文本文件共有37,567行,其中包括代码、若干宏、及一些全局定义。这90个单独的文件是用“./ ADD”命令隔开的。要访问这份资料,你必须接受这里显示的许可协议的条款。

下载APL360源代码


附加资料

创造APL编程语言

浅尝APL

APL是如何实现的

APL的应用

对APL的赞扬与批评

肯·艾佛森(Ken Iverson)小传

致谢

文献目录

APL年表(译者增补)


创造APL编程语言

艾佛森的书《A Programming Language》[1]使用了一种图形化的表示法,该表示法难以直接应用于计算机编程语言。他认为,该表示法是一种矩阵代数的扩展,而且用到了常用的数学版式约定,例如上标、下标、以及基于字符的字体粗细或字体进行区分。例如,这里是一段用于数字排序的程序:

image

为了把这种表示法线性化(linearize),以便用作可通过键盘输入的计算机编程语言,因此APL的实现者肯定要放弃使用那些用于控制转移的示踪箭头。不过从某种程度上来说,有个特点他们可以保留,即使用特殊符号表示原语函数(primitive function,或原函数),如图所示,这是个用于创建哈夫曼编码的程序:


image

APL所使用的符号更接近于标准的数学符号,而非编程语言。例如,除号是÷,而不是/。为了支持这套非常规符号,APL\360使用了一种定制设计的键盘,将特殊符号置于大写字母的位置上。


image

图:APL\360所使用的定制设计的键盘

即便如此,与适于标记在键盘上的那些符号相比,还有些更为特殊的字符,因此有些字符要通过重复打印两个字符才能输入。例如,“升序(grade up)”字符⍋是用于排序的基本运算符(primitive operator),通过输入(shift+H),接着退格(backspace),然后输入(shift+M)才能创建出来。由于没有留下同时使用大写字母与小写字母的空间,因此APL仅支持大写字母。

为了打印程序,艾佛森与Falkoff让IBM为他们的1050及2741终端设计了一种特殊型号的球,使用的是IBM Selectric电动打字机的机制。

imageimage


至此,程序既可以输入又可以打印了。例如,这是一段用于计算数学中矩阵行列式程序的打印版本,摘自APL语言手册[2]:

image


浅尝APL

APL是一种简洁的高级编程语言,它有别于大多数在20世纪60年代开发的其他语言,不同之处主要有以下几个方面:

求值顺序(Order of evaluation):APL中的表达式是按照从右至左(right-to-left)的顺序进行求值,而且没有函数的优先级层次。例如,输入以下表达式

2×4+3

会导致计算机立即打印结果值

14

由于不同于许多其他拥有运算符优先级的语言,因此这个值不是11。当然,可以使用圆括号对子表达式进行分组,从而改变求值顺序。一般规则是,任何函数恰当的参数都是位于该表达式右侧的值。

自动创建向量及数组(Automatic creation of vectors and arrays):高维结构是在计算表达式时自动创建并返回的,而且标量可以被自由地混入其中。例如,

A2 + 1 2 3

创建向量“1 2 3”,与标量2相加,然后创建变量A以便持有该向量,此刻向量值为

3 4 5

从来不用声明变量;它们是被自动创建的,而且无论分配给它们的表达式的大小及形状如何,它们都能接受。

过多的原语(A plethora of primitives):APL拥有一套丰富的内置函数(及可应用于函数的“运算符”,从而产生不同的函数),可用于操作标量、向量、数组、甚至高维对象、以及它们的组合物。例如,计算上例中向量“A”中各项数字之和的表达式就十分简明

+/A

其中/是“归约(reduction)”运算符,它会导致左侧的函数依次应用于右侧操作数的所有元素上。以下表达式旨在计算A中数字的平均值,其中还用到了原语函数ρ去确定A中的元素个数:

(+/A) ÷ ρA

(译注:除法运算仍是正常的从左至右的计算顺序,即被除数÷除数,参见下面的“APL\360用户手册”截图)
以下是几张摘自1970年版“APL\360用户手册”[3]的表格,其中的内置APL函数及运算符散发着力量与精明的味道。(点击查看大图。)


image image


image


APL不仅促使你用别具一格的方式去思考编程,还鼓励你使用临时的高维数据结构作为中间值,从而减少使用强大的原语。以下是个有名的例子,虽然很短却是个完整的程序,用于计算到R为止的所有质数(prime)。

(~T∊T∘.×T)/T1↓⍳R

下面解释了是如何对该表达式求值的:

子表达式

含义

假设R为6时的值

⍳R

生成从1到R的数字向量。

1 2 3 4 5 6

T1↓

丢弃向量的首个元素,并将其余部分赋给临时向量T。

2 3 4 5 6

T.×T

创建乘法外积:一张存有T的每个元素两两相乘结果的表。

4

6

8

10

12

6

9

12

15

18

8

12

16

20

24

10

15

20

25

30

12

18

24

30

36

T

使用“设置成员(set membership)”运算符找出T中的哪些元素位于表中。

0 0 1 0 1

~

对结果取反从而识别出T中的哪些元素没有位于该表中。即这些数在表中没有任何倍数。

1 1 0 1 0

( )/T

选中T中我们已经识别出的元素。它们都是小于R的质数。

2 3 5

请注意,这个程序中没有循环。APL表达式的力量意味着,APL对条件分支及循环的要求常常远低于那些更为传统的编程语言。

APL运算符能以各种简单的方式用于通常会需要循环的所有计算。例如,计算向量X中大于100的元素个数的表示式为

+/X>100

此表示式之所以能成功执行,是因为X>100会返回仅有0和1的位向量(bit vector),从而表明X中哪些的元素大于100,然后+/会把那个位向量中所有的位加起来。

不过,条件执行及循环当然有时也是需要的。鉴于结构化编程最近的发展,APL用于控制转移的唯一原语(即“GO TO LINE x”的语句)就显得尤为不足。下面的函数示例是计算其两个参数的最大公约数(greatest common divisor,缩写为GCD)。最后一条语句创建了可以返回起始位置的循环分支。在第2行中,控制条件转移至第0行,从而导致函数退出,并将此值最后一次赋给G

image

想进一步学习20世纪60年代的APL语言,请参阅“APL语言”参考手册[2]及Paul Berry在1969出版的“APL\360入门(Primer)” [4]。

当然该语言已历经多年发展,而且更多最新版本都包括了诸如IF-THEN-ELSE等控制结构。


APL是如何实现的

APL表示法的首个计算机实现是一种面向批处理的语言解释器,是由位于纽约州约克镇IBM研究中心的拉里·布里德(Larry Breed)与当时还是斯坦福大学研究生的菲利普·艾布拉姆斯(Philip Abrams)一起于1965年用FORTRAN写成的,该解释器适用于IBM 7090大型机。

就在首个交互式版本写成不久之后,拉里·布里德与罗杰·摩尔(Roger Moore)一起有完成了适用于IBM 7093大型机(拥有虚拟内存的实验性7090大型机)的版本。该解释器在TSM注1分时系统下运行,并被古怪地称为“IVSYS”,据说是为了能与“IBSYS”合辙押韵,而“IBSYS”是标准7090操作系统的名字。布里德在2012年的一封电子邮件中写道,

IVSYS提供了登录、注销、立即执行、及功能定义等功能;它还提供了工作区,既有激活的又有存储的。实现的这些功能都是很基本的;我们用到的TSM项目提供给我们的功能主要就是登录、注销、保存文件。在7093实验机退役之前,我们只在上面工作了几个星期,然后罗杰和我便开始规划在System/360上运行的独立系统。就在那几个星期里,肯与他的研发小组首次看到了可执行的APL会是什么样子。

该语言子集的另一实现于1967年完成,适用于IBM 1130微型计算机。

APL的首个实现不仅用于IBM System/360,而且在IBM外部也得到了广泛应用。并于1966年11月首次成为IBM中名为“APL\360”的服务。(“APL\360”的记号,由于反斜杠是APL的“展开式(expansion)”运算符,因此这个记号还有其隐含的意义:“APL扩充360”)。

布里德说对这段时光记忆犹新,

1966年初这段时间正是从艾佛森表示法到APL的过渡时期。(事实上,Adin [Falkoff]是在1966年春天提出的“APL”。)由于对该语言及其环境的改善和扩展持续了很多年,因此把它做成商业版本几乎就没有添加任何代码,只做了些文书工作。

在1968年8月APL\360被作为IBM“贡献程序库”中的无支持(“类型 III”)程序提供给IBM的客户使用[5]。主要的实现者是拉里·布里德、迪克·莱思维尔(Dick Lathwell)、及罗杰·摩尔;做出贡献的其他人有Adin Falkoff及卢瑟·伍德拉姆(Luther Woodrum)。

image

图:早期的APL开发者,从左至右依次为:迪克·莱思维尔、肯·艾佛森、罗杰·摩尔、Adin Falkoff、菲利普·艾布拉姆斯、拉里·布里德。此照片拍摄于1983年。

由于APL变量的动态特性,APL\360被实现成解释器(interpreter),而非可生成机器码的编译器(compiler)。程序被存成名为“代码串(codestring)”的内部形式,而代码串与用户输入的内容直接对应。该解释器随后会在程序执行时检查代码串,然后动态分配内存并将变量重新配置为表达式去求值。

APL\360的首个版本控制着整台计算机。因此它是集操作系统、文件系统、分时监控器、命令解释器、以及程序语言于一身的联合体。由于特定的有限主内存,因此用户工作区会根据需要从内存中换出并转存至磁鼓(drum)或磁盘(disk)上。其性能令人印象深刻,拉里·布里德在其简单明了的实现说明[6]中,将这归因于该语言根据需求去调整操作系统的能力。

APL\360是种会话式语言(conversational language),即便是在50个并发用户的情况下,它仍可以提供快速响应并高效执行。像“)LOAD”、“)SAVE”、及“)COPY”这些系统命令用于维护用户的存储工作区库。而其他系统命令用于控制语言特色;例如,程序员可以用“)ORIGIN”控制向量及数组的索引是从0还是从1开始。

对于那一代已经备受用穿孔卡进行批处理编程折磨的许多程序员而言,APL是引入到交互式分时系统中的首个编程语言。

APL的应用

即使在APL成为计算机编程语言以前,艾佛森表示法(Iverson Notation)作为一种为人们记录算法的语言就是很有用的。经典的例子是新型IBM System/360计算机指令集架构的正式定义,该定义见于1965年在IBM系统期刊(IBM System Journal)上发表的由Adin Falkoff、肯·艾佛森(Ken Iverson)、及Ed Sussenguth三人合写的文章中[7]。

这份说明是正式的而非随口说说、而且已通过一套程序实现了、并通过公共变量(common variables)进行交互、还要与辅助表(auxiliary tables)结合使用……尽管这份正式说明是完整且自包含的,但这些内容仅作为提供的一种辅助手段,以便进行初步研究。

不过这篇文章中的内容远不止于此。那是一份逐行解释的正式说明,这意味着此文同时也是对APL描述能力的一次示范与讲解。

在艾佛森的书中写道,使用图形风格的表示法是为了控制传输(control transfers )。例如,这是一份内存访问操作的描述。(点击查看大图。)

image

这是APL从适用于出版物的表示法到交互式计算机编程语言的转变,从而使得APL蓬勃发展起来。当APL\360版本的实现投入使用时,IBM及其他厂商通过生产多种多样的应用程序从而刺激了APL的使用,此类应用程序如下:

  • Starmap(星图):一套用于计算并绘制恒星及行星位置的APL函数。[8] [9] 由IBM的Paul Berry及John Thorstensen在1973年编写完成,John Thorstensen那时还是布林莫尔(Bryn Mawr)大学天文学系的学生,现在则是达特茅斯学院(Dartmouth College)的物理学和天文学教授。该程序采用了一些经典解决方案以便将开普勒方程组应用于特定的日期和时刻、以及一系列坐标旋转,从而使得行星和恒星看起来像在碗大的天空中运行一样。
  • IBGS:交互式商业模拟游戏:“一台通用计算机管理着各种模拟活动,其中包括针对生产、营销及财务等职能部门的决策制定与规划。”
  • Zeros and Integrals in APL(用APL求解零点和积分):“该程序利用例如牛顿法(Newton’s)及穆勒法(Muller’s)等经典方法和例如詹金斯与特劳布法(Jenkins and Traub’s)等最近发展出来的方法,可以找出实函数的实零点,实系数与复系数多项式的实零点及复零点、以及复函数的复零点。”
  • Graphpak(适用于APL\360的交互式图形程序包):“……能力范围从支持最低水平的图形接口到更高水平的若干应用程序领域……绘图组件……线性的或对数的……曲线拟合……画法几何组件允许定义尺度变换、放大、平移、旋转、以及三维物体的投影显示。”
  • Graphs and Histograms in APL(用APL绘制曲线图及直方图):“在打字机终端上产生各种曲线及柱状图。”
  • APL Coordinate Geometry System(APL坐标几何系统):“解决了在终端的坐标几何交互方式问题……适用于测量师、土木工程师、城市规划者……”
  • APL/PDTS(程序开发跟踪系统):“……用于协助管理者及规划者根据开发计划监控程序开发项目的执行状况。”
  • MINIPERT:“用于项目管理的关键路径法(CPM)系统”
  • APL Econometric Planning Language(APL计量经济学规划语言):“为执业经济学家、业务预报员或教师提供一些适用于交互式模型构建及模型求解的易用工具。”
  • APL Financial Planning System(APL财务规划系统):“让财务分析师及规划师设计报告,指定计算报告书,输入及更改数据,而且随即便可获得打印报告。”
  • APL Text Editor and Composer(APL文本编辑器及排版机):“此程序旨在终端上以交互方式处理文本……包括的函数可用于输入、修改、排版、打印、及保存文本……适用于秘书、科学家、工程师、管理者,抑或任何制作论文、信函、报告或规范的其他人。”

这些应用程序中有许多都强调交互性(interactivity),与当时更为典型的批作业处理(batch-job processing)相比,那些应用程序使生产力得到了大幅提升。此外,APL允许以更快地速度开发应用程序。在一封2012年的邮件中,拉里·布里德指出,

纵观所有领域,APL程序的编写速度都使其在建模及原型开发方面很有价值。……举例来说:在1973年左右,Continental Can公司需要一个库存系统,用于管理旗下的21家制造厂。其FORTRAN程序员团队干了一年,而成功却还是遥遥无期。而科学分时公司(STSC)的一位推销员花了一个周末的时间,用APL*PLUS便构建起了可用的运转模型。

APL在科学、精算、统计、及财务领域的应用程序中最为普及。关于APL在前25年的发展详情请参阅IBM系统期刊的1991年特刊[10],其中包括了与此主题相关的12篇论文及1篇随笔。

对APL的赞扬与批评

APL最初并没有设计成编程语言。正如艾佛森所言,

开发APL的初衷是提供一种适于书写及教学的工具。尽管APL已被主要用于商用编程,但我依然认为,其最重要的用途还有待挖掘:使之成为一种广泛适用于多学科教学的、简单、精确、可执行的表示法。[11]

拥有如此之多简明扼要且非同寻常的符号,APL计算机程序如激发灵感的数学符号一般拥有人们梦寐以求的简洁和优雅。APL吸引了狂热的追随者。艾伦·佩里斯(Alan Perlis,1966年的首位美国计算机协会图灵奖得主)就是其中之一:

只要用眼睛扫上一句,它所展现出来的那种操作与控制之间的相互作用是如此地错综复杂、独具匠心、精妙绝伦,若用其他编程语言实现明显要写上好几页才行。人们开始学着去欣赏这种风格的兴起及其意义。[12]

APL把人们解放出来,许多人找到了表达的自由。

我过去常常用‘法西斯主义的编程语言’来形容[Pascal],因为它专断独行、刚愎自用。……如果说Pascal是法西斯主义,那么APL就是无政府主义。[13]

不过APL程序常常是如此玄妙而令人难以解读。有人戏称,APL是“只写语言(write-only language)”,因为即便是程序的作者以后理解起来可能也会有困难。APL激发了编程花招。而编写APL“单行代码(one-liner)”去实现完整复杂算法的挑战实在让人难以抗拒。例如,这里就有约翰·康威(John Conway)的“生命游戏(Game of Life)”的两个不同的APL单行代码的实现版本:

life{↑1 ω∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂ω}

image

很明显,不适合胆儿小的人。荷兰计算机科学家埃德斯加·迪杰斯特拉(Edsger Dijkstra)曾说,

APL虽是个误会,但已达到近乎完美的地步。对于以往的的编程技术而言,它是未来的语言:它将创造新一代的编码极客。[14]

不过APL的粉丝们会说,玄妙的APL编码是一种糟糕的编程风格,那对于任何语言都是种苦难。另一种观点认为,APL为表达算法提供了更丰富的调色板,因此你可以更快地解决更难的问题,而同时引发不相关的语法混乱会更少。

无论你怎么想,APL及受其启发的各种语言,例如APL2J语言,仍是形形色色的编程语言宇宙中的活跃部分。

肯·艾佛森(Ken Iverson)小传

image

肯尼斯·尤金·艾佛森(Kenneth Eugene Iverson)于1920年12月17日出生在加拿大艾伯塔省卡姆罗斯市附近的一个农场里。他曾在农村的单室学校注2里接受教育,直到9年级结束,当时由于经济大萧条而辍学,因此他只好在家庭农场里帮工。他后来说,继续求学的唯一目的是为了能成为一名教师,却坚决不想以此谋生。在漫长冬季的几个月里,他自学了微积分。

image

1942年他应征入伍,并在服兵役期间学习了几乎足以完成高中学业的函授课程。退役后,他在安大略省金斯敦市的女王大学获得了数学及物理学双学士学位,然后从哈佛大学获得了物理学硕士学位。在1954年,在计算机先驱霍华德·艾肯(Howard Aiken)的指导下完成了博士学位,他的学位论文题目是“线性微分方程的计算机解决方案:在动态经济模型中的应用”。

在获得他的博士学位后,艾佛森成为了哈佛大学的教员,并执教艾肯的新型自动数据处理程序课程。他在那里做了1年讲师、及5年助理教授。由于因循守旧的数学表示法在算法表示上的不足使他变得越来越沮丧,于是他开始发明自己的表示法。

1960年,在弗雷德里克·布鲁克斯(Frederick Brooks)的建议下,艾佛森加入了位于纽约州约克镇的IBM研究中心,而弗雷德里克·布鲁克斯在哈佛时曾做过艾佛森的助教注3,并且他那时已就职于IBM。于是二人齐心协力不断发展新表示法。终于在1962年肯出版了那本至今仍被奉为经典的《A Programming Language》[1]一书,为了便于提及该表示法,APL的名字便因该书的书名而得,而在此之前则被非正式地称为“艾弗森表示法(Iverson’s notation)”。

艾佛森在IBM任职期间始终致力于APL的发展。在1980年他从IBM离职,并返回加拿大,受雇于I.P. Sharp Associates公司,那时该公司已经建立起一种基于APL的分时服务。

image

1987年他“从有偿就业岗位退休”,而后倾力关注更现代的APL方言的发展。尽管APL被成功地应用于商业用途,不过艾佛森想开发一种适合于教学的、简单易行的新型表示法,而且要成本低廉。这种语言的首次实现被称为J语言,并在“1990年APL用户大会”上正式公布。

艾佛森创造此类语言的能力源于他对“语言及文字的极致享受,”他的女儿珍妮特·克拉默(Janet Cramer)回忆说。“他读字典就像人们看小说一样。”艾佛森认为至关重要的是,用英语和数学这两种语言交流就要简单明了

艾佛森与包括其子埃里克(Eric)在内的多位合作者继续致力于J语言的发展,而且他还不断发表了大量文章。在2004年10月16日,星期六,当他正忙于一份J语言教程的工作时,不幸患了中风——而3天后于10月19日与世长辞,享年83岁。

有许多与肯·艾弗森有关的故事。下面列出其中几个:

肯没有获得哈佛大学授予的终身职位。他做了5年的助理教授,而学院却决定不提拔他。我问他出了什么问题,他答道,“院长给我打电话说,‘问题就出在,你连一本小册子都没出版过’”。

不过这本小册子后来却让他获得图灵奖(Turing Award)。

我认为那是对晋升程序的传统观念的评价,而不是对肯的评价;那是对学术程序及哈佛大学的评价。

——弗雷德里克·布鲁克斯,肯尼斯·艾佛森追思会注4,2004年11月30日

在一次早期讲演中,肯正在解释宽容比较(tolerant comparison)的优势。一位听众满腹狐疑地问道,“你不会是想说,当A=B且B=C时,A有可能不等于C?”肯不假思索地回答,“所有木匠都知道!”然后接着解释下一个问题。

——保罗·贝瑞(Paul Berry)

在一次聚会中,我与肯聊天,我说,“跟你说,肯,你是我最喜欢的语言设计者,而唐·克努特(Don Knuth或Donald Ervin Knuth)是我最喜欢的程序员。”而肯马上说,“我的程序设计何错之有?”

——乔伊·塔特尔(Joey Tuttle),肯尼斯·艾佛森追思会,2004年11月30日

那是在1973或1974年,肯和我一起给位于罗切斯特市的柯达(Kodak)公司做演讲,听众是四五十名需要用PL/I语言注5工作的程序员。在提问阶段,一位资深团队成员说,“我是否可以这样理解你们所说的话,你建议我们应该尝试一种新的思维方式。”

接着肯从座位上一跃而起,说道,“没错!所言极是!”

——乔伊·塔特尔(Joey Tuttle),肯尼斯·艾佛森追思会,2004年11月30日

致谢

感谢IBM的Michael Karasick、Yvonne Perkins、Steve Selbst、及Ken Edwards结束了我十年为获得APL源代码释放许可而奔波的历程。
感谢Curtis Jones、Larry Breed、Paul Berry、及Roy Sykes对本文早期草稿的批评指正。

——伦恩·舒斯特克(Len Shustek)

文献目录

[1] K. E. Iverson, A Programming Language, John Wiley and Sons, Inc., 1962.

[2] IBM, “APL Language,” March 1975.

[3] IBM, “APL\360 User’s Manual,” March 1970.

[4] IBM, Paul Berry, “APL\360 Primer – Student Text,” 1969.

[5]L. M. Breed and R. H. Lathwell, “APL\360,” 1968.

[6] L. M. Breed and R. H. Lathwell, “The Implementation of APL\360,” in ACM Symposium on Experimental Systems for Interactive Applied Mathematics, 1967.

[7] A. D. Falkoff, K. E. Iverson and E. H. Sussenguth, “A Formal Description of SYSTEM/360,” IBM Systems Journal, vol. 3, no. 3, pp. 198-261, 1964.

[8]P. C. Berry and J. R. Thorstensen, “Starmap,” 1978.

[9] P. C. Berry and J. R. Thorstensen, “Starmap,” IBM Systems Development Division, 1975.

[10] IBM Systems Journal, vol. 30, no. 4, 1991.

[11] K. E. Iverson, “A Personal View of APL,” IBM Systems Journal, vol. 30, no. 4, 1991.

[12] A. J. Perlis, “In Praise of APL: A Language for Lyrical Programming,” SIAM News, June 1977.

[13] B. McCormick, “A Programming Language,” 2000,2002.

[14] E. W. Dijkstra, “How Do We Tell Truths That Might Hurt?”,” SIGPLAN Notices, vol. 17, no. 5, May 1982.

[15] A. D. Falkoff and K. E. Iverson, “The Design of APL,” IBM Journal of Research and Development, vol. 17, no. 4, 1973.

[16] A. D. Falkoff and K. E. Iversion, “The Evolution of APL,” SIGPLAN Notices, vol. 13, no. 8, pp. 45-57, August 1978.

[17] L. Breed, “How We Got to APL\1130,” 10 May 2004.

[18] ACM, “Proceedings of the APL’69 Conference on APL,” SUNY Binghamton, NY, 1969.

关于作者

Len Shustek

伦恩·舒斯特克(Len Shustek)是计算机历史博物馆理事会的董事会主席。在1979年,他与人合作创办了Nestar Systems公司,那是一个针对个人电脑的早期的开发者网络。在1986年,他与人合作创办了Network General公司,那是一家网络分析工具生产商,其中就包括The Sniffer™。该公司在与McAfee Associates及PGP合并后成为Network Associates公司。更多……

APL年表

此节为译者在翻译过程中偶得,特意增补于此与各位读者分享。有兴趣的读者可浏览“APL年表”所属原文

  • 1964年 - 肯尼斯·艾佛森(Kenneth Iverson)先生发明的一种表示法,旨在帮助他于1955年至1960年在哈佛大学任教期间发表名为“自动数据处理(Automatic Data Processing)”的电子数据处理(EDP)注6课程讲义。这种有趣的表示法在20世纪60年代早期被首次转化为APL语言,当时肯已加入IBM。
  • 1966年 - APL于1966年在IBM 360大型机系列上被实现,将其作为一种解释性语言与用其编写的分时操作系统一起使用。因此,APL是种相当古老的语言,与它同处一个时期的语言还有ALGOL(1958)、Basic(1965)、COBOL(1960)、Fortran(1953)、及PL/I(1965)。
  • 1969年 - 科学分时公司Scientific Time-Sharing Corporation,缩写为STSC)是由一些最初在IBM实现了APL语言的人创建的。
  • 1970年 - 科学分时公司创造了APL*PLUS™,一个APL语言的新版本,具有许多面向业务应用程序开发的扩展。APL*PLUS包括了非常强大的文件系统,用到的函数诸如ŒFCREATE、ŒFTIE、ŒFAPPEND、ŒFREAD、ŒFFREPLACE……
  • 1979年 - 科学分时公司更名为STSC股份有限公司(STSC, Inc.)
  • 1982年 - PC(个人电脑)上的APL语言。自1966年以来,APL已在多种计算机上实现了,主要是大型机,诸如宝来(Burroughs)、IBM、及西门子(Siemens)。当初APL错失向微型计算机市场进军的良机是因为APL需要更强的性能(不仅需要更快的计算速度还需要更大的存储),而早年间的微机却难以企及。拥有APL的早期微机可谓凤毛翎角,仅有Tandy的TRs90及Commodore的PET两款而已。APL在微机上崛起便随着更强大的16位微机的出现,这使得可以在微机上用APL解决各种商业上的问题。APL*PLUS PC版的第1版,是由STSC公司引入到PC上的首个APL版本。
    APL*PLUS PC版于1982年推出,而且与APL*PLUS大型机版高度兼容。它所提供了一些同样可在大型机上使用的实用工具区。
    APL*PLUS PC版是仅有640KB大小的DOS应用程序。STSC公司于1982年被Continental Telecom Inc.公司收购。
  • 1984年 - APL2:这个新版本有一个主要扩展:嵌套数组(nested arrays)。在此之前数组总是标量元素(字符数目)。而在此N.A.版本(嵌套数组版本,即Nested Array version)中,每个数组元素都可以是数组本身(以此类推……)。
  • 1985年 - J语言正式启动,这是一种基于APL的语言,除此之外……还出现了一些诸如此类的语言
  • 1992年 - STSC更名为Manugistics
  • 1993年 - Manugistics Group, Inc.首次公开募股(IPO)
  • 1995年 - Manugistics将PC版及UNIX版的APL*PLUS出售给LEX2000财务报告软件公司,随后该公司成立了一家名为APL2000的子公司;并把两款产品更名为APL+
  • 1999年 - Cognos公司收购了LEX2000公司及APL2000公司。
  • 2007年 - 11月12日IBM宣布,两家公司已签订最终协议,IBM将以总价约合50亿美元的价格收购Cognos公司,以便加速IBM的信息随需应变战略。(此条信息为译者增补。)

译注

[注1] TSM(Time Sharing Monitor),即分时监控程序,是IBM在20世纪60年代为7090大型机开发的早期分时操作系统

[注2] 单室学校(one-room schools),即整个学校只有一间教室,所有年级的学生都在一起上课。

[注3] 助教(teaching fellow),大学里协助教学工作的研究生。

[注4] 肯尼斯·艾佛森追思会(A Celebration of Kenneth Iverson),西方人举办的Celebration of Life,类似于东方人举办的追思会,是对逝者生平的颂扬。同是追念逝者,东西方人选择的纪念方式却大相径庭,这应该是文化差异所致。东方的追思会,大多气氛凝重压抑,毕竟是至深至爱的人离去,大家很难轻松的起来。而西方人举办的追思会形式多样,纪念的模式大多与逝者的个性有关,比如逝者生前爱热闹,追思会就很可能是个热闹非凡的派对;逝者生前偏爱时尚和艺术,参加追思会的人们可能不会清一色着黑色服装,反而选择颜色鲜亮惹眼的装束出场,在轻松和温暖的气氛下,怀念故人的生活点滴……这样的方式在东方人看来或许有违情理,但实际上,形式不同,对逝者深深的怀念却是相同的。

[注5] PL/I语言,PL/I是Programming Language One的简写。当中的“I”其实是罗马数字的“一”。它是一种IBM公司在1950年代发明的第三代高级编程语言,用于IBM的MVS、或迪吉多的VAX/VMS等操作系统中。 在系统软件,图像,仿真,文字处理,网络,商业软件等领域均可应用。有些类似PASCAL语言(由瑞士Niklaus Wirth教授于二十世纪六十年代末设计并创立的结构化编程语言)。

[注6] 电子数据处理(EDP),即Electronic Data Procesing,旨在以计算机替代人工处理例行性的数据,并产生报表以支持组织的作业活动。其内容重点乃在于取代重复性的人工操作,以支持基层管理者及作业人员等,故其重心在于重效率的信息系统,例如会计帐之应用。国外把利用电子数据系统的会计,称为电子数据处理会计。详细内容请参阅维基百科

查看英文原文:The APL Programming Language Source Code

关于译者

image

要是您喜欢本文,烦请点击【推荐】,俺先谢了 :D

注:点头像看简介。