Scala编程语言的目的是什么?

41

我认为每种语言都是为特定目的而创建的。Scala是为什么而创建的,它最擅长解决什么问题?


12
我认为,有一些通用的编程语言。 - Svante
也许吧,但在我看来,Scala 不是这种情况。 - user68109
Scala是一种通用语言,如果您将Java视为通用语言的话。 - Jus12
5个回答

16

马丁·奥德斯基在讲Scala方面提到的一件事是它是一种能够良好扩展以解决各种问题的语言。他并不是在谈论性能方面的扩展,而是指这种语言本身可以通过库的方式进行扩展。

val lock = new ReentrantReadWriteLock
lock withReadLock {
   //do stuff
}

看起来处理 j.u.c 锁有一些特殊的语法糖。但事实并非如此,它只是以这种方式使用 Scala 语言,使其看起来像是有语法糖。代码更易读了,不是吗?

特别是 Scala 语言的各种解析规则使得创建类似于特定领域语言(DSL)的库非常容易。例如看看 scala-test:

describe("MyCoolClass") { 
  it("should do cool stuff") {
     val c = new MyCoolClass
     c.prop should be ("cool")
  }
} 

(这方面还有很多例子 - 我昨天发现了这个)。有很多讨论关于JDK7中Java语言将加入哪些新功能(coin项目)。其中许多功能都是特殊的语法糖,用于处理某些特定问题。Scala已经设计了一些简单规则,意味着不需要为每个小烦恼添加新关键字。


4
我同意这个观点,但认为这是一个相当严重的负面影响。维护软件只需要学习足够解决问题并继续前进的知识,而不必理解语言如何改变语法。此外,我认为每个开发者的首要关注应该是如何让接下来的人最容易地进行工作。这就是为什么我们使用注释、开发模式和书写良好的代码。从这个角度来看,我并没有真正看到Scala在许多情况下有用,但对于实验性代码、小团队和你期望替换而不是维护的代码方面它非常优秀。 - Bill K
我喜欢这个想法,即你只需要知道如何解决问题,而不需要更多。大概你对待汽车的态度也是一样的——在开进车库后发现不知道如何倒车把它开出去时感到沮丧。通常有一个积极主动和准备的地方。 - oxbow_lakes
1
对我来说,我可能需要查找各种奇怪的关键字重新定义(考虑到变量通常命名不佳)时,我会感到担忧,因为这意味着我需要审查现有代码。我认为这就是@BillK所说的。 - deed02392
@BillK 我已经使用Scala编程超过一年了,并发现该代码非常容易维护。我不同意你对实验性代码的评估。Scala是一种稳定、功能丰富且设计良好的语言;而且,它正在变得越来越好。 - Tim Harper
我们最近为我们的后端团队添加了两名新工程师。对于他们来说这肯定是一个深入学习的过程,但是他们在前两周内就开始做出了贡献。(他们来自C# / Java背景) - Tim Harper
显示剩余3条评论

13
另一个 Scala 的目标是弥合函数式和面向对象语言之间的差距。它包含许多受到函数式语言启发(即复制自)的构造。我指的是非常强大的模式匹配, 基于 Actor 的并发框架,以及(当然)一阶和高阶函数。
当然,你的问题说有一个具体的目的,而我刚刚给出了三个不同的理由;你可能需要问 Martin Odersky!

7
同意之前的回答,但我建议阅读《Scala编程语言概述》
Scala的工作源于为组件软件开发更好的语言支持的研究工作。我们有两个假设想要通过Scala实验来验证。首先,我们假设用于组件软件的编程语言需要是可扩展的,即相同的概念可以描述小部分和大部分。因此,我们集中在抽象、组合和分解机制上,而不是添加一大堆原语,这些原语在某个级别的组件上可能有用,但在其他级别上却没有用。其次,我们假设可以通过统一和泛化面向对象和函数式编程来提供可扩展的组件支持。对于Scala这样的静态类型语言,这两种范式到目前为止在很大程度上是分离的。(Odersky)
个人认为Scala与Python类似,解决问题的方法也类似。明显的区别和偶尔的抱怨是类型复杂性。我同意Scala的抽象有时很复杂,看起来有点曲折,但有几点值得注意:
1.它们大多数情况下是可选的。 2.Scala的编译器就像免费的测试和文档,随着圆复杂性和代码行数的升级而升级。 3.当Scala得到恰当的实现时,它可以在一致且连贯的API背后执行原本几乎不可能完成的操作。从Scala 2.8集合中可以看出:
例如,一个字符串(或者更确切地说是其后备类RichString)可以被看作是Char序列,但它并不是一个通用的集合类型。然而,对RichString进行字符到字符的映射应该会生成一个新的RichString,就像下面与Scala REPL的交互中所示:
scala> "abc" map (x => (x + 1).toChar)
res1: scala.runtime.RichString = bcd

但是,如果将一个从Char到Int的函数应用于一个字符串,会发生什么呢?在这种情况下,我们无法产生一个字符串作为结果,而必须是一些Int元素的序列。事实上,我们得到的是:
"abc" map (x => (x + 1))
res2: scala.collection.immutable.Vector[Int] = Vector(98, 99, 100)

原来,根据传递给函数参数的结果类型,map函数会产生不同的类型!(Odersky)

7

原始设计目标之一是创建一种能够在Java虚拟机上运行并与Java类完全互操作的语言。这至少有两个优点:

  • 您可以利用JVM的普及性、稳定性、功能和声誉。(考虑管理扩展、JIT编译、高级垃圾回收等)
  • 您仍然可以使用所有喜爱的Java库,包括第三方和自己的库。如果不能这样做,将会成为许多情况下(例如我的情况)商业使用Scala的重大障碍。

所有的陈述都是正确的,但也同样适用于许多其他基于JVM的编程语言。那么,什么使Scala不同于其他语言呢?表面上看,它的主要特点在其他JVM语言中已经存在。 - skaffman
他没有问什么区别了Scala和其他JVM编程语言。 - oxbow_lakes
哈哈 - 你比我更了解Scala,skaffman - 随意编辑我的回答! - oxbow_lakes

2

由于它是功能性的并且使用了演员(如果我理解有误,请评论),因此它使得将几乎任何东西扩展到任意数量的CPU变得非常容易。

话虽如此,我认为Scala是一种新语言特性的试验平台。把所有东西都扔进去,看看会发生什么。

我的个人看法是,对于涉及超过3人团队的任何应用程序,您可以通过使用非常简单和限制性的语法来提高工作效率,因为整个工作变得更多地与他人互动而不仅仅是编写代码让计算机执行某些操作。

您添加的人越多,您花费的时间就越多,解释 ?: 的含义或两个布尔值之间的|和||的区别(在Java中,您会发现很少有人知道)。


这就是为什么所有大型软件项目都是为通用图灵机编写的原因。 - oxbow_lakes
正如我所说,这只是我的个人观点,并不被广泛认同。 - Bill K
Bill,你所描述的似乎是Java的基本前提。 - Svante
是的,我真的很欣赏Java,但它变得越来越复杂了。随着添加泛型,现在更难创建通用类(这消除了最大优势之一——创建类就像使用类一样简单)。他们正在谈论添加更多语法。我会删除一些语法,除了私有变量以外所有变量类型都删掉,并且可能对方法的大小和每个对象的方法数设置硬限制。但你说得对,简单性是Java最大的区别之一。 - Bill K
并不是说万能语言没有用处!Ruby非常有趣,Scala也有一些很棒的概念等等。只是如果我被迫与一个不太“热爱”编程的团队一起工作,我不想使用除Java以外的任何语言。 - Bill K
2
Scala可能最初是一个研究项目,但它正在迅速成为一种非常实用的语言 - 这是大多数这样的项目从未想过实现的东西。 - Marcus Downing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接