接下来我应该学习什么通用语言?

clo*_*ead 1 language-agnostic programming-languages

我目前正在参加编程竞赛(http://contest.github.com),其目标是创建推荐引擎.我开始使用ruby进行编码,但很快意识到它对于我想到的算法来说还不够快.所以我切换到C,这是我所知道的唯一非脚本语言.当然,速度很快,但每次我必须编写一个for循环时,我都会因为数组的元素(经常是这样)而感到畏缩.

就在它恍然大悟的时候:我希望我知道一种快速而又高级的语言,轻松编写所有这些密集型计算!

所以我看了我的选择,但这些天有很多选择!这里是我几个月来找到的最好的候选人,有些事情困扰着我们每个人(希望你能清理):

  • Clojure:我不确定我是否想要了解整个lisp事情,我喜欢我的语法和瑕疵.不过,我可以确信.
  • 哈斯克尔:太学术了?我真的不关心纯粹的功能,我只想要一些有用的东西.但它有很好的语法,我不介意静态类型.
  • 斯卡拉:奇怪的语言.我试了一下,但对我来说感觉很乱/不一致.
  • OCaml:还想知道这是不是太学术了?糟糕的并发支持也困扰着我.
  • Arc:保罗格雷厄姆的口齿不清,太晦涩了,而且,我不确定我是否想学习口齿不清.但我相信这个男人!

有什么建议?我非常喜欢函数式语言,因为它们能够轻松地操作列表,但我也对其他选项持开放态度.我想要像Java一样快的东西......

我希望能够对列表执行的操作类似于(ruby):

([1, 2, 3, 4] - [2, 3]).map {|i| i * 2 } # which results in [2, 8]
Run Code Online (Sandbox Code Playgroud)

我也更喜欢开源语言.

谢谢

Pav*_*aev 12

在您列出的语言中,Haskell和Arc都不符合您的"快速"要求 - 两者都比Java慢.您认为Haskell比Java快并且接近C的想法很可能来自一个众所周知的有缺陷的测试,该测试试图通过实现排序来衡量性能.他们错过的一件事是Haskell是懒惰的,因此你需要使用排序的结果来实际执行它; 他们只是通过记住当前时间,"调用"排​​序函数和检查时间增量来测量性能.C版本的测试忠实地执行了排序,Haskell版本只是返回了一个从未调用的懒惰评估的thunk.

实际上,即使在理论上,Haskell也不能那么快就有很多原因.首先,由于普遍的惰性求值,它通常不能传递原始值,并且必须为表达式生成thunk - 优化器可以减少那些在琐碎的情况下,但不是更复杂的.其次,多态Haskell函数实现为运行时 - 多态,而不像C++模板,其中每个新类型参数都实例化最佳编译的新版本代码.显然,这需要额外的装箱/拆箱.最后,Haskell将难以击败任何体面的VM(例如HotSpot JVM或.NET 2.0+中的CLR),更不用说C/C++了.

现在已经确定了,让我们继续讨论其余部分.Scala使用JVM作为后端,因此不会比Java更快 - 如果你使用更高级别的抽象,它很可能会有点慢,但可能在同一个球场.Clojure也在JVM上运行,但它也是动态类型的,并且带来了不可避免的性能损失(我听说它在某种程度上做了一些聪明的技巧来缓解这种情况,但是无论如何,其中一些确实是不可避免的).

这留下了OCaml,并且在你的列表之外,它是唯一一种在有效测试中实际上已经最终证明能够达到C/C++编译器性能的语言.应该注意的是,这不是典型的惯用OCaml代码 - 例如,它的多态性也是运行时,类似于Haskell,并且带有适当的惩罚; 此外,它的OOP系统是结构性的而不是名义上的,这排除了最佳的基于vtable的实现; 因此,它也会比C++慢(我认为与C++调度相比,Objective-C调度的执行惩罚接近,但是我没有任何数字来支持它).如果你偏离某些语言特性,你可以在OCaml中击败C++,但不幸的是,正是这些特性使得OCaml首先如此具有吸引力.

我的建议是这样的:如果你真的需要速度,请使用C++.如果您使用STL和Boost等高级库,它可能会相当高级.它没有你可能习惯的一些高级语言抽象,但是库可以弥补这一点 - 有时是完全的,有时是部分的.例如,你不必写for-loop遍历数组-您可以使用std::for_each,std::copy_if,std::transform,std::accumulate和类似的算法(其中大多是类似map,filter,fold和类似的传统FP原语),也Boost.Lambda到减少锅炉.


Jen*_*der 6

为什么不简单的Java或C#?应该比Ruby更快,更高级别然后C和拥有庞大的用户群.

  • 我不知道在什么样的宇宙中人们认为Haskell,OCaml或Common Lisp(!)可以将编写良好的C与生产质量编译器和优化器的性能相匹配,但它不是这个.C是一种中级(非高级)语言,可以经常匹配手写汇编代码的速度.我见过的唯一可以真正匹配它的其他非汇编语言是FORTRAN和Bliss,并且好运找到其中任何一个的当前质量版本. (3认同)

Chu*_*uck 5

你对几乎所有事物的批评似乎都是"怪异"或"过于学术化".但是,这是什么意思?这是一种模糊的批评,你可以抛出任何不完全主流的不熟悉的语言(即不是C,C++,Objective-C,Java,Ruby,Python或PHP).所有这些语言对于学术界来说都是有益的,对其他任何东西都是坏事.尝试进一步细分您的分析:具体来说,这些语言让您感到困扰的是什么?你可能会发现你的大脑本能地推开了一些不熟悉的东西.如果是这种情况,那么学习其中一种语言可能是扩展思路的好方法.

或者:听起来你正在寻找一种功能语言,所以你可能会看到F#.它是由微软创建的一流CLR语言,因此它不带任何"学术"心理包袱,而且与OCaml非常相似.


Jef*_*ber 5

newLISP速度快,体积小,与C 非常容易集成,内置了相当多的统计功能.