J语言

title: 简介.
content: 作为一个阵列编程语言,J非常简洁和强大,在数学和统计学程序设计上十分有效,特别是需要进行矩阵运算的时候。它还被用于极限编程和网络性能分析。  为了避免APL使用特殊的字符而遇到的问题,J只需基本的ASCII字符集,但使用点号codice_1和冒号codice_2作为“屈折”。在分析J的时候,点号codice_1和冒号codice_2只在前导着时是单独的字;在其他情况下,点号和冒号是字形成字符,与紧前字符形成类似双字符组的短字,多数这种“基础”(或“原语”)的J字都充当数学符号,具有用点号或冒号从能获得的基本字符扩展来的含义。还有,很多字符在其他语言中经常是成对的(比如codice_5),在J中被当作单独的字,或者在有屈折的时候,作为多字符字的单字符字根。  如同图灵奖获得者约翰·巴科斯的FP和FL程序语言,J透过它隐式编程的特色,支援函数级编程。不同于支持面向对象编程的多数语言,J灵活的层次名字空间体制(这里所有名字都存在于特定区域中),可以有效的用作基于类和基于实例的面向对象编程二者的框架。  自从2011年三月,J成为了自由和开源软件,采用了GNU通用公共许可证版本3(GPLv3)。人们还可以在商业许可证下利用源代码。
title: 起步示例.
content: J允许无点风格和。因此,它的程序可以非常精简,一些编程者将它称为难以阅读的只写语言。  J的“Hello, World!”程序:  这个hello world的实现反映了J的传统用法,就是把程序录入到J解释器会话中,显示出表达式结果。还可以准备J脚本来作为独立程序来执行。下面是在Linux系统的上的样子:  J的算符没有优先级并且最右先行,codice_6的结果是codice_7。历史上,APL使用codice_8来指示,所以codice_9等价于codice_10。在APL中,除法被表示为数学除号 (),它将减号和冒号一起(在EBCDIC和ASCII二者的纸质文本终端上)。因为ASCII一般不支持设备无关方式的重复打印,并且本身不包括除号,J使用codice_11表示除法,作为一种可视的近似或暗示。(这展示了J记号的某些助忆符特征,和使用ASCII带来的一些困扰。)  定义一个J函数叫做codice_12,计算一列数的平均: 下面是这个函数的测试执行:  codice_13计数在阵列中项目的数目。codice_14合计这个阵列的项目。codice_11将这个合计除以这个总数。上述的codice_12使用一连串的三个动词(codice_14、codice_11和 codice_13)来定义,术语叫“叉子”(fork)。特别是codice_20同于codice_21,这展示了J的一些能力。(这里的V0、V1和V2指示动词而Ny指示一个名词。)  使用codice_12的一些例子:  动词codice_23和codice_24在任何大小的阵列内查找匹配者:  除了使用标准库之外,还可以用包管理器安装插件,例如内存映射文件插件:
title: 数据类型和结构.
content: J支持三种简单类型:  其中数值有很多变种。J的数值类型之一是“位”。有两个位值:codice_25和codice_26。还有,位可以形成列表。例如,codice_27是八个位的列表。在语法上,J分析器将位当作一个字。(空格字符被识别为字形成字符,位于在其他数值字的字符之间。)支持任意长度的列表。  进一步的,J支持在这些列表之上的所有常见二元运算,比如“与”、“或”、“亦或”、“旋转”、“移位”、“非”等。例如:  J还支持位的高阶阵列。它们可以被形成二维、三维等阵列。上面的运算同样的运行在这些阵列之上。  其他数值类型包括整数(比如3, 42)、浮点数(3.14, 8.8e22)、复数(0j1, 2.5j3e88)、扩展精度整数(12345678901234567890x)和(扩展精度)有理分数(1r2, 3r4)。同位一样,它们可以形成列表或任意维度的阵列。同位一样,运算可以在一个阵列的所有数之上。下面表达式展示n位的pi,演示了J的扩展精度的能力:  位的列表可以使用codice_28动词转化成整数。整数可以使用codice_29动词转化为位的列表。  J还支持文字(字符)类型。文字包围在引号之间,比如codice_30或codice_31。文字的列表使用将多个字符放入引号之内的常规约定来支持,比如codice_32。典型的,单独的文字是8-位宽(ASCII),但是J还支持其他文字(Unicode)。不支持在文字上的数值和布尔运算,但支持面向集合的运算(比如旋转)。  最后,有一种盒装数据类型。典型的,数据使用codice_33运算来放置入盒子中(没有左侧参数,如果有左侧参数就是“小于”运算)。这类似于C的codice_34运算(没有左侧参数)。但是,C语言的codice_34的结果拥有引用语义,而J的codice_33结果拥有值的语义。换句话说,codice_33是一个函数并产生一个结果。这个结果是0维度的,不管包含怎样的数据的结构。从J编程者的角度看,codice_33将数据放置到一个盒子中,并允许有效使用盒子的列表(它可以用其他盒子来组装,和/或制作盒子的更多副本)。  J提供的唯一集合(collection)类型是任意维度的阵列。多数算法可以使用这些阵列来简洁的表达。  J的阵列是有同质的类型,例如列表codice_39是整数的列表,尽管codice_26可以是一个位。在极大程度上,这种的类型问题对于编程者是透明的。只有特定的特殊运算显露出在类型上的不同。例如,列表codice_41,对大多数运算,将被当作是完全同于列表codice_42。  J还支持数值稀疏阵列,这里用它们的下标存储非零数值。这在非零数值相对很少的情况下是有效率的机制。  J还支持对象和类,但是它们是事物命名方式的人工制品,而非数据类型。实际上,使用盒装文字来提及对象(和类)。J数据有值语义,但是对象和类需要引用语义。  另一个伪类型,关联于名字而非数值,是内存映射文件。
title: 动词和修饰词.
content: 一个程序或例程,有时接受数据作为输入并产生数据作为输出,被称为“动词”,与之相对,数据参数被称为“名词”。J有一组丰富的预定义的动词,它们都自动的起作用于多种数据类型之上。用户的程序可以命名,并可以用在任何允许使用原语的地方。  秩是J中的决定性概念。它在J中的重要性类似于SQL中的codice_43和C语言中的codice_44的重要性。  J的能力很大程度上来自它的“修饰词”,这个范畴包括“副词”和“连词”:这些符号接受名词和动词作为操作者(operand),并以指定方式应用这些操作者。例如,修饰词codice_8接受位于它左侧的一个操作者,并产生应用这个动词在它的参数的每个项目之间的一个动词。就是说,codice_14是一个动词,定义为应用codice_47在你的参数的项目之间。  在J中孤立的动词序列叫做“列车”(train),J支持叫作“叉子”(fork)和“钩子”(hook)的不可见连词,它们规定了如何将参数或应用成员动词于参数的结果提供给成员动词来应用的规则。  J有大约两打各种修饰词。它们都可以应用到任何动词,甚至是用户写的动词,用户可以写自己的修饰词。修饰词都是各有各的能力的: 利用上各种修饰词能产生实际编程所需要的运算操作的无限多种变体。  在上表中,codice_57,codice_58,codice_59,在上四种复合的实际运作机制及其异同详见图示。下面是四种复合及结果值扩充的示意例子:
title: 文档.
content: J的文档包括于NuVoc中,在J中的字被识别为名词、动词、修饰词(副词和连词)、系词、标点符号、控制字。主要的字列于“J原语”中,其中使用颜色标示出它们分别的词类。早期的文档还有入门和字典。注意动词有两种形式:一元(参数只在右侧)和二元(参数在左右两侧)。例如,在codice_60中横杠是一元动词,而在codice_61中横杠是二元动词。一元定义很大程度上独立于二元定义,不管这个动词是原语动词还是派生动词。
title: 最基本词汇.
content: 下表最基本词汇含义中如果用了间隔号( · )分隔,通常前面是一元含义(只有一个右侧参数),后者是二元含义(左右两侧都有参数)。
title: 控制结构.
content: J提供了类似其他过程语言的控制结构,可用在显式定义之中。每个范畴内的代表性控制字包括:
title: 例子程序.
title: 快速排序.
content: 实现升序快速排序,代码来自J字典:  下面是展示隐式编程的快速排序的实现。它涉及到将函数复合在一起而不显式的引用任何变量。  在J中排序通常使用内建原语动词codice_62升序或codice_63降序与codice_64选取来一起完成。上面的用户定义的排序比如快速排序,典型的只用作演示。 用例:
title: 斐波那契数列.
content: 下面是演示使用自引用动词codice_65来递归的计算斐波那契数列的例子:  fibonacci=:1:`($:@-&2+$:@<:)@.(>&2) 注意这里的codice_66是常量动词,这个递归还可以通过用名字引用动词来完成,当然这只在动词有命名的时候是可行的:  fibonacci=:1:`(fibonacci@-&2+fibonacci@<:)@.(>&2)  用例:
title: 内存映射文件.
content: 将J中的变量映射到文件系统中的持久文件:  load 'data/jmf' NB. 加载插件 ] V =: 2 2 $ 1 2 3 4 NB. 测试用阵列数值 S =: 64000 NB. 文件大小(字节) F =: '~/persis.jmf' NB. 文件路径及名字 createjmf_jmf_ F;S NB. 建立并打开持久文件 map_jmf_ 'P'; F NB. 映射变量至持久文件 P =: V NB. 将测试内容赋值到P unmap_jmf_ 'P' NB. 解除映射并关闭文件 map_jmf_ 'Q' ; F NB. 再次建立映射 ] Q NB. 查看持久文件保存内容 unmap_jmf_ 'Q' NB. 再次解除映射
title: 调试.
content: J拥有常规设施可以停止在动词内错误或特定位置上。它还有一个唯一的可视调试器,叫做Dissect,给出一个单一的J句子执行的2-D交互显示。因为J的一个单一句子在低层语言中是作为一个完整的子例程进行计算的,这个可视显示非常有用。

Summary: J编程语言,是肯尼斯·艾佛森和于1990年代初发明的一种阵列编程语言,是APL语言(亦是由图灵奖获得者艾佛森所创)的继承者。

J (Programmiersprache): J ist eine rein funktionale Programmiersprache, welche Anfang der 1990er Jahre von Kenneth E. Iverson und Roger Hui entwickelt wurde. Sie basiert direkt auf der von Iverson entwickelten Programmiersprache APL und den von John W. Backus entworfenen Programmiersprachen FP und FL.