11

在接下来的 3 年中,我将不得不使用非常特定的第三方 API 来处理 JVM(项目要求)。他们想要 Java,但我有离开 Java 的余地。我希望我们可以回到 .NET 框架,这样我就可以在 F# 中开发代码,我完全爱上了 OCaml。.NET 开发已被我们的客户打断。这是不行的。

我已经转向查看、阅读和浏览编程博客/论坛,试图了解哪种语言可能更吸引我:Scala 或 Clojure。那些似乎拥有最大的社区/粉丝群。在 ML 语言方面经验丰富,我看到很多人将 Scala 与 ML 进行比较。然而,在进行这种比较时,也有一些真正的反对者。如果 Scala 与机器学习如此接近,那么我的生产力和学习曲线将受益于进行此转换。

互联网上充满了错误信息,我想知道我是否正在遭受这样的痛苦。我不喜欢 Lisp 的语法(不要伤害我!),但如果 Scala 有我正在阅读的缺陷(IDE 支持不佳、不断变化的单元测试框架、性能问题),我想知道 Clojure 是否更好选项。我想从一开始就提高生产力,将函数用作一流的对象,并最大限度地减少并发痛苦。

所以无论如何,在我在互联网上花费太多时间而不工作之前......我被JVM困住了,厌倦了Java并且想知道去哪里?

4

11 回答 11

25

在我看来,Clojure 和 Scala 都没有很好的 IDE 支持,如果这对你来说真的很重要的话。也就是说,这就是我可以从我的阅读和经验中收集到的东西。

Scala 的优点

  • 由于更多的静态类型,比 Clojure 更快
  • 更接近 ML(语法、类型导向编程)
  • 更大的标准 API(Clojure 的 API 增长非常缓慢,因为他们希望确保在公开之前找到最好的习语。也就是说,Clojure 仍然有半官方的补充 API)
  • 与典型的 Java 工具集更好的集成实践(Clojure 仍在做出一些选择,因此在这方面还不太确定)
  • 比 Clojure 更早(但 Clojure 建立在一个非常古老且经过验证的核心之上:Lisp)
  • 人们说它有机会成为主流,但他们不会对 Clojure 这么说

Clojure 的优点

  • 得益于基于 MVCC 的 STM其他并发机制,并发非常简单、快速和正确
  • 默认情况下的不变性有助于首先做正确的事情
  • 更稳定的标准API
    • 当事情发生变化时,通常您不必重写任何现有代码
    • (Scala 的集合正在重新制作 2.8)
    • (我还在某处读到,众所周知,Scala 的 Actors 实现需要重新思考和重写。)
  • 更容易学习(小语言,是一个(非常干净的)Lisp)
  • 一个让你通过学习不同的东西来成长的机会
  • Clojure 的性能只会随着时间的推移而变得更好;编译器仍有很好的优化空间
  • Scala 与 Java 的联系感觉比 Clojure(Scala 和 Java 的静态类型系统之间的交互)更具限制性。对于 Clojure,有时可能会这样说(面向对象的支持不是 1:1 的,但对此的支持很快就会变得更好)
  • Rich Hickey 具有做出选择的天赋,使 Clojure 处于技术领先的位置,这些功能将在接下来的几十年中被其他语言采用。而且他也有解释他们的天赋。所以今天在 Clojure 中使用它们,或者等待几年后在另一种语言中使用它们。:)

关于分布式并发

如果你的并发需求是分布式的,除非你在 Terracotta 或类似的东西上运行它,否则 Clojure 还没有任何东西,在这种情况下你将能够使用它的所有并发特性。如果这样做,您最终将获得比使用 Scala 的 Actors, IMO 更好的分布式并发体验。

结论

IMO Scala 试图做所有事情,并成功地完成了大部分工作。Clojure 并没有尝试同样的事情,但它所关注的已经绰绰有余,而且非常成功,以至于大多数真正了解 Clojure 的人都不想回到其他领域。披露:我个人的偏好当然是 Clojure。我希望我能够客观地写出我所写的东西。

于 2009-09-24T19:23:25.600 回答
10

你考虑过 Groovy 吗?我认为它的功能不如 Scala/Clojure,但它肯定比 Java** 更实用。一般而言,我可以在 Groovy 中完成相同的工作,只需使用 Java 所需的大约 50% 的代码。

这是因为 Groovy 在语法上与 Java 相似,并提供对 JDK 库的无缝访问,但添加的许多语言特性(闭包、元编程、属性)和动态类型几乎消除了与 Java 编程相关的所有样板。

** 我的意思是“函数式编程”而不是“正常工作”意义上的函数式

于 2009-09-24T18:12:15.850 回答
10

我将解决你提出的关于 Scala 的观点。

  • IDE 支持

    Scala 没有 Java 具有的相同级别或 IDE 支持——或者,就此而言,F# 与 VS10 应该具有相同的级别或 IDE 支持。

    也就是说,它在 Java 之外的 JVM 上拥有最好的(甚至可能是最好的?)IDE 支持之一。现在 NetBeans 已经足够好了,人们一直说 IDEA 更好(传闻)。Eclipse 插件虽然不稳定。

    但是您提到了 3 年的范围,一旦 Scala 2.8 发布,对 Scala 的 IDE 支持应该会大大增强,因为它将为 IDE 提供一些编译器支持。没有确定发布日期,但它看起来是在接下来的六个月内,也许是三个月内。Eclipse 插件将随之更新。

  • 在通量单元测试框架中

    是的,如果您的意思是它充满活力、不断发展并得到很好的支持,而不是停滞不前和被遗弃。ScalaTest、Specs 和 ScalaCheck 是顶级框架,它们之间相互兼容,并且与其他 Java 框架和库(例如 JUnit 和 JMock)兼容。

    事实上,测试框架几乎是 Scala 的小海报。

    编辑: Scala 在其标准库(scala.testing.SUnit)中有基本的单元测试支持。然而,鉴于出现了许多优秀的、积极支持的和免费的替代品,它已被弃用,并且可能不会成为随 Scala 2.8 提供的库的一部分。

  • 性能问题

    我不知道有什么,除了你可以写糟糕的代码,就像使用任何其他语言一样。不习惯函数式编程的人经常会做一些效率不高的事情,例如不使用尾递归或连接列表,而 Scala 启用的范式转换将这一点暴露出来。

    无论如何,您可以像编写 Java 代码一样快地编写 Scala 代码(使用一些即将推出的功能甚至更快)。您可以编写具有功能特性的 Scala 代码,其速度几乎与 Java 代码一样快。

于 2009-09-24T19:45:14.553 回答
9

坦率地说,再找一份工作。

如果你在接下来的三年里对你正在做的事情感到不舒服,你应该考虑寻找更有吸引力的替代品。

即使您设法获得了自己喜欢的语言,如果您是团队的一员(我猜您是),团队的其他成员可能不喜欢该语言。如果其他人用 Java 编写代码,而您使用“填空”编程语言,那么可能会出现问题。

毕竟没那么糟糕。

和你的老板谈谈,让他知道你的感受。开始寻找替代品,享受一个美好而专业的“假期”。

你没有理由不能和现在的老板保持良好的关系。如果最终他们有一个新的 .net 项目,你可能会回来。也和他们谈谈这件事。让你的门敞开。

于 2009-09-24T18:31:25.017 回答
6

它不是真正的零和游戏,全部学习!
ps:我投票给Clojure,我觉得它最好玩!

于 2009-09-24T19:01:34.940 回答
5

您应该认为自己很幸运可以使用 JVM,因为 JVM 在替代编程语言中变得越来越流行,而不是 Java。

除了 Java,还有GroovyScalaClojure(JVM 上的 Lisp 方言)、JRuby(JVM 上的 Ruby)、Jython(JVM 上的 Python)、Jaskell(JVM 上的 Haskell)、Fan(在 JVM 上运行以及.NET CLR)等等,还有一个OCaml-Java,在 JVM 上运行的 OCaml。

因此,在 JVM 上的编程语言有很多选择,从纯粹的函数式到简单的脚本和先进的 OO 语言。

于 2009-09-24T19:35:46.150 回答
3

对 Scala 和 Clojure 的工具支持可能还不成熟,但它正在稳步改进。

既然你喜欢 F#,那么 Scala 很可能是你最好的选择。我说尝试一下并形成你自己的意见——你可能会发现人们抱怨的事情对你来说并不重要,或者你可以解决的事情。

于 2009-09-24T18:18:54.777 回答
2

不要忘记 jRuby,并注意 IDE 对于非 Java 是可选的

我认为你的情况很好。有多少人获得选择实施语言的许可?对于 JVM 可用的所有内容,选择您的环境并没有太大的限制。

  • 您不需要在不太冗长的语言中提供出色的 IDE 支持
  • 在没有类型声明的像 Ruby 这样强大的语言中,您根本不需要 IDE
  • Scala 是专门为解决verbose-java-blues 而开发的
  • 算你自己幸运,你有三年的工作排队:-)
  • Clojure 可能很有趣,并提供功能并发安全的设计模式
于 2009-09-25T03:31:51.173 回答
0

没有?http://code.google.com/p/noop/(虽然是实验性的)

于 2009-09-24T18:11:01.987 回答
0

在 IDE 支持和您遇到的其他疑问方面,Clojure 的表现并不比 Scala 好。对于具有 ML/F# 背景的人(或者通常具有严格的静态类型 FP 语言背景的人),您肯定会发现 Scala 更接近您所习惯的。

于 2009-09-24T21:00:39.163 回答
0

如果您喜欢 ML,您可能会喜欢CAL,它或多或少是用于 JVM 的 Haskell 98。

它质量高且非常稳定,并且在 Eclipse 上具有良好的 IDE 支持,但遗憾的是不再处于积极开发中。

于 2009-09-26T21:01:46.810 回答