APL語言
編程範型 | 陣列、函數式、結構化、模塊化 |
---|---|
設計者 | Kenneth E. Iverson |
實作者 | Larry Breed、Dick Lathwell、Roger Moore等人 |
釋出時間 | 1966年11月27日[1] |
型態系統 | 動態類型 |
系統平台 | 跨平台 |
許可證 | 專有、開源 |
主要實作產品 | |
| |
啟發語言 | |
數學表示法 | |
影響語言 | |
APL 是 A Programming Language 或 Array Processing Language 的縮寫。肯尼斯·艾佛森在1962年設計這個語言時他正在哈佛大學工作,1979年他因對數學表達式和程式語言理論的貢獻而得到圖靈獎。在過去數十年的使用歷史中,APL 從它的原始版本開始不斷改變和發展,今天的版本與1963年發表時的版本已經非常不一樣了。但它始終是一種解釋執行的計算機語言。現代的 APL 版本支持其初始版本不支持的結構和模式編程。APL 至今依然使用一種非標準化的字母表,這一直是他人對 APL 的批評。
概述
[編輯]在許多應用場合下(數學、科學、工程技術、電腦設計、機械人、數據顯示、保險技術、傳統的數據處理等等),APL是一種非常有力的、表達豐富的和簡明的程式語言。它一般被用在一個與用戶接口的環境中。它最初的設計目的是將數學公式寫成一種電腦可以理解的方式。學它一般很容易,但要分析 APL 寫成的程序往往需要一段時間。與傳統的結構式程式語言不同的是,APL 的程序一般由一系列使用在序列上的單元的或雙元的函數或運算符號組成。由於APL擁有許多非標準的運算符號,這些符號之間沒有優先性(比如一般數學中的乘號、除號較加號、減號有優先權,APL中沒有這樣的優先權)。最初的APL語言沒有任何控制結構如循環(do-while)或者條件選擇(if-then-else),但一些序列運算符號可以用來模擬編程結構,比如iota(用來獲得一個從1至N的序列)可以用來模擬循環(for)。
APL 的工作環境被稱為工作場。在這個工作場內用戶可以定義程序和數據。數據也可以在工作場在程序外存在。用戶可以在程序外改變數據,比如:
將一個系列的數據4、5、6、7授予N。
輸出8、9、10、11。
輸出N內所有數的和,即22。
用戶可以將工作場連同其中的所有數據和程序儲存起來。在任何情況下,這些程序不是編譯執行,而是解釋執行的。
APL 最著名的就是它使用一組非ASCII符號。這些符號比一般常見的代數和計算符號要多。有人開玩笑說,用兩行這樣的奇形怪狀的符號就可以將所有航空控制的問題解決了。事實上,在一些APL版本中,用一行程序就可以將任何可計算的函數表達出來,再用一行你可以將這個函數的結構表達出來。由於它的精密的結構和非標準的符號,也有人將APL稱為「只寫語言」。除數學家外,其他人要讀APL寫的程序都感到非常困難。有些數學家覺得其它語言比APL難懂。由於APL使用不尋常的符號,許多編程員在寫APL程序時使用專門的APL鍵盤。今天也有不同的只使用ASCII字母寫APL的方法。
艾佛森後來還設計了一個APL的後續,稱為J語言,這個語言只使用ASCII符號。至今為止只有一種J語言。一些其它語言也提供類似APL的功能。A+是一種開源的程式語言,其許多指令與APL相同。
下面這個例子排列一個存在X里的詞的序列,排列標準是每個詞的長度:
X[X+.¬' ';]
下面是一個尋找所有1和R之間的質數的例子:
下面是這個程序的讀法(從右向左):
- 建立含有從1到R的自然數的系列(假如程序開始時R=6,那麼是1 2 3 4 5 6)
- 放棄這個系列中的第一個元素()(是2 3 4 5 6)
- 令R成為這個系列(是授值符號)
- 令R與R相乘而組成一個矩陣,實際上是組成一個R乘R的乘法表()
- 建立一個長度與R相同的系列,假如R中相應位置的數在乘法矩陣中出現,那麼在這個位置上的數就應該是1,否則0(),這個運算的結果是0 0 1 0 1
- 邏輯地否定的系列中的數,也就是說,1成為0,0成為1(),結果是1 1 0 1 0
- 選擇R中相應的在新的系列中為1的數,這些數是質數(),結果為2 3 5
以下是Perl語言的相應程序:
perl -le '$_ = 1; (1 x $_) !~ /^(11+)\1+$/ && print while $_++'
以下是J語言的相應程序:
( -. r e. , r */ r ) # r =: }. 1 + i. 7
APL 的 Hello World 程序
[編輯]'Hello, world'
字母表
[編輯]從一開始就有人批評APL使用一套特別的、非標準的字母表。學過APL的人一般很喜歡這些特別的符號,這說明當時艾佛森選擇這些符號時是有一定的用意的。Unicode包含這些字母,Unicode被引入後,要尋找特別的字型的問題開始有所減緩。雖然如此依然有人批評當初APL設計時所選擇的特殊的符號。這些專門為APL設計的鍵盤無論如何不會非常普及。
實現
[編輯]GNU APL(頁面存檔備份,存於互聯網檔案館)是一個自由的APL實現,它可以運行在Linux,Windows還有Mac OS X系統上。
引用
[編輯]- ^ APL Quotations and Anecdotes. jsoftware.com. jsoftware. [April 14, 2018]. (原始內容存檔於2020-05-09).