肯尼斯·艾佛遜在哈佛大學當了5年助教,沒有獲得終身教職。
院長不提拔他的一個重要原因就是:這5年,除了一本小書之外,什麽都沒出版!
那本小書後來幫助他獲得了電腦界最高獎:圖靈獎。
這本小書的名字叫做【 A Programming Language 】
(註:這個故事是另外一個圖靈獎獲得者布魯克斯講的,我搜了一下,【A Programming Language】這本小書其實在哈佛大學的時候並沒有出版,艾佛遜當時只是發明了一套符號系統,主要用於教學)
A Programming Language 縮寫是 APL , 它真的是一個程式語言!
這個名字實在是搞笑,不由得讓人想起周星馳的電影【鹿鼎記】中的「有間客棧」。
一個程式語言,為什麽有這麽大的影響力,竟然能獲得圖靈獎?
有人認為 APL是世界上最醜陋的程式語言 ,因為用它寫出的程式碼實在是太難懂了。
下面是個康威生命遊戲的程式碼,一行就能實作極為復雜的功能。
看看這奇奇怪怪的符號,甚至得配一個專用的鍵盤,要不然你根本就敲不出來。
還有人認為它是有史以來最重要的程式語言,它本質上是函數式的,迫使程式設計師進行並列思考,它支持任意形狀和大小的矩陣,提供了任何你能想象得到的運算子進行選擇,拆分,連線,投影,重塑等各種運算,幾天內就可以用APL寫一個SQL直譯器,沒有任何語言能和它媲美。
其實, 艾佛遜並不是為了編寫電腦程式而設計APL的,他是為了更好地表達數學思想和演算法 ,這使得APL具有一種非常獨特的符號體系,如希臘字母、箭頭、圓圈等。
比如陣列a = [1,2,3,4] 在APL 中是這麽表示的:
A ← 1 2 3 4
兩個陣列相加:
A ← 1 2 3 4B ← 5 6 7 8A + B ⍝ 輸出 6 8 10 12
建立一個從1到5的陣列:
n ← ⍳ 5 ⍝ n的值是[1,2,3,4,5]
把陣列n的每個元素做平方:
n * 2 ⍝ 結果是[1,4,9,16,25],APL中星號表達的是平方,不是乘法
對陣列n中每個元素相加,求和:
+/ n ⍝ 結果是 1+2+3+4+5 = 15 ,「/」是規約運算,它使得左側的運算子(+)套用到右側所有元素
對陣列n求平均值
(+/ n) ÷ ⍴n ⍝ ⍴ 是求一個陣列的個數
再來一個復雜一點兒的:生成6個隨機數,範圍在1到999之間,並按照升序顯示
x [ ⍋ x ← 6 ? 40 ]
APL對矩陣運算和高維陣列操作非常簡潔和直觀,假設我們有兩個矩陣A和B
我們要計算兩個矩陣的乘積C = A × B
A ← 2 2 ⍴ 1 2 3 4B ← 2 2 ⍴ 5 6 7 8C ← A +.× B
解釋一下:
(1) 2 2 ⍴ 1 2 3 4 將一維陣列 1 2 3 4 重新排列為一個 2x2 的矩陣 A。⍴ 是reshape的意思。
(2) 2 2 ⍴ 5 6 7 8 將一維陣列 5 6 7 8 重新排列為一個 2x2 的矩陣 B。
(3) +.× 是APL的內建運算子,用於矩陣乘法。
一旦你記住了這些符號,程式碼就變得非常簡潔。
APL的核心就是陣列,它甚至可以叫做「 Array Programming Language 」。
我們回過頭來說艾佛遜,他「黯然」離開哈佛大學以後,加入了IBM的研究院,薪水也翻了一番。
在IBM,弗雷德·布魯克斯(System/360架構師,圖靈獎獲得者,【人月神話】作者)建議他: 堅持做你真正想做的事情,管理層非常需要新想法,只要不是非常瘋狂的想法,都會得到支持。 」
於是艾佛遜就繼續發展自己在哈佛大學建立的符號系統,這一發展不得了,竟然變成了一門電腦程式語言。
1964年,IBM推出著名的大型電腦System/360,APL也在System/360上實作了。
當時的程式語言,基本上都是批次處理的,就是說把程式碼輸入電腦,「等半天」後檢視執行結果。
但是APL是一套完整的互動式編程環境,程式設計師可以輸入 APL 語句並立即得到響應。
程式可以在數十人同時使用的電腦上定義、偵錯、執行和保存。
對於許多曾經飽受使用打孔卡進行批次處理編程之苦的程式設計師來說,APL絕對是一大福音。
IBM肯定不會放過這樣的商業機會,開發了很多軟件和庫,吸引使用者使用APL,比如
Starmap :一組繪制恒星和行星位置的函數
IBGS:互動式商業模擬遊戲
Graphpak:互動式圖形包
MINIPERT:專案管理的關鍵路徑方法 (CPM) 系統
APL 財務規劃系統
APL 計量經濟學規劃語言
......
一旦掌握APL,編寫程式的速度就非常快,這讓它在建模和原型方面有重要價值。
1973年,Continental Can公司需要給旗下的21家制造廠提供一個庫存管理程式,他們的FORTRAN程式設計師幹了一年也沒搞定,後來STSC公司的一個銷售出馬,用APL Plus一周內就把一個可用的工作模型給弄好了。
可以說,在20世紀60年代末到80年代初的大型電腦上,APL程式語言占有重要的一席之地。
1980年,在IBM工作了20年的艾佛遜離開IBM,回到加拿大,加入IP Sharp Associates公司,從事APL語言的咨詢和服務工作。
1990年,為了解決APL中的特殊字元問題,艾佛遜和華裔科學家Roger Hui一起發明了 J語言 ,J語言完全使用基本ASCII字元集。
80年代以後,隨著個人電腦的興起,Basic、Pascal、C語言等新貴開始統治市場,APL慢慢地退居到了科學計算、統計、保險精算和金融等領域,APL的符號性質和陣列功能使其受到領域專家和數據科學家的歡迎,他們不具備程式設計師的技能。
那麽,都2024年了,APL值得我們去了解嗎?
首屆圖靈獎獲得者Alan J. Perlis說過: 一門語言如果不能影響你編程的思維方式,是不值得了解的 。
而APL就是一門能影響你編程思維的語言,強烈建議去Try APL網站去玩一下。