【问题标题】:What is the purpose of Scala programming language? [closed]Scala 编程语言的目的是什么? [关闭]
【发布时间】:2015-01-28 09:29:06
【问题描述】:

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

【问题讨论】:

  • 在我看来,有通用语言。
  • 可能是这样,但在我看来,Scala 并非如此。
  • Scala 是一种通用语言,如果您将 Java 视为一种通用语言。

标签: scala programming-languages


【解决方案1】:

talks by Martin Odersky 关于 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")
  }
} 

(还有更多这样的例子——我昨天发现了this one)。有很多关于 JDK7 中 Java 语言的新特性的讨论 (project coin)。其中许多功能是处理某些特定问题的特殊语法糖。 Scala 设计了一些简单的规则,这意味着不需要为每一个小烦恼都使用新的关键字。

【讨论】:

  • 这似乎是 Greenspun 第十条规则的一个方面。
  • 我同意这一点,但认为这是一个相当大的负面影响。维护软件需要学习足以解决您的问题并继续前进,而不必了解某些语言如何改变语法。此外,我认为每个开发人员的主要关注点应该是我如何让下一个人能够更轻松地进行这项工作。这就是我们使用 cmets、开发模式和编写良好的代码的原因。从这个角度来看,我并不认为 Scala 在很多情况下都有用,但是它对于实验性代码、小型团队和您希望替换而不是维护的代码非常有用
  • 我喜欢这样的想法,即您只需要对如何解决问题有足够的了解即可。大概你对你的车采取同样的态度 - 开车进入车库后感到不安,然后发现你不知道如何让它倒退才能再次把它拿出来。通常有一个积极主动和准备的地方。
  • 对我来说,我可以来审查现有代码并发现自己需要查找我在其他语言中习惯的各种奇怪的关键字重新定义(想想变量有多糟糕)经常被命名),关心我。我认为这就是@BillK 的意思。
  • @oxbow_lakes 不好的类比。这更像是处理租赁汽车——标准为我们提供了方向盘和其他常用工具的通用位置。如果每个驾驶汽车的人都可以永久更改每个组件的实现,那将是一辆有趣的汽车,但下一个试图退出车库的人可能会不小心撞到氮气。您可以在将 aiprot 与您的租赁一起离开之前研究手册 2 小时(假设最后一位司机甚至将他的 mod 写在手册中)——我想这将是积极主动的和准备好的,但真是太痛苦了。
【解决方案2】:

Scala 的另一个目标是弥合函数式面向对象 语言之间的差距。它包含许多受功能语言启发(即复制自!)的构造。我是非常强大的pattern-matchingactor-based concurrency framework 和(当然)一阶和高阶函数。

当然,您的问题是说有一个特定目的,我只给出了 3 个不同的原因;你可能不得不问 Martin Odersky!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 都是正确的,但对于许多其他基于 JVM 的语言也是如此。 Scala 与其他软件有何区别?从表面上看,它的标题特性已经在其他 JVM 语言中可用。
    • 他没有问 Scala 与其他 JVM 语言有什么区别
    • 哈哈 - 你比我更了解 Scala,skaffman - 随时编辑我的答案!
    【解决方案4】:

    同意之前的回答但是推荐An Overview of the Scala Programming Language的简介:

    Scala 的工作源于一项为组件软件开发更好的语言支持的研究工作。我们希望通过 Scala 实验来验证两个假设。首先,我们假设组件软件的编程语言需要可扩展,因为相同的概念可以描述小部分和大部分。因此,我们专注于抽象、组合和分解的机制,而不是添加一大组原语,这些原语可能在一定规模上对组件有用,但在其他级别上却没有用。其次,我们假设可以通过统一和概括面向对象和函数式编程的编程语言来提供对组件的可扩展支持。对于静态类型语言(其中 Scala 是一个实例),这两种范式迄今为止在很大程度上是分开的。 (奥德斯基)

    我个人会根据 Scala 解决哪些问题以及如何解决问题,将其与 Python 进行分类。显着的差异和偶尔的抱怨是类型复杂性。我同意 Scala 的抽象很复杂,有时看起来很复杂,但有几点:

    1. 它们也大多是可选的。
    2. 随着圈复杂度和代码行数的增加,Scala 的编译器就像免费的测试和文档。
    3. 如果实施得当,Scala 可以在一致且连贯的 API 后面执行所有几乎不可能的操作。来自Scala 2.8 Collections

    例如,一个字符串(或者更确切地说:它的支持类 RichString)可以被视为一个字符序列,但它不是一个通用的集合类型。然而,通过 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 会根据传递的函数参数的结果类型产生不同的类型! (奥德斯基)

    【讨论】:

      【解决方案5】:

      由于它是功能性的并且使用演员(据我了解,如果我错了,请发表评论)它可以很容易地将几乎任何东西扩展到任意数量的 CPU。

      也就是说,我将 Scala 视为一种新语言功能的测试平台。扔进厨房水槽,看看会发生什么。

      我个人的看法是,对于任何涉及超过 3 人的团队的应用程序,使用非常简单和限制性语法的语言会更有效率,因为整个工作变得更像是如何与他人互动,而不仅仅是编码让电脑做点什么。

      您添加的人越多,您将花费更多时间解释什么?:意味着或之间的区别 |和 ||应用于两个布尔值(在 Java 中,您会发现很少有人知道)。

      【讨论】:

      • 这就是为什么所有大型软件项目都是为通用图灵机编写的
      • 正如我所说,这是我个人的观点,并不被广泛接受。
      • Bill,你所描述的对我来说似乎是 Java 的基本前提。
      • 是的,我真的很欣赏 Java,但它变得太复杂了。随着泛型的添加,现在创建泛型类变得更加困难(这消除了最大的优势之一——创建类与使用类一样简单)。他们正在谈论添加更多语法。我会去掉一些语法,删除所有变量类型但私有的,并且可能对方法的大小和每个对象的方法数量施加严格的限制;但你是对的,简单是 Java 最大的区别之一。
      • Scala 可能是作为一个研究项目开始的,但它正在迅速成为一种非常实用的语言——大多数此类项目甚至从未想过要实现这一点。
      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多