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

时间:2011-01-07 03:23:26

标签: architecture scala

为什么我要为新项目选择Scala而不是其他语言?它在哪些方面表现优异?

注意

给出了一些很好的答案,遗憾的是我只能将一个标记为已接受的答案。但总的来说,Scala的吸引力似乎来自两个主要方面:

  1. 对并发的出色支持
  2. 吸引顶尖工程人才

7 个答案:

答案 0 :(得分:43)

首先阅读:The free lunch is Over

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

为了利用未来的机器,您的软件必须能够利用所有这些并发性,而Java的当前线程原语在这里无济于事。让我们面对现实,在当前主流范式下的并发编程是疯狂的。

Scala是一种功能语言。因此,它完全包含诸如不变性,for-comprehensions,闭包等概念。它还有4个本机actor库(最后统计)。所有这些都非常适合下一代并发编程。你不能埋头苦干,并假装这些都不存在 - 就像在1995年写一个程序只存储2位数年 - 命令性循环根本就不会切它了!

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在哪个领域表现出色?我想那个区域必须是“未来”......

答案 1 :(得分:15)

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

答案 2 :(得分:11)

Scala在JVM上运行,与Java完全兼容。事实上,就你可以做什么以及如何工作而言,它与Java几乎完全相同,所以你可以使用Scala来做任何事情,Java也是一个不错的选择(特别是:企业环境和跨平台应用程序)。根据{{​​3}},它是网络服务的理想选择。

至于是什么让它比任何给定任务更好/更差,嗯,我会让Introduction to Scala进行交谈。

答案 3 :(得分:10)

Scala做了很多事情:

  • XML。 Scala的XML API非常好。
  • 静态输入。像Scala这样的类型推断比更明确的静态类型更简洁,更易理解(尽管它也有其优点)。对于不需要太多打字的语言(与其他语言相比),它表现良好。
  • 模式匹配; Scala中的case语句非常强大
  • 继承。 Mixin特性很棒,它们肯定会减少代码重复
  • 并发(演员模型比线程模型,IMO更容易消化)

Scala开发的良好用例?任何涉及XML,并发应用程序或函数式编程优先的情况(很多情况)。

为什么你更喜欢Scala而不是其他语言?你不一定。我认为对于一个以Java实现的项目来说,它是一个很好的选择,因为它比Java具有一些具体的优势。

一个来自Twitter的人实际上把a slideshow on why they chose Scala放在一起,他和我有很多相同的点(还有一些)。

答案 4 :(得分:10)

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

在某些情况下,动态类型(JRuby,Jython,Groovy)或元编程功能(Clojure)可以为您提供初始优势,但没有任何其他功能可以像Scala那样扩展,并且可以为您提供自由地根据需要混合范式,因为项目越大越好,因为使用Scala可以获得更大的优势。

[更新] 回答问题:

  • 是的,找到Scala程序员比找Java程序员更难,但很可能你会得到更好的人。当然不是因为所有Java程序员都不好,而是因为大多数Scala程序员都是优秀的Java程序员,他们觉得Java语言的局限性太受限制了。
  • Erlang是一种很棒的语言,特别是Actor概念。 Scala遵循了这个例子,所以你现在可以在JVM上使用几个Actor框架(公平地说,Akka既有Scala又有Java接口)。然而,Erlangs类型系统看起来非常简单(例如没有类型多态),恕我直言,对于一些复杂的结构来说太简单了。当然,每个人都羡慕Erlangs进行热代码交换的能力,但我想如果没有对JVM(或.NET)进行根本性更改,就无法模拟它。
  • 很难说哪些功能是最重要的功能,因为有很多功能,但我会尝试命名一些亮点:Scala可以完成功能语言可以做的大多数事情(参见例如Scalaz库),但宏(如果一种语言不是同音的话,那就不那么有用了。功能和OO功能的集成比任何其他主流语言更紧密(我知道,有Beta,Self,IO,Ioke,Bla ......),这会产生很多协同作用。 Scala的类型系统起初可能看起来令人生畏,但是构建库和DSL(Scala比Java好得多的另一个区域)通常需要可怕的东西:Scala具有更高阶类型(如Haskell),这是一个强大的概念我们只是开始利用。隐式转换是一个令人难以置信的有用且灵活的工具,它允许模拟类型类和其他魔法。抽象类型变量有时是参数类型的非常有用的替代方法。模式匹配是功能性的民间传说,但也适用于OO。类型推断(尽管不如Hindley-Milner那样好)减轻了使用静态类型系统的负担,使得语言非常“潦草”而不会牺牲类型安全性。

答案 5 :(得分:5)

Scala是JVM上最好的静态类型。

这是Scala高级类型系统的结果,功能的正交性,编写它的方式使它可以通过库无缝扩展,并且易于与现有Java代码集成。

我可以列出这些功能,但如果不懂语言就没有意义。我可以说Scala有正确执行的定义 - 站点差异声明,但是如果没有经历过它会如何衡量?

然而,结果是用Scala编写的代码快速,紧凑,可靠并且指示了问题的范围。这也适用于所有级别,因此Scala 也是这样。

让我们在这里讨论一些替代方案,以区分清楚。

有非JVM语言,但是关于是否使用JVM语言的决定几乎与关于语言本身的决定完全分开。这是在选择语言之前必须做出的技术决定。因此,我只是将Scala与其他JVM语言进行比较。

大多数其他JVM语言都是动态类型的。虽然在动态类型语言和静态类型语言之间进行选择时需要考虑一些因素,但最终真正有所作为的是个人偏好。否则,只需参考有关动态类型和静态类型语言的许多资源之一。

就JVM上的静态类型语言而言,Scala拥有最先进的类型系统。事实上,据我所知,它几乎是单独的 1 ,它的类型系统受到实际类型系统理论的启发,而不是根据语言实现者的偏好和经验被黑客攻击。

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

因此,如果您选择JVM并进行静态类型化,并且您可以灵活选择语言,那么无论该项目是什么,Scala都是该项目的最佳语言。

脚注

  1. 我原来写的没有其他人。现在,请注意,我很高兴被证明是错误的,并在此列出此规则的任何例外情况。到目前为止,我只能想到Fortress

答案 6 :(得分:4)

对于我自己的私人项目,我已经采用Scala作为Java的自然继承者(出于其他答案中提到的原因)。但我非常犹豫地建议Scala开发工具(尤其是IDE)适合大规模的商业项目。即IDE重构支持,我认为这对于敏捷开发是强制性的,不符合Java标准,(使用当前的IDEA 10,每晚构建插件)。

此外,我认为公司很难找到Scrum规模的Scala开发团队。另请参阅David Copeland撰写的视频“Sneaking Scala Into Your Organization”:http://days2010.scala-lang.org/node/138/169

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