编程语言-有人会建议学习J / K / APL吗?
几个月前,我在解决一些项目欧拉问题时遇到了J / K / APL,至少可以说对此很感兴趣。 对于我生产的每一个外观精美的20行python解决方案,都会有十分之一的时间出现一个让人讨厌的20个字符的J解决方案。 我一直热衷于学习一些基本的J,并且尝试了一些词汇学习,但是发现学习曲线相当陡峭。
对于那些熟悉这些语言的人,您是否建议您花一些时间学习一种语言(特别是我在考虑J)? 为了满足我的好奇心,我会做更多的事情,而不是为了事业发展或诸如此类的事情。
如果您要注意以下一些个人情况:
我喜欢数学,并且每天在工作中使用数学(作为初学者的数学家),但是老实说,我并没有真正受到使用的工具(例如python + NumPy)的限制,所以我不能使用这种借口 。
我没有在金融行业工作的特别渴望,因为这似乎至少是K用户的主要诉求。 另外,我应该真正学习C#作为下一种语言,因为它是我工作的主要语言。 因此,实际上,J几乎绝对不应该成为我学习的下一门语言。
我对MATLAB很熟悉,因此使用基于数组的编程语言不会构成巨大的范式转变。
熟悉这些语言的人的任何建议将不胜感激。
10个解决方案
54 votes
几千年前,我是APL程序员。 所谓“成千上万”,是指上世纪70年代,自定义字符集意味着我们拥有带有APL键盘和字符集的特殊打印终端,以及带有特殊字符的IBM电动打字机等。
我参加了Ken Iverson的关于“为什么APL很酷”的演讲。
他的论文是这样的。 长期以来,除法是一项严肃的数学任务,仅供研究生使用。 诸如重复十进制扩展之类的符号涉及大量数学符号。 曾几何时,甚至需要诸如“负”数字之类的详尽符号。
多年来-随着我们对这些抽象的更好理解-我们为复杂的概念提出了更为紧凑的表示法。
APL(以及J和K)的重点是将大型算法总结为整齐的符号。
如今,我是一名Python程序员。 我发现我早期接触过APL,迫使我问“这是什么意思?”,这使我的大脑扭曲了。 和“这是可重用的操作吗?” 和“所有这些算法绒毛的精妙总结?”
另外,当我继续进行Euler项目问题时,以我的“ APL浸透的回忆”为后盾的Python的“函数式编程精简版”对解决这些练习都非常有帮助。
S.Lott answered 2020-07-12T19:02:40Z
17 votes
J是我用于Euler项目以及在工作中个人使用的主要编程语言。 我从来没有遇到过用于数组处理的更好的语言,默认的编程范式既有用又发人深省。 (实际上,这很有用,因为它令人发人深省。)要达到入门级语言的能力很困难,阅读别人的代码是一项有知识的纪律活动,但是毅力由于语言的强大,灵活和简洁而获得了重大回报。
就是说,我之所以保留它以供个人使用是因为(1)工作中没有其他人使用它,(2)学习曲线足够陡峭,以至于我要求我的同事捡起它是不合理的 ,以及(3)您可以在一行代码中构建复杂的程序,这使得阅读一行代码非常困难,特别是如果您不是自己编写的话。 (我希望至少花半个小时来研究使用十个或更多运算符的代码行,除非以我能完全理解基本原理的方式来使用它们。)
有趣的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)您可以在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
estanford answered 2020-07-12T19:03:25Z
16 votes
在过去的25年中,我大部分时间都在J和APL工作,可以为您推荐这两者。 当我需要进行任何形式的临时数据分析时,我仍然会选择使用另一种方法,并且我也在Project Euler中使用了它。
如果您对Project Euler感兴趣,那么J绝对是一个不错的选择。 它对无限精度整数和素数的支持使其非常适合。
Duncan answered 2020-07-12T19:03:49Z
13 votes
自1980年以来,我就一直在APL谋生。我希望在以后的几年中继续这样做。 使用APL不仅很有趣,而且该语言还提供了出色的调试功能。 现代的实现是成熟的功能语言,并且也是面向对象的。
这些年来,我遇到了很多人,问我我能继续使用APL多长时间。 那些人是dbase和PL / 1和ALGOL和Pascal和Forth和C和Focus和其他程序员。 得到它了?!
answered 2020-07-12T19:04:14Z
12 votes
J有点像精灵:它需要放在瓶子里。 在J中维护很多批处理软件是一件很痛苦的事情。 在J中维护界面(基于Windows或基于Web,因为是的,您可以设置J来回答Apache以产生Web输出)是一个实验性的,鲜为人知的麻烦。
另一方面,如果您愿意,则使用J可以:解析,筛选,分析,处理等数据,用它来摆弄,找出算法的细粒度或以最短的方式打动互联网 计算一个圆中有多少个三角形,或者什么不适合。
我几乎在我的careers.stackoverflow.com的职业档案中添加J作为交易突破者,但最终我还是把它排除在外了。 对我而言,使用J很好,但是生成J则不行。
编辑:
那是前一段时间。 我仍然对生产中的完整J解决方案(即您的所有MVC)不满意。 自从最初的答复以来,我就在C#项目中将J用作COM,其中为J提供了一个大型矩阵,该矩阵很难用C#进行管理,令人非常满意。
我们的工作之一是使数据模型和代码说话。 要将质量和J的简洁语法联系起来并不容易。 与J不同,一些框架具有易于使用的IDE,并且具有足够的支持以允许它们以人类可读的方式排列代码。 J的über矩阵功能无法弥补其不足。
MPelletier answered 2020-07-12T19:04:57Z
9 votes
我认为您的3点表明您不需要学习J。但是,我认为在任何情况下学习新语言都是有害的。
花时间学习您感兴趣的东西(或任何新语言)总会提高您的其他编程技能。 您将学习解决问题的不同方法,这些方法可以用其他语言来实现。
另外,使用J的最小语法,这是一种很好的语言,可以确保在用另一种语言实现解决方案时获得正确的结果。
Inisheer answered 2020-07-12T19:05:26Z
8 votes
以前,我是APL语言开发人员,使用370汇编程序进行编码。 我将J移植到OS2,但从未学习如何在实际工作中使用它。 我目前正在使用Java和PHP,并且正在评估Python。 在Python教程的前三部分中,我对它与APL的许多相似之处感到震惊,这使我到了这里。
我强烈建议学习APL或J作为一项智力练习。 它将改变您对编程的思考方式(使您的大脑不知所措),并且可能会帮助您进行Python编码。 此外,还有一些针对APL和J程序员的工作,程序员可能比工作少。
answered 2020-07-12T19:05:51Z
7 votes
我曾经在1970年代担任APL程序员几年。 我喜欢这种语言,但是多年没有使用它。
对于某些事情来说,它是一种很棒的语言,但是我真的无法想象将其用于Web开发。
统计和矩阵运算非常有用。 您可以用3个字符解决线性编程问题。 比起以C语言中的页面为例,证明该LP实现的正确性要容易得多。
因此,如果您想为了学习的乐趣而学习它,那我就说吧。 为了提高您的工作前景,很可能还有很多其他的东西要学习,这将给潜在的雇主更多的印象。
JonnyBoats answered 2020-07-12T19:06:25Z
6 votes
这对五十岁左右的我来说是一个有趣的确认。
今天早些时候,我决定隔27年进行一次零编程学习一种新的21世纪编程语言。 我随意选择了Python,担心我们现在生活的基于gui和面向对象的世界。
令我高兴的是,我80年代初期以APL员工的身份谋生的岁月意味着我从字面上浏览内容,并立即理解:)我以为我会分享。
Mani Sitaraman answered 2020-07-12T19:06:54Z
5 votes
是的,学习APL / J / K,它将使您对可能发生的事情有独特的了解。
我指出,@ MPelletier的“一个圆中可以容纳多少个三角形”及其隐含的“ ...但不适用于现实世界中的问题”是有点短视的。 是的,J Software的IDE缺少一些东西,但是构建自己的IDE并不是一个大问题,好的IDE可以掩盖不好的语言(不要嘲笑20到20个字符的缩水。)我一直在做 只要@KaiJaeger拥有APL(如果不是更长的话),我的想法可能就会扭曲,但是我从来不满意使用其他任何东西进行编程。
Randy A MacDonald answered 2020-07-12T19:07:19Z