“J语言:天才和精神错乱之间的细微差别”(2012)

2020-08-17 21:14:42

我多年来一直在寻找一家像样的TSDB。我试着用HDF5用Lush写了一个(就像其他人一样),但我做的实验提出的问题比我得到的答案多得多。我相信这是可以做到的;我也相信这将是一种妥协,会带来无尽的痛苦。由于很多人都在使用Q/KDB+来存储订单簿和计时数据,我想我应该看看APL语言家族,以防在其他地方也可以使用同样的技巧。我以前玩过Q;它相当不错,而且APL-ness不会吓到我。任何玩弄过函数式编程的人都可以在Q中做事情。问题是,在这个阶段,价格对我来说并不合适。

我看的第一个APL是A+,完全是偶然的,因为我正在为Taki写一些有趣的东西,写在一些自以为是、自称同名的笨蛋身上。A+是一种古老的语言,显然在摩根士丹利仍在使用。它似乎是老式的APL,使用了古怪的字符集和所有东西。这个古怪的字符集有些话要说,但我不想记住击键或处理奇怪的字体,所以我很快就离开了。

我查看的第二个是Kona,它是K3语言的副本(Kx系统KDB+所基于的东西的早期版本;它们现在升级到了K4)。这方面的C源代码非常漂亮,而且非常简洁。去看看吧!即使你不了解正在发生的事情,阅读他的消息来源也会让你成为一个更好的人。我希望它能内置一些小玩意,我可以把在K3中做的工作回收到K4/Q/Kdb+中,但现在还没有。

一位聪明的老期货交易员(他从穿孔卡时代开始就一直在使用老式的APL)告诉了我J和JDB的情况。J是K的祖先,现在是J7。JDB是用J编写的列式数据库;几乎是KDB+的免费版本。我期待着通常的死亡语言体验,但却发现了一个由非常聪明的人组成的友好而耐心的小社区。不是你在Lispland中能找到的编程灵巧和灵巧的混合体。这些家伙数学聪明,统计聪明,编程聪明,而且非常聪明!我想编写看起来像线路噪音的代码意味着,你必须要聪明。他们也非常有帮助。我的意思是,我问了一个相当n00b的问题,并得到了这个回应。他们不仅仅是给我一个死记硬背的答案;他们不在乎我是否理解正在发生的事情,以及正确的做法是什么。没有锡纸头盔-涉及到真正的单向主义。这些家伙有一个很好的工具;如果你感兴趣,他们会告诉你如何使用它。如果你不是,嗯,那也没关系。他们看起来当然很有幽默感;自嘲是许多程序员社区飞驰的自恋的一个很好的突破。

社区很重要。生态系统更重要。我在那里发现了什么?我首先注意到的是安装包;它是一个共享归档文件。这让我皱起了眉毛:老派。我发现的第二件事是,在最新版本的J中,我不能以一种简单的方式使用我心爱的emacs(你可以在最新版本中使用)。另一方面,他们编写了一个非常好的交互式开发环境;jgtk;它拥有所有的标准旋钮和蜂鸣器;类似CPAN的包安装程序、调试器、源码控制钩子、控制台、项目管理器等等。它们还包括一个在浏览器中运行J Things的优秀工具(JHS)。你为什么要这么做?好的,来看看它链接的一些优秀的教程、维基示例和实验室中的示例。我的第一印象是,浏览器和GTK IDE都非常好。我还不习惯它们,但它们是经过深思熟虑的。大多数这样的东西都是草率地拼凑在一起的,在最初的检查中有明显的缺陷。这个没有明显的瑕疵。

为什么没有大的缺陷呢?我猜是因为这是一种需要注意和专注的语言。每个字都有很多含义。一行J几乎可以代替一页其他的东西。在任何其他语言中,你的大脑不会有一半的时间在工作;实例化事情,让迭代器运行,构建脑死亡切换语句,处理荒谬的函数调用开销或声明,编写愚蠢的助手模式,这些模式是你以前做过100次的事情的微小变体。对于J,你必须时刻注意。这门语言的线条噪音会让你思考得更清楚。我希望它还能提高您的工作效率;我认为一天一页代码是相当大的输出量;一页J会做很多有用的工作。

语言:我还不是很懂,所以我不能说什么太聪明的话。假设您的数据适合数组,它绝对是一种面向数据的语言。它为不是数组的对象设置了装箱单元格。因为它是一种数组语言,所以它有内置的稀疏数组,这对严肃的数值工作有很大帮助。当您需要这类东西时,它还可以使用名称空间执行OO类型的事情。“列表”是矢量,t

我想它省去了一些打字的时间,而且你确实习惯了,但这真的很奇怪。我假设这是历史上的东西,直接编程IBM360寄存器或其他东西,就像CDR/Car过去在计算机器上表示物理的东西一样。有很多这样的技巧;如果它们都记录在一个方便的地方,并且有更多的对话选项,那就更好了。

语感:J是金属。它既简单又强大,对于一种解释型语言来说,它感觉非常接近硬件。它很小,可以理解肠道,而且大部分看起来都很瘦,而且速度很快。内存管理是malloc/free,数组的引用计数和较小对象的池;它工作得非常好,到目前为止,我还没有让它打嗝或耗尽内存,即使在处理比我笔记本电脑上的内存大得多的数据时也是如此。在R或Lisp中,我非常擅长耗尽内存;我可能最终会在J中找到一种方法来解决这个问题,但到目前为止,还不错。当然,J在处理磁盘上的大量数据方面非常出色,而不需要过多考虑;这是大多数语言都不擅长的。FFI看起来也非常简单,而且它似乎有不错的设施来呼叫外国图书馆。

套餐:有一套很好的套餐。它与CPAN或CRAN相去甚远,但其中包含一些有用的工具,并且可以使用IDE中的软件包安装程序轻松安装它们。其中一个值得注意的是Plot包,它产生的输出与R的输出一样好或更好。下面剧情演示中的示例。我听说剧情包很有用,它被用来作为Q的附属品,而Q缺乏这样的东西。还有其他几个具有不同功能的绘图包,尽管我看不出自己会深入研究它们。

其他有用的东西我已经研究过了,一个很好的分析器(加载‘jpm’),前面提到的data/jdb列数据库,类型/datetime中一个不错的日期/时间类,各种其他数据库接口,一些数学/deoptim中的原始优化例程,用于傅立叶变换的数学/FFTW工具,LAPACK(显然在64位上不受支持),在stats/r中与R交谈的工具,stats/Distrib中的一些基本统计分布,一个lint系统,以及一组优秀的。

我真的会用这个东西来解决有用的问题吗?目前很难说,我现在正享受着它的乐趣。可能会让我留在J-land的潜在杀手应用程序是JDB数据库。我还没有为它开发一个测试脚本来真正地测试它的速度,我也没有一台能够充当自动收报机的大型机器,但早期的实验是令人鼓舞的,这样的事情最终会得到更充分的探索。与自制的HDF5型相比,它可能没有提供任何显著的性能优势,甚至可能在非常大的数据上有缺点。另一方面,大部分艰苦的工作都完成了,这一点很重要。我可能不会去找J来编写新的隐马尔可夫模型(R在这方面有更多的小玩意儿),但我可能会用它来编写一两个卡尔曼滤波器。当然,找到新的方式与R交谈将是强制性的(从R调用J,而不是从R调用J似乎很有用)。如果你对数值或不同的编程范例感兴趣,它值得一看。它能持续这么久是有原因的。真的很遗憾,像Matlab这样的东西最终接管了这个问题空间;APL家族是解决这类问题的更好的解决方案。是的,J有点疯狂,但它是一种很好的疯狂。即使我从来没有用过它,J也是一个迷人的视角,可以看到一群非常聪明的人是如何解决难题的。