我刚刚开始学习J,这是非常有趣的,但我想知道它到底是哪种语言,相对于常见的范式和分类。例如,您可以说F#是一种强类型的,主要是函数式的(它支持面向对象和过程编程,但它被认为是属于ML家族的“函数”)语言。然而,对于J来说,我找不到多少关于如何“按常规”对它进行分类,或者在Stackoverflow上发现的任何东西,证实它是一种函数式编程语言。维基百科说,它“是一种非常简洁的数组编程语言”,“支持函数级编程”,并且“不是Von编程语言”,没有哪种语言更有帮助。
我有几个问题:
我只是想根据我已经知道的情况把这些语言归类在我的脑海中。谢谢。
发布于 2013-12-13 07:40:07
虽然其他标记也可以应用(与其他语言一样),但J无疑是一种功能语言。它具有最主要的功能语言属性,比如函数是“一级公民”、“竞逐函数”、“高阶函数”等等。此外,如果它对你有任何意义,我曾读过一些文章,其中语言创建者自己将语言描述为“功能”。
您还可以说,它是一种数组编程语言,因为所有函数都在数组上运行,而不是单个元素。
我认为简单的答案是,J是一种函数数组编程语言。您还可以抛出其他描述符,例如非静态类型的等等。
至于你的编号问题:
发布于 2013-12-20 18:44:03
J与约翰·巴克斯( John )倡导的那种函数式编程(有时称为函数级编程,而不是价值级编程)有关,他可能更多地被称为Fortran的发明者,但在职业生涯的后期,他试图将编程从Fortran所使用的风格中移开。
在他的Turing Award Lecture题为“编程能从冯·诺依曼风格中解放出来吗?”巴克斯概述了他的想法,并在他的FP和FL语言中进行了实验。这在很大程度上是由肯·艾弗森( Ken )的APL启发的,而艾弗森在开发J时又借鉴了巴克斯的语言。
随着语言家族的发展,其背后的关键思想被扩展和发展为一个范式,即形成一个编程代数。使用这些代数工具,程序员可以根据众所周知的数学规则,通过组合标准高阶函数,导出或计算出解决问题的正确程序。根据上述讲座的摘要:
与程序的功能风格相关联的是一个程序代数,其变量范围在程序之上,其操作是组合形式。这种代数可以用来变换程序,也可以用来求解那些“未知数”是程序的方程,就像人们在高中代数中变换方程一样。这些变换是由代数定律给出的,是用编写程序的同一种语言进行的。组合形式的选择不仅是因为它们的编程能力,而且也是因为它们的相关代数律的幂。代数的一般定理给出了大类程序的详细性质和终止条件。
虽然最近似乎没有太多的研究使用这类语言的符号,但关键思想在其他功能语言中有了一些新的发展。理查德·伯德和兰伯特·米滕斯致力于一种相关的形式主义,用于程序的代数操作和推导,以及他们所操作的数据;这被称为伯德-Meerten形式主义,或者非正式地说,是Squiggol。
Bird和Philip后来写了一篇题为“函数式编程导论”的文章,向学生介绍了基于lambda微积分的更著名的“价值级”函数式编程。它最初使用的是Miranda编程语言,这是Haskell的前身,但在其第二版中,它被翻译成使用Haskell。我之所以提到这一点,是因为Erik Meijer,Maarten Fokkinga和Ross Paterson在他们的著名论文“"Functional Programming with Bananas, Lenses, Envelopes, and Barbed Wire"”中使用了文本中的示例函数作为激励性的例子,他们扩展了Bird的形式主义,在分类理论中给出了一个基础,并展示了如何根据形式主义的规律及其高阶函数捕获的递归方案来计算每个例子的解。
这些想法在Haskell中生根,在那里您可以找到一种称为“无点编程”的编程风格,它与FP编程有很大的相似之处。它避开了命名变量,而仅仅通过其他函数的组合来创建一个新函数。大多数语言都没有针对这种使用进行优化,所以许多函数很难使用标准库创建无点样式,但是提供更多Squiggol风格组合器函数的备用库是可用的。
由于其数学性质,构造程序的代数风格可以由高级编译器进行高层次的分析和转换。这导致了函数式语言编译器中的“融合”或“毁林”优化的发展,使以这种风格表达的算法可以简化为高效的机器代码循环,而不需要更天真的转换所需的所有垃圾数据和冗余循环。今年早些时候,介绍了一个generalized stream fusion框架,它展示了这种编程风格的非常实用的结果。
希望这一背景能让您更好地了解维基百科的文章所讨论的内容以及底层范例是如何工作的。
https://stackoverflow.com/questions/20558170
复制相似问题