使用Scala进行新开发的最佳用例是什么?

为什么我应该select另一种语言的Scala来完成一个新的项目? 它在哪些领域擅长?

注意

有几个很好的答案给出,遗憾的是我只能标记为接受的答案。 不过,总的来说,Scala的吸引力来自两个主要的东西:

  1. 优秀的并发支持
  2. 吸引顶尖的工程人才

首先阅读: 免费午餐结束

并发性变得越来越重要。 我们已经有1000个核心处理器被演示了,现在的计算机还没有配备能够高度并行运行的GPU?

为了充分利用未来的机器,你的软件必须能够利用所有这些并发性,Java的当前线程原语在这里不会有帮助。 让我们面对现实,在当前主stream范式下的并发编程是疯狂的。

Scala是一种function性语言。 因此,它完全包含了不变性,理解性,封闭性等概念。它还有4个可用的本地演员图书馆(最后统计)。 所有这些都非常适合下一代并发编程。 你不能把自己的头埋在沙子里,假装没有这个存在 – 这就像写了一个1995年的只存储两位数年的程序 – 命令循环根本不会再削减它!

Scala 2.9将于2011年初发布,将支持并行操作,如:

List(1,2,3,4).par map { 2 * _ } //one thread for each input value in the list! 

除此之外,Scala可以完成Java所做的一切,通常使用更简洁的语法。 它也比Java更具有面向对象的特性(有它的基元和静态方法),这个事实在一个错误的信念中经常被忽略,即对象定向和函数式编程是相互排斥的。

Scala在哪些方面performance突出? 我想这个领域应该是“未来”…

我个人对Landei的回答的评论提出了一个使用Scala的强有力的理由:如果你希望你的项目/团队/公司吸引那些有前瞻性,才华横溢的工程师,而不是那些从Reed的CS选修课拿到一些Java的人,在过去的八年里,一直在为Visa International的内部人力资源系统编写JSP页面,那么您需要一个更有趣的语言select。

Scala在JVM上运行,并与Java完全兼容。 事实上,在Java中你可以做什么以及它是如何工作的,所以你可以使用Scala做任何事情,Java也是一个不错的select(特别是:企业环境和跨平台的应用程序)。 根据Scala简介,它是Web服务的理想select。

至于什么使任何给定的任务比Java更好/更糟糕,那么我会让这篇文章进行讨论。

Scala显然是JVM上最好的通用武器。 Scala可以完成Java所能做的一切,几乎总是Scala能够做得更好(与Java的互操作性非常好),所以恕我直言,没有充分的理由为新项目考虑Java。

有几种情况下,dynamictypes(JRuby,Jython,Groovy)或元编程function(Clojure)可以给你一个初始的优势,但没有什么比Scala更好的了,并且可以让你自由地混合你需要它的范例,所以随着项目越来越大,越大越好使用Scala。

[更新]针对以下问题:

  • 是的,findScala程序员比findJava程序员更困难,但很可能你会find更好的人。 当然不是因为所有的Java程序员都不好,而是因为大多数Scala程序员都是优秀的Java程序员,他们被Java语言的限制所限制。
  • Erlang是一门伟大的语言,尤其是Actor的概念。 Scala遵循这个例子,所以你现在有几个Actor框架可用在JVM上(公平地说,Akka同时具有Scala和Java接口)。 然而,Erlangstypes系统似乎很简单(例如没有types多态),恕我直言,一些复杂的结构太简单了。 当然,每个人都羡慕Erlangs热代码交换的能力,但我想这不能在JVM(或.NET)没有根本改变的情况下被模拟,
  • 很难说哪些function是最重要的function,因为有太多的function,但我会尝试命名一些亮点:Scala可以做function语言可以做的大部分function(参见例如Scalaz库),除了macros(更less如果语言不是homoiconic有用)。 function和面向对象function的集成比任何其他主stream语言(我知道,有Beta,Self,IO,Ioke,Bla …)更紧密,这产生了很多协同作用。 起初Scala的types系统可能看起来很吓人,但是构build库和DSL(Scala比Java更好的另一个领域)需要使用可怕的东西:Scala具有高阶types(像Haskell),这是一个强大的概念,我们只是开始利用。 隐式转换是一个令人难以置信的有用和灵活的工具,它允许模拟types和其他魔法。 抽象typesvariables是参数types的一个非常有用的select。 模式匹配是function性的民间传说,但是对于面向对象也是非常出色的。 types推理(虽然不如Hindley-Milner)减轻了静态types系统的负担,使语言非常“脚本化”,而不牺牲types安全性。

斯卡拉做了几件事情:

  • XML。 Scala的XML API非常好。
  • 静态打字。 像Scala这样的types推断不如更明确的静态types(尽pipe这也有其好处)更简洁和更容易理解。 对于不需要太多input的语言(与其他语言相比),它performance良好。
  • 模式匹配; 在Scala中的case语句是超级强大的
  • 遗产。 Mixin的特点是伟大的,他们绝对减less代码重复
  • 并发性(主angular模型比线程模型,IMO更容易理解)

好的Scala开发用例? 任何处理XML,并发应用程序或function性编程的情况(很多情况下)。

为什么你应该比其他语言更喜欢Scala? 你不一定。 我认为这是一个用Java实现的项目的好select,因为它比Java有一些具体的优势。

一个来自Twitter的人实际上把他们为什么selectScala的幻灯片放在了一起,他提出了很多和我一样的观点(还有几个)。

Scala是JVM上最好的静态types。

这是Scala先进types系统的结果,function的正交性,写作的方式,以便可以通过库无缝扩展,以及与现有的Java代码轻松集成。

我可以列出这些function,但如果不知道语言,这将是毫无意义的。 我可以说斯卡拉有定义网站声明的差异与正确的执法,但如何一个人会测量,而没有经历过呢?

但是,结果是用Scala编写的代码是快速,紧凑,可靠和指示问题的领域。 这在各个层面都是有效的,所以Scala 也是这样的。

让我们来讨论一下这里的替代方法,以明确区分。

有一些非JVM语言,但决定是否使用JVM语言几乎完全脱离了语言本身的决定。 这是在select语言之前必须做出的技术决定。 因此,我只是将Scala与其他JVM语言进行比较。

大多数其他JVM语言都是dynamicinput的。 虽然在dynamictypes语言和静态types语言之间进行select时需要考虑一些因素,但真正有所作为的是个人偏好。 否则,只能引用关于dynamictypes和静态types语言的许多资源之一。

就JVM上的静态types语言而言,Scala拥有最先进的types系统。 实际上,据我所知,基于语言实现者的偏好和经验,一种基于实际types系统理论的types系统,而不是基于一种黑客入侵的系统几乎是独一无二的。

例如,Java没有安全的方差。 其他语言与Scala相反,通过在语言本身提供“最常见的”数据结构,使任何人都不可能将其他复杂的数据结构编写为库。

因此,如果您selectJVM并进行静态types化,并且您可以灵活地select语言,那么无论项目如何,Scala都是该项目的最佳语言。

脚注

  1. 我原本写的没有其他人。 现在,请记住,我很乐意被certificate是错误的,并且在这里列举这个规则的任何例外。 到目前为止,我只能想到Fortress 。

对于我自己的私人项目,我已经采用了Scala作为Java的自然inheritance者(出于其他答案中提到的原因)。 但是我很犹豫build议Scala开发工具(特别是IDE)适合于大型商业项目。 即IDE重构支持,在我看来是敏捷开发的强制性,不符合Java标准,但(使用当前的IDEA 10,每晚构build插件)。

另外,我认为企业很难想出Scrum大小的Scala开发人员团队。 另请参阅David Copeland的video“潜入你的组织”: http : //days2010.scala-lang.org/node/138/169

就目前而言,我可以想象将更小的Scala模块混合到更大的Java项目中。