J/K/APL如何根据共同范例进行分类?

Imp*_*ity 19 language-agnostic paradigms haskell functional-programming j

我刚刚开始学习J,这非常有趣,但我想知道它是什么样的语言,与常见的范例和分类有关.例如,您可以说F#是强类型的,主要是功能性的(它支持OO和过程编程,但它被认为是"功能")语言属于ML族.然而,对于J,我找不到很多关于如何"按常规"对其进行分类,或者在Stackoverflow上找到任何确认它是函数式编程语言的东西.维基百科称它"是一种非常简洁的数组编程语言","支持函数级编程","不是冯·诺依曼编程语言",其中没有一种更有用.

我有一些问题:

  1. J/K/APL属于哪种主要范式(程序性,OO,功能性,逻辑性)?如果他们的范例只是"阵列编程",那么这种范式是什么样的,或者最相似的呢?

  2. 什么知名的编程语言是J/K/APL最相似的?例如,我猜他们就像Lisp,因为它们在数组(列表)上运行,并且具有最小的,没有逗号语法.

我只是想根据我已经知道的东西将这些语言分类.谢谢.

Lev*_*son 16

J与John Backus倡导的函数式编程(有时称为函数级编程,而不是价值级别)有关,他可能更为人所知的是Fortran的发明者,但他的职业生涯的后半部分都在努力使编程远离 Fortran使用的风格.

在他的图灵奖讲座题为"可以从冯·诺依曼风格中解放出来的节目吗?" 巴克斯概述了他的观点,并用他的FPFL语言进行了实验.那些主要受到了Ken Iverson的APL的启发,而Iverson则在他开发J时借用了Backus的语言.

这些作为语言家族成长范式的扩展和发展背后的关键理念是编程代数的形成.使用这些代数工具,程序员可以通过根据众所周知的数学规则组合标准高阶函数来导出计算正确的程序来解决问题.从以上讲座的摘要:

与编程的功能风格相关联的是程序的代数,其变量范围超过程序并且其操作是组合形式.这个代数可以用来转换程序并解决方程,其"未知数"是程序,其方式与在高中代数中转换方程式的方式大致相同.这些变换由代数定律给出,并且以与编写程序相同的语言执行.选择组合形式不仅是因为它们的编程能力,而且还因为它们相关的代数定律的力量.代数的一般定理给出了大类程序的详细行为和终止条件.

虽然似乎没有很多最新的研究使用该语言家族的符号,主要观点已经看到了其他功能的语言有些新的发展.Richard Bird和Lambert Meertens研究了代数操作和程序派生以及它们运行的​​数据的相关形式.这被称为Bird-Meertens形式主义,或非正式地称为Squiggol.

Bird和Philip Wadler后来写了一篇文章"功能编程简介",它向学生们介绍了基于lambda演算的更为人熟知的"价值级"函数式编程.它最初使用的米兰达的编程语言,一个先行者哈斯克尔,但在其第二版被翻译使用哈斯克尔.我之所以提到这一点是因为Erik Meijer,Maarten Fokkinga和Ross Paterson使用了文中的示例函数作为他们着名论文"香蕉,镜头,信封和铁丝网的功能编程"中的激励示例,他们在这里扩展了Bird -Meertens Formalism,给它一个类别理论的基础,并展示如何根据形式主义的规律和其高阶函数捕获的递归方案计算每个例子的解.

这些想法在Haskell中扎根,在那里你可以找到一种称为"无点"的编程风格,它与FP编程非常相似.它避开了命名变量并纯粹通过其他函数的组合创建了一个新函数.大多数语言都没有针对此用途进行优化,因此很多函数很难使用标准库以无点样式创建,但可以使用提供更多Squiggol样式组合函数的备用库.

建设项目的代数风格,得益于它的数学性质,是适合于通过先进的编译器的高层次的分析和改造.这导致了功能语言编译器中"融合"或"砍伐森林"优化的发展,这些算法允许将以这种方式表达的算法简化为高效的机器代码循环,而不需要更简单的翻译所需的所有垃圾数据和冗余循环.今年早些时候,提出了一种广义流融合的框架,该框架显示了这种编程风格的非常实用的结果.

希望这个背景可以让您更好地了解维基百科文章所讨论的内容以及基础范例的工作原理.


use*_*634 11

虽然其他标签也可以应用(与其他语言一样),但J肯定是一种功能语言.它具有归功于函数式语言的大多数主要属性,例如函数是"一等公民",currying,高阶函数等.此外,如果它对你来说意味着什么,我读过文章,其中语言创建者自己将语言描述为"功能性".

您还可以说它是一种数组编程语言,因为所有函数都在数组和单个元素上运行.

我认为您正在寻找的简短答案是J是一种函数式数组编程语言.你也可以抛出其他描述符,例如非静态类型等.

至于你的编号问题:

  1. 功能和阵列编程.
  2. 就阵列编程而言,它们与任何其他众所周知的语言都不相似; 相反,他们属于他们自己的"阵列编程语言"类别.就功能方面而言,它们属于功能范畴.