【问题标题】:What general purpose language should I learn next?接下来我应该学习什么通用语言?
【发布时间】:2010-11-19 17:52:19
【问题描述】:

我目前正在参加一个编程竞赛 (http://contest.github.com),其目标是创建一个推荐引擎。我开始使用 ruby 进行编码,但很快就意识到它对于我所考虑的算法来说还不够快。所以我改用 C,这是我所知道的唯一非脚本语言。当然,它很快,但每次我不得不编写 for 循环来遍历数组的元素时(这种情况很常见),我都会感到畏缩。

这才恍然大悟:我希望我知道一种快速但高级的语言,可以轻松地对所有这些密集的计算进行编程!

所以我查看了我的选择,但现在有很多选择!这是我几个月来找到的最好的候选人,每个人都有一些让我烦恼的事情(希望你能弄清楚):

  • Clojure:我不确定我是否想了解整个 lisp 的内容,我喜欢我的语法和粗俗。不过,我可以相信。
  • Haskell:太学术了?我并不真正关心 pure 功能,我只想要一些有效的东西。但它有很好的语法,我不介意静态类型。
  • Scala:奇怪的语言。我试过了,但我觉得它很乱/不一致。
  • OCaml:还想知道这是否过于学术?糟糕的并发支持也让我很困扰。
  • Arc:Paul Graham 的口齿不清,太晦涩难懂了,再说一遍,我不确定我是否想学口齿。但我相信这个人!

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

我希望能够用列表做的事情就像(ruby):

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

我也更喜欢开源语言。

谢谢

【问题讨论】:

  • LISP 到底有什么困扰你的地方?
  • 如果您认为自己可以在一种全新的语言中变得高效并在两周内使用该语言赢得比赛,那么您必须有很多时间。
  • 哈哈我没那么疯狂。更多的是意识到我将来会面临类似的问题,应该做好准备:)
  • 没有“开源语言”,只有“开源实现”。

标签: language-agnostic programming-languages


【解决方案1】:

D 可能符合要求?编译为机器代码,但允许使用更高级别的概念进行编程。

【讨论】:

  • 啊,我忘了这个!我要说的唯一问题是它在处理数据结构和做列表魔术方面并不是特别好。
  • D 看起来确实很酷 - 我喜欢它比 C# 或 Java 拥有更多高级功能。
  • D 对函数式编程和不可变状态等有一些很好的支持。
【解决方案2】:

为什么不使用简单的 Java 或 C#?应该比 Ruby 更快,比 C 更高级别,并且拥有庞大的用户群。

【讨论】:

  • Java 和 C# 比 Ruby 快,但对于需要快速运行的代码来说仍然 (IMO) 太慢了。 Haskell、OCaml 和 Common LISP 是我所知道的唯一可以匹配 C 的高级语言。
  • 我不是Java的粉丝,我也不用windows,我应该提一下。
  • 我看到的测试表明 C# 的速度是 C++ 的 98%。不过我不知道C。由于你不是 windows 用户,你可以试试 mono,虽然我不知道它的性能如何。
  • @John fast 是非常相对的。只有一个特定的问题才能显示 OP 需要什么样的性能。也许他需要手工优化的汇编器,尽管这可能不符合高级别的条件。
  • 我不知道人们认为 Haskell、OCaml 或 Common Lisp(!) 可以将编写良好的 C 的性能与生产质量的编译器和优化器相媲美,但事实并非如此这个。 C 是一种中级(不是高级)语言,可以经常与手写汇编代码的速度相媲美。我见过的唯一可以真正匹配它的其他非汇编语言是 FORTRAN 和 Bliss,祝你好运找到它们中任何一个的当前质量版本。
【解决方案3】:

Python 可以快速运行,尤其是使用 NumPy 包。相关链接如下:

http://www.scipy.org/PerformancePython

Cython and numpy speed

【讨论】:

【解决方案4】:

Haskell 是我目前的首选,它是一种高性能的高级语言。我也听说过关于 OCaml 的非常好的东西,但没有亲自使用它。

Scala 和 Clojure 将具有与 Java 相似的性能——慢、慢、慢!当然,它们会比 Ruby 更快,但不是吗?

Arc 是一组 MzScheme 的宏,速度不是特别快。如果你想要一个高性能的 LISP,试试 Common LISP——它可以编译成机器码。

【讨论】:

  • 那么 Haskell 真的比 Java 快那么多吗?此外,您是否发现它的学术性质有时会成为快速发布代码的障碍?
  • 在我看到的基准测试中,Haskell 的性能大致与 C 相当。这取决于代码的编写方式——无法避免高性能代码所需的低级位旋转,但其余的代码可以写到更高的层次。我不认为 Haskell 特别“学术”,但库的情况不如 Python 健康。
  • Haskell 不可能在任何地方接近 C,或者事实上,甚至是 Java,因为它必须为惰性求值做所有的重击。
  • @Chuck:与 C# 或 Java 200% 左右的开销相比,迁移到 Haskell 时通常会出现 30% 左右的开销。
  • @John,你从哪里得到你的号码? Java 或 C# 都没有 200% 的开销;事实上,两者中编码的紧密内部循环通常会被转换为与 C/C++ 编译器完全相同的 asm 操作码
【解决方案5】:

你可以考虑使用 python;它支持用 C 或 C++ 编写模块,因此您可以让它在高级语言中工作,对其进行分析,重新设计算法,如果仍然不够快,请将热点转换为 C 或 C++ 以提高速度。

【讨论】:

  • 我可以用 ruby​​ + C 完成所有这些工作,这让我回到了最初的问题。
【解决方案6】:

考虑将 Tcl 与 C 相结合。在 C 中执行真正的计算密集型工作,因为这是您知道如何做的,然后使用 Tcl 作为粘合剂将高级代码与基于 C 的代码结合起来。

我提出这个建议并不是因为 Tcl 一定是最适合这项工作的语言(对于这样的事情确实没有“最佳”),而是因为你会学到很多关于结合两种不同语言优势的概念.无论是 Tcl/C、Lua/C、Groovy/Java、Python/C 等,它都是一项重要的技术,可以在你的职业生涯中为你服务。

【讨论】:

  • 再次,我可以将 C 与 ruby​​ 一起使用,但我正在寻找的是能够在大型数据集上快速编写 高级代码。
  • 好的,我看不出你在原始问题中提到将两者结合起来的地方。您说您尝试了 Ruby,然后您尝试了 C,您并没有说您一起尝试了它们。
【解决方案7】:

您对几乎所有内容的批评似乎都是“奇怪”或“过于学术化”。但是,这是什么意思?这是一种模糊的批评,你可以对任何不完全主流的不熟悉的语言(即不是 C、C++、Objective-C、Java、Ruby、Python 或 PHP)提出批评。所有这些语言都没有什么本质上对学术界有利而对其他任何事物都不利。尝试进一步分解您的分析:具体而言,您对这些语言有什么困扰?你可能会发现你的大脑只是本能地推开一些不熟悉的东西。如果是这种情况,学习其中一种语言可能是拓展思维的好方法。

或者:听起来您正在寻找一种函数式语言,因此您可能会查看 F#。它是微软打造的一流CLR语言,没有任何“学术”的心理包袱,与OCaml非常相似。

【讨论】:

  • 当我说“太学术”时,我的意思是这门语言似乎不是为了解决问题而设计的,而是作为一种学习工具或实验,因此缺乏某些特征,这将使它对日常使用有用。对我来说,为什么像 Haskell 或 lisp 这样的快速和高级语言没有更普及是一个谜。我真的没有反对学术界的意见,我只是担心其中一些语言可能在现实世界中几乎没有使用,这就是为什么我们没有看到很多项目在它们中实现。
【解决方案8】:

带有pyrexpsyco 的Python 可能更合适?可能不如 C 快,但您可以从常规 Python 中看到一些显着的加速。

【讨论】:

    【解决方案9】:

    newLISP 速度快、体积小、极易与 C 集成,并且内置了相当多的统计函数。

    【讨论】:

    • 在这里,newlisp 是目前最聪明的脚本语言之一
    【解决方案10】:

    你似乎对任何看起来不像你已经使用过的语言感到不舒服。这会限制你,所以如果你有兴趣扩大你的视野,我建议你不会感到舒服。我并不是说你会想继续使用任何特定的语言(我绝对倾向于永远不再接触 Tcl),但你应该找个时间尝试一下。

    Common Lisp 有很好的快速实现,这是一种编写函数式程序的简单语言。此外,如果你能与它相处,你会发现它可以做很多巧妙的事情。

    【讨论】:

      【解决方案11】:

      如果您想要“与 Java 一样快”的东西,显而易见的解决方案是 JRuby

      如果你安装Netbeans(使用Ruby栏下的下载按钮),JRuby是默认的解释器。它并没有变得更容易!

      【讨论】:

      【解决方案12】:

      计算? Fortran。比其他任何东西都要好。

      【讨论】:

        【解决方案13】:

        Delphi / FreePascal 怎么样?它们是本机代码且速度很快。我用它们做了很多实时图形和处理。他们不要求你工作“低水平”,但如果你需要,你可以。另外,如果需要额外的性能,您可以嵌入汇编程序。如果您想远离 Windows,FreePascal 是跨平台的。

        【讨论】:

        • Delphi 并没有明显比 C++ 高级,它只是具有更简洁的语法和更严格的类型规则。
        【解决方案14】:

        如果您的问题是 C 的笨拙循环,我建议您查看 Ada。它允许您使用如下简单语句循环整个数组:

        for I in array_name'range loop
           --'// Code goes here
        end loop;
        

        对于 AI 项目,我还建议您考虑使用 Clips,这是一个免费提供的推理引擎。

        【讨论】:

          【解决方案15】:

          如果您不介意 .NET...

          1. F# - 基于 O'Caml,具有对 .NET Framework 的完全访问权限的多范式语言。正式包含在 .NET FW 4.0 中
          2. Nemerle - 查看 F# 并添加强大的元编程功能。

          【讨论】:

          • 在我看来 Nemerle 的语法比 F# 简洁得多。
          【解决方案16】:

          您可能会考虑使用 F#,而不是 OCAML——它与 OCAML 源代码兼容(或者您可以使用更轻量级的语法),并且它支持 Actor 风格的并发以及它所谓的异步工作流(这实际上是一个几乎单子应用异步执行)。

          并非如此——正如 Scala 所展示的——如果你将它构建到一个库中,你需要将 actor 风格的并发嵌入到语言中。剩下的只是语法糖。

          【讨论】:

            【解决方案17】:

            C++ 或者 C# 和单声道。

            老实说,要在软件工程领域取得很大的成就,您可能不得不考虑这些您认为令人反感的语言。 Java、C、C++、C#等很可能出现在涉及编程的职业中。

            看起来你做了一些有趣的工作。我鼓励你更加努力地提升你的技术技能。这将是值得的。

            或者,考虑到您的兴趣,Python 可能也不错。你可能会觉得Smalltalk 很有趣,甚至ATS

            一些想法,看Language ShootoutOscar Boykin的分析。您已经发现了这一点,但是将 Ruby 与 C 进行比较,我们发现 Ruby 慢了 14 到 600 倍(有几个测试慢了 100 倍以上)。他还指出 Python 比 Ruby 快. benchmarks for all languages 很有趣。

            Dan Corlan 的基准测试也很有趣。

            【讨论】:

            • “所有语言的基准测试都很有趣。”请选择最新的测量值而不是这些!
            • 对不起。没看到那个。已更新。
            【解决方案18】:

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

            在实践中,即使在理论上,Haskell 也不能那么快有很多原因。首先,由于普遍的惰性求值,它通常不能传递原始值,并且必须为表达式生成 thunk - 优化器可以在琐碎的情况下减少那些,但对于更复杂的情况则不能。其次,多态 Haskell 函数被实现为 runtime-多态,而不像 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 循环来遍历数组 - 您可以使用 std::for_eachstd::copy_ifstd::transformstd::accumulate 和类似的算法(主要类似于 @ 987654326@、filterfold 和类似的传统 FP 原语),以及 Boost.Lambda 以减少样板。

            【讨论】:

            • +1:谢天谢地,至少有一个理智的人的答案基于现实。
            • 同上。我本来打算自己发布一个“学习/使用 C++ 和提升”的答案,但这个答案已经说明了一切。
            • Boost.Lambda?你在开玩笑吗? C++ 已经很臃肿了,添加带有糟糕语法的 lambda 并不能解决它的问题。面对现实 - C++ 时代结束了。对于高性能,有纯 C 语言,对于应用程序编程,有很多很棒的高级语言,在这些语言中你不必考虑用脚打自己。
            • C++ 至少比普通 C 好得多,因为 RAII 比手动资源管理好,即使你完全忽略了语言的其余部分。此外,对于一种时代已经结束的语言,绝大多数桌面软件仍然是用 C++(不是 C,绝对不是其他任何东西)编写的,这确实很奇怪。
            • 人们,尤其是管理人员适应新技术的速度很慢。 Java 已经比 C++ 更受欢迎,我相信 C# 很快也会更受欢迎,然后随着 Linux 和 webapp 的普及,Python 也将变得更受欢迎。
            【解决方案19】:

            学习 C++ 并熟悉其标准库。学习 C 语言并不难,但请记住,C++ 不仅仅是一种更好的 C,它还是另一种具有自己的概念和方法的语言。

            【讨论】:

              【解决方案20】:

              更新后:

              如果您想轻松操作列表,您应该使用 Common Lisp。它平均只比 C 慢 2 倍(实际上在某些方面更快),它非常适合列表处理并且它是多范式(命令式、函数式和 OO) - 所以你不必坚持使用函数式 -只有编程。 SBCL 是一个很好的 Common Lisp,首先要尝试,IMO。

              并且不要被括号等奇怪的“口齿不清”的东西所困扰。通过语法而不是语义来判断语言不仅很愚蠢,而且括号是 LISP 的最大优势之一,因为它们消除了数据和表达式之间的差异,并且您可以操纵语言本身以使其适合您的需求。

              不要听那些建议 C++/C#/Java 的人。 Java 功能部分不存在。 C++ 功能部分很糟糕。 C# 委托让我感到恶心,因为它们的复杂性。它们不是真正的多范式命令式/函数式语言,它们是具有一些小功能位的命令式/OO 语言,你不能在它们中进行真正的函数式编程。

              【讨论】:

              • 我不知道为什么人们向我推荐 C++/C#/Java,因为我非常了解这些语言,也非常了解他们无法进行列表解析、函数式编程等。你会建议 Common Lisp 而不是 Clojure?我知道它更快,但无论如何我都不打算用它做 OOP,而且我认为速度差异不会那么大,而 Clojure 有很多优点,比如面向并发。
              • 我不能说它是否比 Common Lisp 慢,在平均理想情况下它应该更快,因为它使用 JVM 和 Java 比 Common Lisp 快。如果您需要“通用”语言,我会建议 Common Lisp 而不是 Clojure。但是如果您需要功能强大且专注于并发性的函数式语言 - 然后选择 Clojure。
              【解决方案21】:

              为什么不Erlang

              • 它与您已经知道的语言不太像,因此您可以学习新概念
              • 它具有一些有趣的多处理功能
              • 这不是在学术界。 Erlang 首先是一种商业语言。
              • 其中至少编写了两个重要的开源应用程序:CouchDB 和 Wings3d

              【讨论】:

              • 这是我绝对想学习的语言,但我不确定它是否最适合“通用”编程。
              【解决方案22】:

              我相信通过 C C++ 和 Java 或 .net 然后从这里转到 java 或 .net 的任何一种方式,因为 c 更面向机器,而 C++ 和 java 将让你动手学习面向对象,然后稍后关于切换到 python(比 C C++ 和 JAVA 更喜欢干净的代码)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-09
                • 1970-01-01
                • 2010-09-06
                • 2010-09-08
                相关资源
                最近更新 更多