J語言

J語言，是一種陣列程式語言，由肯尼斯·艾佛森和於1990年代初發明。J語言是APL語言的一種方言，延續了APL鮮明的簡潔性，它在數學和統計學程式設計上十分高效，特別是在需要進行矩陣運算的場合。J語言最初起步於肯尼斯·艾佛森在1987年發表的《APL字典》，它實現了其中至關重要的秩的概念。J語言提供隱式定義機制包括秩、鉤子、叉子和多種，並介入了作為頭等物件的動名詞，用以建立控制結構，它常被作為隱式程式設計的典範之一。簡介.Ken Iverson和Roger Hui在1996年的照片J語言的運算子，承襲APL傳統，沒有優先順序並且最右先行，codice_1按照codice_2來運算。以歷史上APL使用的典型符號為例，符號codice_3被用來指示摺疊函式codice_4，所以codice_5等價於codice_6；在APL中，除法被表示為數學除號，它將減號和冒號一起在EBCDIC和ASCII二者的紙質文字終端上；J語言使用codice_7表示除法，是對除號的一種近似或提示。為了避免APL使用特殊的字元而遇到的問題，J語言只需基本的ASCII字符集，但使用點號codice_8和冒號codice_9作為“屈折”。點號和冒號除了前導著空白字元的情況之外，都與緊前字元形成類似雙字元組的短字。多數“基礎”或“原始”的J單字，都充當數學符號，透過點號或冒號來擴充套件這些可用基本字元的含義。在其他語言中經常是成對的很多字元，比如codice_10，在J語言中被當作單獨的字，或者在有屈折的時候，作為多字元字的單字元字根。J語言不再支援從1968年的APL\360就有的codice_11形式的方括號索引，轉而支援叫做“來自”的索引機制，它起源自Kenneth E. Iverson於1978年在《運算元和函式》中提出的，依據基數解碼定義，並用符號codice_12表示的索引。J語言承襲IBM APL\360採用了平坦陣列模型，不支援由NARS而著重強調。J語言支援AVX2指令集進行SIMD運算。為了包裝用面向物件程式語言開發的API和框架，J語言提供了層級名稱空間機制，這裡所有名字都存在於特定語境中，可以避免軟體包之間的名字衝突，並能有效的用作基於類的面向物件程式設計的框架。J語言直譯器預設裝載標準庫。透過包管理器，還可以安裝各種外掛，如果是在管理員許可權下安裝的J語言直譯器，則安裝外掛也需要同樣的管理員許可權。J語言擁有常規除錯機制，還有叫做Dissect的可視偵錯程式。除了科學計算和統計分析，它還被用於關係資料庫管理系統如Jd、極限程式設計和網路效能分析。2011年3月，J語言採用了GNU通用公共許可證版本3，從而成為自由和開源軟體，人們還可以在Jsoftware的商業許可證下利用原始碼。文件與詞類.J語言的文件包括在官網的NuVoc中，在其中將主要的字羅列為“J”，並使用顏色標示出它們分別的詞類。早期的文件還有入門和字典。在J語言中的字，被識別為名詞、動詞、定語、系詞、標點、控制字。一個程式或例程，如果接受資料作為輸入併產生資料作為輸出，則被稱為“動詞”，與之相對，資料引數被稱為“名詞”。動詞有兩種形式：只有右側一個引數的一元形式，例如在codice_13中減號是一元動詞，而在codice_14中減號是二元動詞。J語言預定義了很豐富的動詞，它們都自動的作用於多種資料型別之上。使用者定義的程式可以自行命名，並用在任何允許使用原始動詞的地方。無論原始動詞還是派生動詞，它們的一元定義與二元定義，在很大程度上是獨立的。起步示例.J語言可以寫出非常精簡的程式，特別是存在重度的對符號的函式過載，以至於一些程式設計者將它稱為難以閱讀的只寫語言。在計算機的終端上執行codice_15，即可進入J語言的REPL直譯器介面。Hello, World!J語言的“Hello, World!”程式：'Hello, world!'Hello, world!這個Hello World的實現反映了J語言的傳統用法，就是把程序錄入到J直譯器會話中，顯示出表示式結果。還可以準備J指令碼來作為獨立程式來執行，比如在Linux系統上，可以編輯如下內容的一個文字檔案，並命名為比如codice_16：echo 'Hello, world!'exit "注意第一行的codice_17必須頂頭，這裡的codice_18和codice_19，是與Unix shell中同名命令功能類似的動詞。然後在終端介面中執行這個檔案：$ ijconsole test01.ijsHello, world!$ chmod +x test01.ijs # 另一種執行方式，授予這個檔案可執行許可權$ ./test01.ijsHello, world!平均.在J語言中函式一般稱為動詞，例如定義一個叫做codice_20的動詞，計算一序列數的平均：avg=: +/ % #avg 1 2 3 42.5一元動詞codice_21“計數”。叉子codice_30↔codice_31，這裡的codice_32、codice_33和codice_34指示動詞，而codice_35指示一個名詞。使用codice_20的一些例子：]a=: ?. 20 $100 NB. 產生100以內20個隨機整數的一個向量94 56 8 6 85 48 66 96 76 59 33 72 63 1 89 52 17 20 9 65avg a50.754 avg\ a NB. 週期大小為4的移動平均41 38.75 36.75 51.25 73.75 71.5 74.25 66 60 56.75 42.25 56.25 51.25 39.75 44.5 24.5 27.75]b=: ?. 4 5 $50 NB. 產生50以內20個隨機整數的一個矩陣44 6 8 6 3548 16 46 26 933 22 13 1 392 17 20 9 15avg b31.75 15.25 21.75 10.5 24.5avg"1 b NB. 應用avg於m的每個秩為1的子陣列19.8 29 21.6 12.6一元副詞codice_3“插入”，將作為資料引數的列表劃分成一系列的指定大小的連續專案的子列表，將所修飾動詞應用於其上，並將這些結果形成一個列表。一元動詞codice_41“相同”，它在後面的定語章節和單獨條目中論述。查詢與排序.二元動詞codice_45“出現索引”，在任何大小的陣列內查詢匹配者，並返回它的位置索引，如果未找到匹配者，則返回這個陣列的大小。例如：a=: 3 1 4 1 5 9a i. 1 2 NB. 找到1和2的第一次出現的索引1 6a i: 1 2 NB. 找到1和2的最後一次出現的索引3 6在J語言中，排序可以按APL傳統的兩步驟方式，使用一元動詞codice_47“升序索引”。下面是用例：a=: 2 0 4 7 15 9 8 0 4 9 18 8 1 18/: a NB. 產生引數陣列的升序索引1 7 12 0 2 8 3 6 11 5 9 4 10 13({~ /:) a NB. 從引數陣列中按升序索引選取出各個專案0 0 1 2 4 4 7 8 8 9 9 15 18 18/:~ a0 0 1 2 4 4 7 8 8 9 9 15 18 18(a - 10) /: a_10 _10 _9 _8 _6 _6 _3 _2 _2 _1 _1 5 8 8CSV外掛.安裝用來支援CSV檔案的外掛：load 'pacman' NB. 載入包管理器'install' jpkg 'tables/csv' NB. 安裝CSV檔案外掛'showinstalled' jpkg " NB. 檢視已經安裝外掛一個CSV檔案簡單用例：load 'tables/csv' NB. 載入CSV外掛a=: i. 2 3a writecsv jpath '~/test01.csv' NB. 將一個陣列寫入一個CSV檔案12]b=: readcsv jpath '~/test01.csv' NB. 從一個CSV檔案讀入一個盒子陣列│0│1│2││3│4│5│]c=: makenum b NB. 儘可能的將盒子陣列轉換成數值陣列0 1 23 4 5下面演示使用J語言編寫在管道中的過濾器，例如，在具有隱式程式設計機制Unix管道的Linux系統中，建立如下內容的文字檔案，並命名為比如codice_60：load 'tables/csv'stdout makecsv 10 + makenum fixcsv stdin "exit "然後在終端介面中執行如下命令列：$ cat test01.csv | ijconsole filter01.ijs10,11,1213,14,15資料型別.J語言支援三種簡單型別：其中數值有很多變種。J語言提供的唯一搜集型別，是任意維度的陣列。多數演算法可以使用這些陣列來簡潔的表達。數值.J語言的數值型別之一是“位”。位有兩個值：codice_61和codice_62。位還可以形成列表，例如codice_63，是8個位的列表。在語法上，J分析器將位當作一個字。空格字元被識別為字形成字元，它處在屬於其他數值字的字元之間。J語言支援任意長度的列表。J語言進一步的在這些位列表之上，支援所有常見二元運算，比如動詞codice_64“與”等。J語言還支援位的二維、三維等陣列。上面的運算同樣執行在這些陣列之上。其他數值型別包括整數。同位一樣，它們可以形成列表或任意維度的陣列。同位的情況一樣，運算可以在一個陣列的所有數值之上。下面例子展示π的前50位，超出了IEEE 754雙精度浮點數的53位二進位制尾數能精確表示的最大範圍，這就要用到J語言的擴充套件精度整數：0j15 ": o. 1 NB. π在雙精度浮點數下精確值的位數3.141592653589793)len=:list=:in=:clear=:copy=:destroy=: codestroycocurrent 'base'在家目錄中建立一個codice_449檔案並錄入上述程式碼，接著以如下程式碼建立字典物件並對其進行檢視和簡單操作：load '~/dict.ijs'conl 0 NB. 檢視命名語境│Dict│base│j│jcompare│jregex│jtask│z│namelist_Dict_ 3 NB. 檢視Dict類的動詞│clear│copy│create│default│del│destroy│filt│get│in│len│list│pop│set│d=: create_Dict_ "d NB. 變數儲存的是盒裝字串│0│namelist__d 0 NB. 檢視d物件的名詞│COCREATOR│DEFAULT│conl 1 NB. 檢視編號語境│0│copath &lt;'0' NB. 檢視編號語境的查詢路徑│Dict│z│set__d 'i1'(2 3) set__d 'i2'2 3'abc' set__d 'i3'abclen__d "3list__d "│i1│i2│i3│e=: copy__d "get__d 'i2'2 3del__d 'i2'1in__d 'i3'1pop__d 'i3'abcclear__d "1list__e "│i1│i2│i3│