代码之家  ›  专栏  ›  技术社区  ›  ozan

有人建议学习J/K/APL吗?[关闭]

  •  44
  • ozan  · 技术社区  · 15 年前

    几个月前,我在通过一些 project euler 至少可以说,是有问题的,而且很有趣。对于我生产的每一个优雅的20行python解决方案,都会有一个令人惊叹的20行 性格 在十分之一时间内运行的J解决方案。我一直热衷于学习一些基本的J语言,并尝试了几次学习词汇,但发现学习曲线相当陡峭。

    对于那些熟悉这些语言的人,你会建议花些时间学习一种语言吗(我特别认为是J语言)?为了满足我的好奇心,我会做更多的事情,而不是为了职业发展或诸如此类的事情。

    如果您愿意,可以考虑一些个人情况:

    • 我喜欢数学,每天都在我的工作中使用它(作为一个初创公司的数学家),但老实说,我并不觉得我使用的工具有限(比如python+numpy),所以我不能使用这个借口。
    • 我对在金融行业工作没有特别的兴趣,金融行业似乎至少是K用户的主要工作场所。另外,我真的应该把C语言作为下一种语言来学习,因为它是我工作的主要语言。实际上,J几乎肯定 不应该 成为我学习的下一种语言。
    • 我相当熟悉Matlab,因此使用基于数组的编程语言不会构成巨大的范式转换。

    任何来自熟悉这些语言的人的建议都将非常感谢。

    10 回复  |  直到 7 年前
        1
  •  54
  •   S.Lott    15 年前

    数千年前,我是一名APL程序员。我的意思是,在70年代,自定义字符集意味着我们有带APL键盘和字符集的特殊打印终端,以及带特殊字符的IBM Selectric字体球等等。

    我去听了肯·艾弗森的讲座,讲的是“为什么APL很酷”。

    他的论文就是这样。从前,长时间的除法是一项严肃的数学任务,专为研究生准备。像重复十进制展开这样的符号包含了大量的数学符号。从前,即使是像“负数”这样的数字也需要详细的符号。

    多年来,随着我们对这些抽象概念的更好理解,我们为复杂概念提出了更紧凑的符号。

    APL(以及J和K)的要点是将大的算法归纳为整齐的符号。

    现在,我是一个Python程序员。我发现我早期接触APL使我的大脑扭曲,强迫我问“这是什么意思?”“这是一个可重用的操作吗?”对于所有这些算法上的错误,有什么简单的总结呢?

    同样,当我追求 Project Euler 在我的“关于APL的杜松子酒式回忆”的支持下,python的“函数式编程Lite”的问题对于解决这些练习都非常有帮助。

        2
  •  17
  •   Micha Wiedenmann Lieven Keersmaekers    7 年前

    J是我在ProjectEuler和工作中个人使用的主要编程语言。我从来没有遇到过一种更好的数组处理语言,一旦你掌握了它的窍门,隐性编程范式既有用又发人深省。(事实上,这很有用,因为它是发人深省的。)在语言中达到入门级的能力是困难的,而阅读他人的代码是一种在智力上有纪律的活动,但是由于语言的力量、灵活性和简洁性,毅力有很大的回报。

    也就是说,我为什么保留它 个人的 在工作中的用法是:(1)工作中没有其他人使用它,(2)学习曲线足够陡,以至于我不合理地要求我的同事拿起它,(3)您可以在一行代码中构建复杂的程序这一事实使阅读一行代码变得困难,尤其是如果您没有自己编写它。(我希望至少花半个小时研究一行使用10个或更多运算符的代码,除非它们的使用方式使我完全了解基本原则。)

    一些有趣的J功能示例:

    1)任何定义为对单个数字进行运算的函数都可以在任意秩的数组上进行运算。例如:

    NB. totient(n) = n * \prod_{p|n} (1 - 1/p)
    totient=: * -.@%@~.&.q:
    
    NB. Finding the totient of 10
    totient 10
    
    NB. Finding the totient of all numbers from 1 to 10
    totient"0 (1+i.10)
    

    它的功能完全相同,只对1XN输入阵列的原子(单元素组件)进行操作。类似地,您可以获取一个定义为处理秩2数组(矩阵)的函数,并仅通过使用“(rank)连词将其应用于更高秩的任何数组。

    2)你可以在j中取任何理论上可逆的函数,然后通过“向后迭代”将其反转。例如,

    NB. Converts an array of binary digits to a decimal number
    (#.) 1 0 1
    5
    
    NB. Converts a decimal number to an array of binary digits
    (#.^:_1) 5
    1 0 1
    
        3
  •  16
  •   Duncan    15 年前

    在过去的25年中,我在J和APL工作了大部分时间,我可以完全推荐两者。当我恢复到原来的状态时 任何 要做的即席数据分析的形式,我也在ProjectEuler中使用过它。

    如果您对ProjectEuler感兴趣,那么J绝对是您要选择的对象。它对无限精度整数和素数的支持使它非常适合。

        4
  •  13
  •   KaiJaeger    15 年前

    我从1980年开始和APL一起生活。我期待在未来的几年里继续这样做。使用APL不仅很有趣,而且该语言提供了出色的调试功能。现代实现是成熟的功能语言,也是面向对象的。

    这些年来,我遇到了很多人,问我能继续使用APL多久。他们是dbase和pl/1,algol和pascal,forth和c,focus以及其他程序员。知道了?!

        5
  •  12
  •   MPelletier    14 年前

    J有点像精灵:它需要放在瓶子里。在J中维护大量的批处理软件是一个严重的痛苦。在J中维护接口(基于Windows或Web,因为是的,可以设置J来响应Apache以生成Web输出)是一个实验性的、鲜为人知的地狱圈。

    另一方面,如果你愿意,使用J是很好的:解析、筛选、分析、压缩等一些数据来处理它,计算出算法的细微差别,或者打动 互联网 用最短的方法来计算一个圆中有多少三角形适合或不适合。

    我很快就要在我的职业介绍中加入J作为交易破坏者了。 careers.stackoverflow.com 但我最终还是放弃了。对我来说,使用J是很好的,但是产生J却不是。

    编辑:

    那是很久以前的事了。我仍然认为在生产中完整的J解决方案很糟糕(也就是说,所有的MVC)。从最初的反应开始,我在一个C项目中使用J作为COM,在这个项目中,J提供了一个大型矩阵,在C中管理起来很难,非常满意。

    我们工作的一部分是制作数据模型和代码 说话 .很难将这种质量和J非常简洁的语法连接起来。与J不同的是,一些框架可以轻松地使用IDE,并且有足够的支持,可以让一个框架以人性化的方式安排代码。J的误码率矩阵能力不能弥补它所缺少的。

        6
  •  9
  •   Inisheer    15 年前

    我认为你的3分表明你不需要学J。但是,我不认为任何情况下学习一门新语言是有害的。

    花时间学习你感兴趣的东西(或任何新语言)总是能提高你的其他编程技能。您可以学习不同的解决问题的方法,这些方法可以用其他语言实现。

    另外,使用J的最小语法,在用另一种语言实现解决方案时,确保获得正确的结果将是一种很好的语言。

        7
  •  8
  •   pkw    15 年前

    回到埃尔达时代,我是一个APL语言开发人员,用370汇编程序编码。我把J移植到了OS2上,但从未学会如何将其用于实际工作。我目前在Java和PHP中工作,正在评估Python。在Python教程的前3节之后,我被它与APL的许多相似之处所震惊,这些相似之处把我带到了这里。

    我强烈推荐学习APL或J作为智力练习。它将改变您对编程的思考方式(扭曲您的大脑),并可能帮助您编写Python代码。此外,对于APL和J程序员来说,还有一些工作,而且可能比Jobs少一些程序员。

        8
  •  7
  •   JonnyBoats    15 年前

    早在20世纪70年代,我就曾做过几年的APL程序员,我喜欢这种语言,但多年来没有使用过。

    对于某些事情来说,它是一种很好的语言,但是我真的不能将它用于Web开发。

    它的主要作用是统计和矩阵运算。您可以用3个字符来解决线性规划问题。证明LP实现的正确性要比用C语言表示页面的实现容易得多。

    所以如果你想为了学习的乐趣而学习它,我说去学吧。为了提高你的工作前景,可能还有很多其他的事情需要学习,这会给潜在的雇主留下更深刻的印象。

        9
  •  6
  •   Mani Sitaraman    12 年前

    对我这个五十多岁的人来说,这是一个有趣的证实。

    今天早些时候,在做了27年的零编程之后,我决定学习一种新的21世纪编程语言。我选择了python,非常随意,害怕我们现在所生活的基于GUI和面向对象的世界。

    令我高兴的是,我在80年代初作为一名APL工作人员谋生的这几年意味着我正在快速浏览这些资料,并立即理解了这一点:)我只是想和大家分享一下。

        10
  •  5
  •   Randy A MacDonald    13 年前

    是的,学习apl/j/k,它将给你一个独特的一瞥,什么是可能的。

    我指出@mpellier的“一个圆中有多少三角形”及其隐含的“……但不是针对现实问题”,有点短视。是的,J软件的IDE缺少一些东西,但是构建自己的IDE不是一个大问题,一个好的IDE可以掩盖一种糟糕的语言(20行到20个字符的收缩率是 打喷嚏。)我一直在做APL,只要@kaijaeger已经,如果不是更长的话,我的思想可能会扭曲,但我从来没有快乐的编程与其他任何东西。

    推荐文章