What general purpose language should I learn next?
我目前正在参加一个以创建推荐引擎为目标的程序设计竞赛(http://contest.github.com)。我开始用Ruby编写代码,但很快意识到它不够快,无法满足我所想到的算法。所以我改为C语言,这是我所知道的唯一一种非脚本语言。当然,速度很快,但每次我不得不写一个
就在这时:我希望我知道一种快速而高级的语言,能够轻松地编程所有这些密集的计算!
所以我考虑了我的选择,但是现在有很多选择!这是几个月来我找到的最好的候选人,他们中的每一个都让我感到困扰(希望你能澄清):
- Clojure:我不确定我是否想了解整个
lisp 的内容,我喜欢我的语法和技巧。不过,我可以相信。 - 哈斯克尔:太学术化了?我真的不喜欢纯粹的功能性,我只是想要一些有用的东西。但是它有很好的语法,我不介意静态输入。
- 斯卡拉:奇怪的语言。我试过了,但感觉很乱/不一致。
- 奥卡姆:还想知道这是否太学术化了?糟糕的并发支持也困扰着我。
- ARC:保罗·格雷厄姆的口齿不清,我又一次不确定我想学口齿不清。但我相信这个人!
有什么建议吗?我非常喜欢函数式语言,因为它们能够轻松地操作列表,但我也愿意接受其他选项。我想要一些和Java一样快的东西。
我想用列表做的事情有(ruby):
1 | ([1, 2, 3, 4] - [2, 3]).map {|i| i * 2 } # which results in [2, 8] |
我也更喜欢开源语言。
谢谢
在你列出的语言中,Haskell和ARC都不符合你的"快速"要求,都比Java慢。你认为Haskell比Java快,并且接近C的想法很可能来自一个著名的有缺陷的测试,它试图通过实现排序来衡量性能。他们遗漏了一件事,那就是Haskell很懒惰,因此你需要使用排序的结果来实际执行这个任务;他们只需记住当前时间,"调用"排序函数,并检查时间差就可以测量性能。C版本的测试忠实地执行了排序,haskell版本只是返回了一个thunk,表示懒惰的评估从未被调用。
在实践中,有很多原因说明哈斯克尔即使在理论上也不能这么快。首先,由于普遍存在的惰性评估,它通常不能传递原始值,并且必须为表达式生成thunk——优化器可以在一些小的情况下减少这些值,但对于更复杂的情况则不行。其次,多态Haskell函数被实现为运行时多态性,而不是像C++模板那样,每个新的参数都实例化优化编译的新版本的代码。显然,这需要额外的装箱/拆箱。最后,Haskell将努力击败任何像样的VM(例如热点JVM,或者CL.NET中的2 +),更少的C/C++。
既然已经解决了,那就让我们继续下一步吧。Scala使用JVM作为后端,因此不会比Java更快,并且如果使用更高级别的抽象,它很可能会稍微慢一些,但可能在相同的范围内。Clojure也在JVM上运行,但它也是动态类型的,并且会带来不可避免的性能损失(我听说它做了一些巧妙的技巧来在某种程度上减轻这种影响,但不管怎样,其中一些确实是不可避免的)。
这就离开了OcAML,而在你的列表中,它是唯一一个最终被证明能够达到C/C++编译器在有效测试上的性能的语言。然而,应该注意的是,这不是典型的惯用的OCAML代码——例如,它的多态性也是运行时,类似于Haskell,并且携带适当的惩罚;而且,它的OOP系统是结构化的而不是标称的,这排除了基于最优表的实现;因此,它将比C++更慢。(我预计Prof惩罚接近Objto-C调度与C++调度相比,但我没有任何数字支持这一点)。因此,如果你避开某些语言特征,你可以击败OcAML中的C++,但不幸的是,这些特性让OcAML在最初的时候非常吸引人。
我的建议是:如果你真的需要速度,那就去C++。如果您使用高级库(如stl和boost),它可能是相当高的级别。它没有一些您可能习惯的高级语言抽象,但是库可以弥补这一点——有时是完全的,有时是部分的。例如,不必编写
为什么不是简单的Java或者C?应该比Ruby更快,比C更高级别,拥有巨大的用户群。
你对几乎所有事情的批评似乎都是"奇怪"或"太学术化了",但这是什么意思?这是一种模糊的批评,你可以抛出任何不完全主流的语言(即C、C++、Objto-C、Java、露比、Python或PHP)。所有这些语言本身对学术界没有好处,对其他任何东西也没有坏处。试着进一步分解你的分析:具体来说,是什么让你对那些语言感到困扰?你可能会发现你的大脑只是本能地把不熟悉的东西推开。如果是这样的话,学习这些语言中的一种可能是一个扩展你思想的好方法。
或者:听起来你在寻找一种功能性语言,所以你可能会看到f。这是微软创造的一流的clr语言,因此它不携带任何"学术"的精神包袱,而且它与ocaml非常相似。
newlisp速度快,体积小,极易与C集成,内置了相当多的统计函数。
haskell是我目前作为高性能、高级语言的首选。我也听说过很多关于OCAML的好消息,但我个人并没有使用过。
Scala和Culjule将具有与Java相似的性能——慢、慢、慢!当然,它们会比Ruby快,但什么不是呢?
arc是mzscheme的一组宏,速度不是特别快。如果您想要一个性能良好的Lisp,请尝试使用普通的Lisp——它可以编译为机器代码。
Delphi/Freepascal怎么样?它们是本地代码,而且速度很快。我用它们做了很多实时图形处理。他们不要求你工作"低水平",但如果你需要,你可以。另外,如果需要额外的性能,可以嵌入汇编程序。如果你想远离窗户,Freepascal是跨平台的。
D可能合适吗?编译为机器代码,但允许使用更高级的概念进行编程。
计算?福特兰。胜过任何其他东西。
可以让python快速运行,特别是使用numpy包。相关链接如下:
http://www.scipy.org/performancepython
赛通和麻木的速度
你似乎对任何看起来不像你已经用过的语言感到不舒服。这会限制你,所以我建议你,如果你有兴趣扩展你的视野,你会感到不舒服。我不是说你会继续使用任何特定的语言(我有一个明确的偏好,永远不要再接触TCL),但你应该尝试一下。
通用Lisp有很好的快速实现,这是一种很容易编写函数程序的语言。此外,如果你能接受它,你会发现很多你可以用它做的事情。
如果你不介意.NET…
C++或另一种C++语言和MNO语言。
老实说,要想在软件工程领域取得很大的成就,你可能就得把你的脑袋放在那些令你厌恶的语言上。Java、C、C++、C等可能在涉及编程的职业中出现。
看来你做了一些有趣的工作。我鼓励你更努力地提高你的技术技能。这将是值得的努力。
或者,考虑到您的兴趣,python可能是好的。你可能会发现Smalltalk很有趣,甚至是ATS。
关于一些想法,请看奥斯卡·博伊金的《语言枪战与分析》。您已经发现了这一点,但是与Ruby和C相比,我们发现Ruby的速度要慢14到600倍(几个测试的速度要慢100倍以上)。他还指出,python比ruby快。所有语言的基准都很有趣。
丹·科兰的基准也很有趣。
更新后:
如果您想轻松地操作列表,那么应该使用通用Lisp。它比C平均速度慢2倍(实际上在某些情况下速度更快),对于列表处理来说非常好,而且它是多范式(命令式、函数式和OO),所以您不必坚持只使用函数式编程。在我看来,sbcl是一个很好的惯用lisp。
不要为奇怪的"口齿不清"的事情而烦恼,比如括号。用语法而不是语义来判断语言不仅很愚蠢,而且括号也是Lisp最大的优点之一,因为它们消除了数据和表达式之间的差异,并且您可以操纵语言本身使其符合您的需要。
不要听那些建议C++/C/Y/JAVA的人。Java功能部分是不存在的。C++功能部分很糟糕。代表们的复杂性让我感到恶心。它们不是真正的多范式命令式/函数式语言,它们是命令式/OO语言,具有一些小的功能位,您不能在其中进行真正的函数式编程。
我相信通过C + +和Java或.NET,然后从这里移动到任何一种方式Java或.NET,因为C更多面向机器,C++和Java将提供面向对象的学习,然后切换到Python(真正地欣赏比C C++和Java更干净的代码)。
如果你的问题是C的笨拙循环,我建议你看看Ada。它允许您使用如下简单语句循环整个数组:
1 2 3 | for I in array_name'range loop --'// Code goes here end loop; |
对于人工智能项目,我还建议您研究使用剪辑,这是一个免费可用的推理引擎。
与OCAML不同,您可能会考虑F——它是与OCAML兼容的源代码(或者您可以使用更轻的语法),它支持参与者风格的与它所称的异步工作流(对于应用异步执行来说,这实际上是一个几乎单体的工作流)。
但正如scala所显示的那样,如果您将它构建到库中,那么您需要将演员风格的并发性移植到语言中。剩下的只是句法上的糖分。
pyrex或psyco的python可能更适合?可能不如C快,但您可以看到常规python的一些显著加速。
考虑一下Tcl,与C结合在一起。在C中做真正计算密集型的工作,因为这就是你知道如何做的,然后使用Tcl作为粘合剂,将高级代码与基于C的代码结合在一起。
我之所以提出这一建议,并不是因为TCL必然是最适合这份工作的语言(这种语言确实没有"最佳"的含义),而是因为您将学到很多关于结合两种不同语言优势的概念。无论是TCL/C、Lua、C、Groovy/Java、Python/C等,都是一项重要的技术。
您可能会考虑Python;它支持在C或C++中编写模块,这样您就可以用高级语言工作,配置它,修改算法,如果还不够快,将热点转换成C或C++的速度。
学习C++并熟悉它的标准库。既然你已经说了C,那就不难学了,但是记住C++不仅仅是一个更好的C语言,它是另一种有自己概念和方法的语言。
为什么不是二郎?
- 它不像你已经知道的语言,所以你可以学习新的概念。
- 它有一些有趣的多处理能力
- 学术界也不例外。二郎首先是一种商业语言。
- 其中至少有两个重要的开源应用程序:couchdb和wings3d
如果你想要的是"和Java一样快",最明显的解决方案就是JRube。
如果安装NetBeans(使用Ruby列下的下载按钮),jruby是默认的解释器。不会变得容易多了!