APL、A、J和K之间的区别是什么?

93

数组语言领域虽然很有趣,但也极其令人困惑。选择J、K、APL或A是否有原因?这些选项中似乎没有开源的版本 - 是否有开源版本?我很想拓展我的思路,但我仍然感到困惑。

7个回答

153
这些语言之间的差异相对微小。APL“proper”具有原始符号表示法的优点和缺点。(多年来对符号集进行了一些次要更改,但它们都足够符合原始愿景。)
A +语言是开源的。它与“经典”的APL有很大不同,但在保留大部分核心字符集方面与它们类似。我的感觉是,它没有跟上技术变化的步伐。它是K的前身。
已经远离了独特的APL字符集的数组语言系列中的语言包括J、K和Nial。Nial使用英语单词代替符号,并具有名为Q'Nial的开源解释器。K和J主要依赖符号,但这些符号来自ASCII字符集。然而,在这些语言中可以使用单词代替符号,只需分配定义即可。
自1964年IBM产品中首次出现APL以来,APL系列编程语言一直是专有的。目前,专有的数组语言似乎比开源替代品获得更多支持和更快的新功能演进。我不确定所有竞争对手彼此如何比较,但Dyalog APL肯定一直在积极推广他们实现的语言作为当前技术。APL2000提供Unix、Linux和Windows的产品,包括.Net的VisualAPL(已退役)。MicroAPL Ltd提供APLX(已退役)。
K是一种专用语言,不再单独销售。Kx Systems现在将Kdb+数据库和其Q(查询)语言作为产品进行销售,两者都是用K编写的。这是一个功能强大的专业工具,专门设计用于高速处理流数据。它与原始APL方法有很大区别。Kx Systems的产品价格昂贵,其用户主要从事金融工作。
APL最初是由Ken Iverson构思和主要设计的。在商业应用中全职运用和完善APL之后,他转向任务是制定一份“合理化”的修订版,纠正了多年来他对该语言不满意的方面。这种新的主题被称为J。 J和APL之间的差异在J Software wiki上的一篇论文中概述。一个明显的变化是消除了数组索引语法。然而最大的特点是沉默形式,程序是通过组合函数编写而无需参考其参数。沉默的J与函数式编程语言中找到的“无点”风格密切相关,但不同之处在于这种形式对J语言是基本的。J使用基于ASCII的符号可能比更独特的APL字符更难读取。
对于想学习数组语言的个人,我的建议是从Dyalog APL、APLX、J和Q'Nial中选择。Dyalog APL(尤其是Windows版)或APLX(尤其是Linux版)可能更适合那些想要使用与APL独特符号相关的核心符号,并希望与整个APL社区保持紧密联系的人。J可能更适合那些想要构建Web应用程序或专注于数学(如Project Euler)的人,尤其是那些着迷于它强调的隐式风格的人。如果我的重点是开源,则我会选择Q'Nial,但前提是这种优先级不意味着期望得到活跃的操作系统社区的支持。

更新:J 7.01已经以GPL 3的开源代码形式发布。此外还有K的变种Kona。这些增加了开源数组语言的选项。

Tobia的更新:GNU APL可以在GPL下使用。它紧密遵循最新发布的扩展APL语言的ISO标准。这是一个非常好的开源APL实现,正在积极开发和维护。还有其他有趣的实现,例如用CoffeeScript编写(可以编译为JavaScript)的ngn/APL,它具有令人惊讶的丰富功能和现代化特性。2015年,数组语言依然活跃。

Adám的更新:J的主要实现者和设计师之一Roger Hui已经加入Dyalog,并在他的指导下,Dyalog APL添加了许多J灵感的功能。这包括一种点字式函数编程风格和多个运算符和函数,其中许多已经在过程中得到改进。Dyalog APL现在可供非商业使用免费。此外,出现了几个新的APL实现;请参见aplwiki.com。2020年,数组语言依然活跃。


4
有时候+1并不足够:谢谢你,kaleidic! - blinry
1
最近,Dyalog也推出了Mac OSX版本 - http://www.dyalog.com/dyalog/mac-os.htm - firesofmay
1
如果你想要另一个开源的APL,ngn-apl也可以。不过,它没有tradfns(用括起来的那些)。 - Adalynn

16

需要考虑的是运算符(高阶函数)的词汇。

原始APL仅具有最后和第一轴缩减(fold)(f/f⌿),最后和第一轴累积缩减(f\f⍀),以及内部和外部乘积(f.g∘.g)。

大多数扩展的APL(例如GNU APL, APLX, APL+Win, APL2)仅添加了each循环()和轴括号规范(f[...])。 J增加了大量内容(称为副词和连词),但删除了括号(轴和索引都有),each操作符(代之以更普遍的rank操作符)和最后一个轴(累积)约简。

现已停用的Sharp APL(后来是SAX)保留了传统的最后轴操作符和括号索引,同时添加了许多J的新操作符。

Dyalog APL正在逐渐接近Sharp APL的词汇表,但也并入了J专有的操作符,这些操作符从未进入过Sharp APL。

下表比较了J、Sharp APL和Dyalog APL 组合词汇表。带有淡色文本的条目需要两个符号才能生效。带有灰色背景的条目正在提出中。 J、Sharp APL和Dyalog APL组合


14

要添加更多信息...

K有一个开源版本称为Kona,可在https://github.com/kevinlawler/kona上找到。

对于q/kdb+,有一个试用版可用。 http://kx.com/download/

主要限制是2小时超时,32位内存,3个月的许可证期限以及许可证本身。如果您只想玩耍和学习一些东西,这些限制可能不会太麻烦。

就个人而言,我发现q最易于使用,因为KX将单参数动词从K翻译成英语单词,而且在http://code.kx.com上有大量文档。此外,数据库系统非常完善和灵活。


3
您可能还想提到 oKngn/k 和 Shakti K。 - Adám

3

ELI是一种新开发的、免费提供的、跨平台的数组编程语言。类似于J和k,它依赖于ASCII字符集。它实现了一些在k/q/kdb+中独特的功能,比如时间数据类型和内置SQL子集。


3
J是一种可执行的数学符号,使用ascii字符输入和显示。它也是一个完整的功能性、面向对象的编程语言。JSoftware实现的J(我不知道其他的)不是开源的,但是可以免费使用。虽然引擎不是开源的,但有一个活跃的用户J代码库,人们可以做出贡献。J有广泛而简洁的文档http://www.jsoftware.com/help.htm,论坛成员乐于并迅速回答任何问题或问题,并热衷于帮助新用户定位以及更高级的问题。顺便说一下,在开放源代码问题上,J的文档(规范)是广泛的,如果他们想要的话,任何人理论上都可以创建一个开源项目来尝试实现J。

6
最新版本已经将J语言源代码发布在GPL3许可证下。http://www.jsoftware.com/source.htm - jpjacobs

3

虽然 A+ 项目(不幸地)看起来已经停止了,但是有一个新的开源 APL 解释器:GNU APL


2

我也感到困惑(APL总是令我困惑 - 幸运的是,距离我最后一次尝试它已经过去了20年或更长时间),但是一些搜索找到了A+,这是一个开源版本的A:

我不知道它是否能满足你(或任何人)的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接