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

use*_*109 40 programming-languages scala

我认为每种语言都是为特定目的而创建的.Scala创建的是什么以及它最好解决哪些问题?

oxb*_*kes 16

Martin Odersky在Scala上谈到的一件事是,它是一种可以很好地解决各种问题的语言.他不是在谈论性能意义上的缩放,而是从语言本身似乎可以通过库扩展.以便:

val lock = new ReentrantReadWriteLock
lock withReadLock {
   //do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

特别是scala语言的各种解析规则使得创建看起来像域特定语言(或DSL)的库变得非常容易.以scala-test为例:

describe("MyCoolClass") { 
  it("should do cool stuff") {
     val c = new MyCoolClass
     c.prop should be ("cool")
  }
} 
Run Code Online (Sandbox Code Playgroud)

(还有更多的例子 - 我昨天发现了这个例子).有很多关于JDK7中Java语言的新功能的讨论(项目硬币).其中许多功能都是处理某些特定问题的特殊语法糖.Scala的设计有一些简单的规则,意味着不需要为每一点烦恼提供新的关键字.

  • 我同意这一点,但认为这是一个非常巨大的负面影响.维护软件需要学习足以解决问题并继续学习,而不必理解某些语言如何改变语法.此外,我认为每个开发人员的主要关注点应该是如何让这个最容易让下一个人加入并开展工作.这就是为什么我们使用注释,开发模式和编写良好的代码.从这个角度来看,我并没有真正看到Scala在许多情况下是有用的,但它会为实验代码,小团队和代码提供支持,而您希望替换而不是维护 (4认同)

oxb*_*kes 13

Scala的另一个目标是弥合功能面向对象语言之间的差距.它包含许多受启发(即复制自!)功能语言的结构.我是强大的模式匹配,基于actor的并发框架和(当然)一阶和更高阶函数.

当然,你的问题说有一个特定的目的,我刚刚给出了3个不同的理由; 你可能不得不问Martin Odersky!


oxb*_*kes 7

另外一个原始设计目标当然是创建一种在Java虚拟机上运行并且与Java类完全互操作的语言.这有(至少)两个优点:

  • 您可以利用JVM的普遍性,稳定性,功能和声誉.(想想管理扩展,JIT编译,高级垃圾收集等)
  • 您仍然可以使用所有您喜欢的Java库,包括第三方和您自己的Java库.如果情况并非如此,那么在许多情况下(例如我的)商业上使用Scala将是一个重大障碍.


Tex*_*xas 7

同意以前的答案,但建议Scala编程语言概述简介:

Scala的工作源于为组件软件开发更好的语言支持的研究工作.我们希望通过Scala实验验证两个假设.首先,我们假设组件软件的编程语言需要是可扩展的,因为相同的概念可以描述小部件和大部件.因此,我们专注于抽象,组合和分解的机制,而不是添加大量原语,这些原语可能对某些规模级别的组件有用,但不适用于其他级别.其次,我们假设可以通过编程语言提供对组件的可扩展支持,该编程语言统一并概括了面向对象和函数编程.对于静态类型语言,其中Scala是一个实例,这两种范例到目前为止基本上是分开的.(Odersky的)

我个人将Scala与Python一起分类,解决了它解决的问题和方法.明显的差异和偶尔的抱怨是类型复杂性.我同意斯卡拉的抽象是复杂的,有时看似令人费解,但有几点:

  1. 他们也大多是可选的.
  2. Scala的编译器就像免费测试和文档,因为圈复杂度和代码行升级.
  3. 当适当地实现时,Scala可以执行一致且连贯的API背后的所有但不可能的操作.来自Scala 2.8 Collections:

例如,String(或者更确切地说:它的支持类RichString)可以看作是Chars序列,但它不是通用的集合类型.然而,通过RichString将字符映射到字符映射应该再次产生RichString,如下面与Scala REPL的交互:

scala> "abc" map (x => (x + 1).toChar)
res1: scala.runtime.RichString = bcd
Run Code Online (Sandbox Code Playgroud)

但是如果将Char中的函数应用到字符串中会发生什么呢?在这种情况下,我们不能生成一个字符串作为结果,它必须是一些Int元素序列.确实有人得到:

"abc" map (x => (x + 1))
res2: scala.collection.immutable.Vector[Int] = Vector(98, 99, 100)
Run Code Online (Sandbox Code Playgroud)

所以事实证明,map会产生不同的类型,具体取决于传递的函数参数的结果类型!(Odersky的)