clo*_*ead 1 language-agnostic programming-languages
我目前正在参加编程竞赛(http://contest.github.com),其目标是创建推荐引擎.我开始使用ruby进行编码,但很快意识到它对于我想到的算法来说还不够快.所以我切换到C,这是我所知道的唯一非脚本语言.当然,速度很快,但每次我必须编写一个for
循环时,我都会因为数组的元素(经常是这样)而感到畏缩.
就在它恍然大悟的时候:我希望我知道一种快速而又高级的语言,轻松编写所有这些密集型计算!
所以我看了我的选择,但这些天有很多选择!这里是我几个月来找到的最好的候选人,有些事情困扰着我们每个人(希望你能清理):
lisp
事情,我喜欢我的语法和瑕疵.不过,我可以确信.有什么建议?我非常喜欢函数式语言,因为它们能够轻松地操作列表,但我也对其他选项持开放态度.我想要像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到减少锅炉.
为什么不简单的Java或C#?应该比Ruby更快,更高级别然后C和拥有庞大的用户群.
你对几乎所有事物的批评似乎都是"怪异"或"过于学术化".但是,这是什么意思?这是一种模糊的批评,你可以抛出任何不完全主流的不熟悉的语言(即不是C,C++,Objective-C,Java,Ruby,Python或PHP).所有这些语言对于学术界来说都是有益的,对其他任何东西都是坏事.尝试进一步细分您的分析:具体来说,这些语言让您感到困扰的是什么?你可能会发现你的大脑本能地推开了一些不熟悉的东西.如果是这种情况,那么学习其中一种语言可能是扩展思路的好方法.
或者:听起来你正在寻找一种功能语言,所以你可能会看到F#.它是由微软创建的一流CLR语言,因此它不带任何"学术"心理包袱,而且与OCaml非常相似.