J语言:修订间差异
小无编辑摘要 |
小 →简介 |
||
第27行: | 第27行: | ||
==简介== |
==简介== |
||
作為一個[[陣列編程]]語言,J非常簡潔和強大,在[[數學]]和[[统计学]]程式設計上十分有效,特別是需要进行[[矩陣]]运算的时候。它还被用于[[极限编程]]<ref>{{Citation |contribution= Software Development as a Collaborative Writing Project |series= Extreme programming and agile processes in software engineering |place= Oulu, Finland |year= 2006 |first1= Brian |last1= Bussell |first2= Stephen |last2= Taylor |pages= 21–31 |publisher= [[Springer Science+Business Media|Springer]] |isbn= 978-3-540-35094-1}}</ref>,[[网络性能]]分析<ref>{{Citation |first= Alan |last= Holt |title= Network Performance Analysis: Using the J Programming Language |isbn= 978-1-84628-822-7 |year= 2007 |publisher= [[Springer Science+Business Media|Springer]]}}</ref>。 |
|||
⚫ | |||
⚫ | 為了避免APL使用特別的字集而遇到的問題,J只需基本的[[ASCII]]字集,凭借使用点号和冒号作为“[[词形变化|曲折]]”<ref>[http://code.jsoftware.com/wiki/Vocabulary/Words J NuVoc Words]</ref>,来形成类似[[三字符组与双字符组|双字符组]]的短字。多数这种“基础”(或“原语”)的J字都充当数学符号,具有用点号或分号从能获得的基本字符扩展来的含义。还有,很多字符在其他语言中经常是成对的(比如<code>[] {} "" `` <></code>),在J中被当作单独的字,或者在有曲折的时候,作为多字符字的单字符[[词根|字根]]。 |
||
如同[[約翰·巴科斯]]的[[FP (编程语言)|FP]]、[[FL (编程语言)|FL]]]程式語言,J透過它[[隱式編程]]的特色,支援[[函數級編程]]。不同于支持面向对象编程的多数语言,J灵活的层次名字空间体制(这里所有名字都存在于特定区域中),可以有效的用作基于类和基于实例的面向对象编程二者的框架。 |
如同[[約翰·巴科斯]]的[[FP (编程语言)|FP]]、[[FL (编程语言)|FL]]]程式語言,J透過它[[隱式編程]]的特色,支援[[函數級編程]]。不同于支持面向对象编程的多数语言,J灵活的层次名字空间体制(这里所有名字都存在于特定区域中),可以有效的用作基于类和基于实例的面向对象编程二者的框架。 |
2020年5月18日 (一) 10:01的版本
编程范型 | 阵列、函数式、函数级、隐式 |
---|---|
設計者 | Kenneth E. Iverson、許國華 |
實作者 | JSoftware |
发行时间 | 1990年 |
当前版本 |
|
型態系統 | 类型系统 |
操作系统 | 跨平台: Windows, Linux, macOS |
許可證 | GPLv3 |
網站 | www |
主要實作產品 | |
J | |
啟發語言 | |
APL | |
影響語言 | |
NumPy[2],SuperCollider[3] |
J编程语言,是肯尼斯·艾佛森和許國華於1990年代初發明的一种程序设计语言[5][6],是APL語言(亦是由图灵奖获得者艾佛森所創)的繼承者。
简介
作為一個陣列編程語言,J非常簡潔和強大,在數學和统计学程式設計上十分有效,特別是需要进行矩陣运算的时候。它还被用于极限编程[7],网络性能分析[8]。
為了避免APL使用特別的字集而遇到的問題,J只需基本的ASCII字集,凭借使用点号和冒号作为“曲折”[9],来形成类似双字符组的短字。多数这种“基础”(或“原语”)的J字都充当数学符号,具有用点号或分号从能获得的基本字符扩展来的含义。还有,很多字符在其他语言中经常是成对的(比如[] {} "" `` <>
),在J中被当作单独的字,或者在有曲折的时候,作为多字符字的单字符字根。
如同約翰·巴科斯的FP、FL]程式語言,J透過它隱式編程的特色,支援函數級編程。不同于支持面向对象编程的多数语言,J灵活的层次名字空间体制(这里所有名字都存在于特定区域中),可以有效的用作基于类和基于实例的面向对象编程二者的框架。
自从2011年三月,J成为了自由和开源软件,采用了GNU通用公共许可证版本3(GPLv3)[10][11][12]。人们还可以在协商许可证下获得源代码[13]。
例子
J允许无点风格和函数复合。因此,它的程序可以非常精简,一些编程者将它称为难以阅读的只写语言。
J的“Hello, World!”程序
'Hello, world!'
这个hello world的实现反映了J的传统用法,就是把程序录入到J解释器会话中,显示出表达式结果。还可以准备J脚本来作为独立程序来执行。下面是在Unix系统的上的样子:
#!/bin/ijconsole
echo 'Hello, world!'
exit ''
历史上,APL使用/
来指示fold,所以+/1 2 3
等价于1+2+3
。同时,除法被表示为数学除号 (÷
),它在将减号和冒号一起重复打印(在EBCDIC和ASCII二者的纸质文本终端上)。因为ASCII一般不支持设备无关方式的重复打印,并且本身不包括除号,J使用%
表示除法,作为一种可视的近似或暗示。(这展示了J记号的某些助忆符特征,和使用ASCII带来的一些困扰。)
定义一个J函数叫做avg
,计算一列数的平均:
avg=: +/ % #
下面是这个函数的测试执行:
avg 1 2 3 4
2.5
#
计数在阵列中项目的数目。 +/
合计这个阵列的项目。 %
将这个合计除以这个总数。上述的avg
使用一连串的三个动词(+/
、%
和 #
)来定义,术语叫“fork”。特别是(V0 V1 V2) Ny
同于(V0(Ny)) V1 (V2(Ny))
,这展示了J的一些能力。(这里的V0、V1和V2指示动词而Ny指示一个名词。)
使用avg
的一些例子:
v=: ?. 20 $100
NB. 一个随机向量v
46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62avg v
59.2
4 avg\ v
NB. 周期大小为4的移动平均
58 60 56 51.25 52.5 54 67.75 64.25 69.5 57.75 38.75 40 43.5 59.75 70.25 80 72.5
m=: ?. 4 5 $50
NB. 一个随机矩阵m
46 5 29 2 4 39 10 7 10 44 46 28 13 18 1 42 28 10 40 12
avg"1 m
NB. 应用avg于m的每个阶1的子阵列
17.2 22 21.2 26.4
阶是J中的决定性概念。它在J中的重要性类似于SQL中的select
和C语言中的while
的重要性。
实现快速排序,来自J字典:
sel=: adverb def 'u # ['
quicksort=: verb define
if. 1 >: #y do. y
else.
(quicksort y <sel e),(y =sel e),quicksort y >sel e=.y{~?#y
end.
)
下面是展示隐式编程的快速排序的实现。它涉及到将函数复合在一起而不显式的引用任何变量。J支持“fork”和“hook”口述(dicate)规则,规定应用到这个函数的参数如何应用到它的成员函数之上。
quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)
在J中排序通常使用内建(原语)动词/:
(sort up)和\:
(sort down)来完成。上面的用户定义的排序比如快速排序,典型的只用作演示。
下面是演示使用自引用动词$:
来递归的计算斐波那契数的例子:
1:`($:@-&2+$:@<:)@.(>&2)
这个递归还可以通过用名字引用动词来完成,当然这只在动词有命名的时候是可行的:
fibonacci=:1:`(fibonacci@-&2+fibonacci@<:)@.(>&2)
下面表达式展示n位的pi,演示了J的扩展精度的能力:
n=: 50
NB. 设置n为要求的数字书目<.@o. 10x^n
NB. 扩展精度10到第n位 * pi 314159265358979323846264338327950288419716939937510
动词和修饰词
一个程序或例程,有时接受数据作为输入并产生数据作为输出,被称为“动词”。J有一组丰富的预定义的动词,它们都自动的起作用于多种数据类型之上:例如,动词i.在任何大小的数组内查找匹配者:
3 1 4 1 5 9 i. 3 1 NB. 找到3和1的第一次出现的索引
0 1
3 1 4 1 5 9 i: 3 1 NB. 找到3和1的最后一次出现的索引
0 3
用户程序可以命名,并允许在其中任何地方使用原语。
J的能力很大程度上来自它的“修饰词”:接受名词和动词作为操作者(operand),并以指定方式应用操作者的符号。例如,修饰词/接受位于它左侧的一个操作者,并产生应用这个动词在它的参数的每个项目之间的一个动词。就是说,+/是一个动词,定义为应用+在你的参数的项目之间。因此句子
+/ 1 2 3 4 5
产生的效果是
1 + 2 + 3 + 4 + 5
+/ 1 2 3 4 5
15
J有大约两打这种修饰词。它们都可以应用到任何动词,甚至是用户写的动词,用户可以些自己的修饰词。尽管修饰词都是各有各的能力的,允许
- 重复执行,也就是do-while
- 条件执行,也就是if
- 参数的规则或不规则的子集的执行
一些修饰词控制成员的执行次序,允许修饰词以任何次序组合来产生实际编程所需要的无限运算操作变体。
数据类型和结构
J至此三种简单类型:
- 数值
- 文字(字符)
- 盒装
其中数值有很多变种。
J的数值类型之一是“位”。有两个位值:0
和1
。还有,位可以形成列表。例如, 1 0 1 0 1 1 0 0
是八个位的列表。在语法上,J分析器将位当作一个字。(空格字符被识别为字形成字符,位于在其他数值字的字符之间。)支持任意长度的列表。
进一步的,J支持在这些列表之上的所有常见二元运算,比如“与”、“或”、“亦或”、“旋转”、“移位”、“非”等。例如
1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 NB. 或 1 1 0 1 1 0 1 0
3 |. 1 0 1 1 0 0 1 1 1 1 1 NB. 旋转 1 0 0 1 1 1 1 1 1 0 1
J还支持位的高阶阵列。它们可以被形成二维、三维等阵列。上面的运算同样的运行在这些阵列之上。
其他数值类型包括整数(比如3, 42)、浮点数(3.14, 8.8e22)、复数(0j1, 2.5j3e88)、扩展精度整数(12345678901234567890x)和(扩展精度)有理分数(1r2, 3r4)。同位一样,它们可以形成列表或任意维度的阵列。同位一样,运算可以在一个阵列的所有数之上。
位的列表可以使用#.
动词转化成整数。整数可以使用#:
动词转化为位的列表。(在分析J的时候,.
点号和:
冒号是字形成字符。它们从不单独标记,除非前导着空白字符。)
J还支持文字(字符)类型。文字包围在引号之间,比如'a'
或'b'
。文字的列表使用将多个字符放入引号之内的常规约定来支持,比如'abcdefg'
。典型的,单独的文字是8-位宽(ASCII),但是J还支持其他文字(Unicode)。不支持在文字上的数值和布尔运算,但支持面向集合的运算(比如旋转)。
最后,有一种盒装数据类型。典型的,数据使用<
运算来放置入盒子中(没有左侧参数,如果有左侧参数就是“小于”运算)。这类似于C的&
运算(没有左侧参数)。但是,C语言的&
的结果拥有引用语义,而J的<
结果拥有值的语义。换句话说,<
是一个函数并产生一个结果。这个结果是0维度的,不管包含怎样的数据的结构。从J编程者的角度看,<
将数据放置到一个盒子中,并允许用盒子的列表来进行工作(它可以用其他盒子来组装,和/或制作盒子的更多副本)。
<1 0 0 1 0
+---------+
|1 0 0 1 0|
+---------+
J提供的唯一集合(collection)类型是任意维度的阵列。多数算法可以使用这些阵列简洁的表达。
J的阵列是有同质的类型,例如列表 1 2 3
是整数的列表,尽管 1
可以是一个位。在极大程度上,这种的类型问题对于编程者是透明的。只有特定的特殊运算显露出在类型上的不同。例如,列表 1.0 0.0 1.0 0.0
,对大多数运算,将被当作是完全同于列表 1 0 1 0
.
J还支持稀疏数值阵列,这里用它们的下标存储非零数值。这在相对很少数值是非零情况下是有效率的机制。
J还支持对象和类[14],但是它们是事物命名方式的人工制品,而非数据类型。实际上,使用盒装文字来提及对象(和类)。J数据有值语义,但是对象和类需要引用语义。
另一个伪类型,与名字有关,而非数值的,是内存映射文件。
控制结构
J提供了类似其他过程语言的控制结构(详见文档)。每个范畴内的代表性控制字的包括:
assert.
break.
continue.
for.
goto_label.
if. else. elseif.
return.
select. case.
throw.
try. catch.
while. whilst.
文档
J的文档包括字典,在J中的字被识别为名词、动词、修饰词等等。主要的字列于词汇表中,其中使用颜色标示出它们分别的词类。注意动词有两种形式:一元(参数只在右侧)和二元(参数在左右两侧)。例如,在-1
中横杠是一元动词,而在3-2
中横杠是二元动词。一元定义很大程度上独立于二元定义,不管这个动词是原语动词还是派生动词。
调试
J拥有常规设施可以停止在动词内错误或特定位置上。它还有一个唯一的可视调试器,叫做Dissect,给出一个单一的J句子执行的2-D交互显示。因为J的一个单一句子在低层语言中是作为一个完整的子例程进行计算的,这个可视显示非常有用。
引用
- ^ https://code.jsoftware.com/wiki/System/ReleaseNotes/J9.5.
- ^ Wes McKinney at 2012 meeting Python for Data Analysis
- ^ SuperCollider documentation, Adverbs for Binary Operators
- ^ J901 release 15 December 2019.
- ^ A Personal View of APL, 1991 essay by K.E. Iverson (archived link)
- ^ Overview of J history by Roger Hui (19 March 2002)
- ^ Bussell, Brian; Taylor, Stephen, Software Development as a Collaborative Writing Project, Extreme programming and agile processes in software engineering, Oulu, Finland: Springer: 21–31, 2006, ISBN 978-3-540-35094-1 缺少或
|title=
为空 (帮助) - ^ Holt, Alan, Network Performance Analysis: Using the J Programming Language, Springer, 2007, ISBN 978-1-84628-822-7
- ^ J NuVoc Words
- ^ Jsoftware's source download page
- ^ Eric Iverson. J Source GPL. J programming mailing list. 1 March 2011.
- ^ GitHub上的openj
- ^ Jsoftware's sourcing policy
- ^ Chapter 25: Object-Oriented Programming
外部連結
- JSoftware,J的官方網站
- Cliff Reiter Chaos, fractals and mathematical symmetries... in J
- Ewart Shaw Bayesian inference, medical statistics, and numerical methods, using J
- Keith Smillie,陣列程式語言的統計學工具,尤其是J
- John Howland Research on parallelization of array programming languages, especially J
- 郭平欣教授之J語言初步
- 郭平欣教授之J字典
|