寻找功能语言

Suu*_*aku 16 programming-languages functional-programming

我是一名主要使用C++的科学家,但我希望找到更好的语言.我正在寻找建议,我甚至不确定我的"梦想语言"是否存在,但这是我的愿望清单;

重要特征 (按重要性排序)

1.1:表现:对于科学,表现非常重要.我完全理解生产力的重要性,而不仅仅是执行速度,但是当你的程序必须运行几个小时时,你就无法用Python或Ruby编写它.它不需要像C++一样快,但它必须相当接近(例如:Fortran,Java,C#,OCaml ......).

1.2:高水平和优雅:我希望能够尽可能地集中精力学习科学并获得清晰的代码.我也不喜欢像Java那样的冗长语言.

1.3:功能完备:我喜欢函数式编程,我认为它非常适合我的风格和科学编程.我不在乎语言是否支持命令式编程,它可能是一个优点,但它必须集中并鼓励函数式编程.

1.4:可移植性:应该在Linux(特别是Linux!),Mac和Windows上运行良好.不,我不认为F#在单声道Linux上运行良好,我不确定OCaml在windows上运行良好;)

1.5:面向对象,最好是在"一切都是对象"的哲学下:我意识到在不久前我不得不处理纯C的时候,我更喜欢面向对象的编程.我喜欢对面向对象编程有强烈承诺的语言,而不仅仅是胆小的支持.

不是很重要,但是那些事情会很好

2.1:"不太强"的打字:我发现Haskell强大的打字系统很烦人,我喜欢能够做一些隐式转换.

2.2:工具:好的工具总是有利的,但我想这实际上取决于语言.我使用轻量级编辑Geany与Haskell一起玩,我从未感到残疾.另一方面,我不会用Java甚至Scala做同样的事情(特别是Scala似乎缺乏好的工具,这实在是太遗憾了).Java在这里确实是第一语言,使用NetBeans和Javadoc,使用Java编程非常简单有趣.

2.3:收集垃圾,但在没有虚拟机的情况下进行翻译或编译.我没有反对虚拟机,但域中的两个巨头都有他们的问题.在纸面上,.net框架看起来好多了,特别适合函数式编程,但在实践中它仍然以Windows为中心,对Linux/MacOS的支持很糟糕,并不是应该的,所以它并不值得考虑.Java现在是一个成熟的虚拟机,但它在某些层面上让我很烦恼:我不喜欢它处理可执行文件,泛型的方式,并且它编写了可怕的GUI(虽然这些东西并不是那么糟糕).

Nor*_*sey 17

在我看来,有三个可行的候选人:Haskell,标准ML,OCaml.(Scala出来的理由是它编译为JVM代码,因此当程序必须运行数天时,它不可能足够快.)所有这些都是主要功能.我将评论我所掌握的知识.

高性能

  • OCaml为所有情况提供最稳定的性能,但性能难以提高.你得到的是你得到的:-)

  • Haskell具有最佳的并行性能,可以在8核或16核机器上得到很好的使用.如果你的未来是平行的,我建议你掌握你对类型系统的厌恶,并学会有效地使用Haskell,包括Data Parallel Haskell扩展.

    Haskell性能的缺点是,很难预测评估惰性函数程序所需的空间和时间.有很好的分析工具,但仍然需要付出很大的努力.

  • 使用MLton编译器的标准ML具有出色的性能.MLton是一个完整的程序编译器,并且做得非常好.

高级而优雅

  • 语法上Haskell是明显的赢家.然而,类型系统与最近实验的遗留物混杂在一起.然而,类型系统的核心是高级和优雅的."类型类"机制特别强大.

  • 标准ML具有丑陋的语法,但是非常干净的类型系统和语义.

  • 从语法和类型系统的角度来看,OCaml是最不优雅的.过去实验的遗骸比Haskell更加突兀.此外,标准库不支持您可能期望的函数式编程.

主要功能

Haskell纯粹是功能性的; 标准ML非常实用; OCaml主要是功能性的(但要注意可变字符串以及库中的一些令人惊讶的遗漏;例如,列表函数对于长列表是不安全的).

可移植性

这三个在Linux上运行良好.Haskell开发人员使用Windows并且它得到了很好的支持(虽然它会导致它们的痛苦).我知道OCaml在OSX上运行良好,因为我使用OCaml编写的应用程序已经移植到OSX.但我在这里的消息很少.

面向对象

在Haskell或SML中找不到.OCaml有一个标准的OO系统嫁接到核心语言,与其他语言没有很好的集成.

你没有说明为什么你热衷于面向对象.ML仿函数和Haskell类型类提供了一些在C++中可以找到的封装和多态(也称为"泛型编程").

键入系统可以被破坏

所有三种语言都提供不安全的演员阵容.在所有这三种情况下,它们都是获得核心转储的好方法.

我喜欢能够做一些隐式的演员.

我认为你会发现Haskell的类型级系统符合你的喜好 - 你可以获得一些类似于隐式转换的效果,但是安全.特别是,数字和字符串文字可以隐式地转换为您喜欢的任何类型.

工具

Haskell有很好的分析工具.标准ML有蹩脚的工具.OCaml基本上具有标准的Unix分析和一个不可用的调试器.(调试器拒绝跨越抽象障碍,并且它不适用于本机代码.)

我的信息可能已过期; 工具图片一直在变化.

垃圾收集并编译为本机代码

校验.没有什么可以选择的.

建议

克服您对安全,安全类型系统的厌恶.研究Haskell的类型类(Wadler和Blott的原始论文以及Mark Jones的教程可能很有启发性). 深入了解Haskell,并确保了解Hackage中大量相关软件.

  • @Peter:部分是因为黑暗时代,部分是因为JVM不支持正确的尾调用,所以功能程序(执行很多尾递归)往往不能很好地执行.请参阅http://stackoverflow.com/questions/105834/does-the-jvm-prevent-tail-call-optimizations.我的理解是,要从Scala获得最佳性能,您必须放弃尾调用. (2认同)

jqn*_*qno 7

试试Scala.它是一种在JVM中运行的面向对象的函数式语言,因此您可以访问用Java编写的所有内容.它具有您所有重要的功能,并且具有很好的功能之一.(显然不是#2.2 :)但是这可能会很快变得更好.)它确实有很强的打字功能,但是通过类型推断它并没有真正妨碍你.


Tec*_*ard 5

你刚才描述了Common Lisp ......


Jon*_*ehl 4

如果您喜欢在大多数事情上使用列表,并且关心性能,请使用 Haskell 或 Ocaml。尽管 Ocaml 由于 VM 设计而受到很大影响,因为堆上的浮点需要装箱(但浮点数组和纯浮点记录不会单独装箱,这很好)。

如果您愿意更多地使用数组而不是列表,或者计划使用可变状态进行编程,请使用 Scala 而不是 Haskell。如果您想编写线程多核代码,请使用 Scala 或 Haskell(Ocaml 需要您 fork)。

Scala 的列表是多态的,因此 int 列表实际上是装箱的 Int 对象的列表。当然,您可以在 Scala 中编写自己的整数列表,速度也一样快,但我假设您更愿意使用标准库。Scala 确实在 JVM 上拥有尽可能多的尾递归。

Ocaml 对我来说在 Vista 64 上失败,我认为是因为他们只是更改了最新版本(3.11.1?)中的链接器,但早期版本工作正常。

如果您使用夜间构建,Scala 工具支持目前存在问题,但应该很快就会好。有 eclipse 和 netbeans 插件。我改用 emacs。我过去曾成功使用过 eclipse 和 netbeans 调试器 GUI。

Scala、Ocaml 或 Haskell 都没有真正出色的标准库,但至少您可以轻松地在 Scala 中使用 Java 库。如果您使用 MapReduce,Scala 会在集成方面获胜。Haskell 和 Ocaml 有相当数量的第 3 方库。令我恼火的是,Haskell 中的 2-3 种类型的 monad 有不同命名的组合器。

http://metamatix.org/~ocaml/price-of-abstraction.html可能会说服您继续使用 C++。可以编写性能与 Java/C++ 几乎相同的 Scala,但不一定采用高级函数式或 OO 风格。

http://gcc.gnu.org/projects/cxx0x.html似乎表明 auto x = ... (表达式的类型推断)和 lambda 是可用的。如果你能忍受的话,带 boost 的 C++0x 看起来相当实用。当然,C++ 高性能模板滥用库的缺点是编译时间。