【问题标题】:What compromises Scala made to run on JVM?Scala 为在 JVM 上运行做出了哪些妥协?
【发布时间】:2011-02-10 13:54:00
【问题描述】:

Scala 是一门很棒的语言,但我想知道如果它有自己的运行时如何改进?
IE。由于 JVM 的选择而做出了哪些设计选择?

【问题讨论】:

    标签: scala jvm language-design scala-2.8 jvm-languages


    【解决方案1】:

    我知道的两个最重要的妥协是:

    • type erasure ("reflecting on Type"):必须 manage a Manifest 才能绕过 Java 编译(独立于 JVM,出于向后兼容性的原因)。
    • 原始类型的集合:例如:arrays

      Scala 2.8 中处理数组的新方案。该方案依赖于隐式转换和清单来集成数组,而不是装箱/拆箱和其他编译器魔法

    在管理泛型类型(有界限)方面,这是 JVM 的两个主要限制:Java JVM 不保留泛型对象中使用的确切类型,它具有“原始”类型。


    但你也可以考虑:

    为了涵盖尽可能多的可能性,Scala 提供了:

    • 常规类类型,
    • 值类类型,
    • 不可为空的类型,
    • Monad 类型,
    • 特征类型,
    • 单例对象类型(过程模块、实用程序类等),
    • 复合类型,
    • 函数类型,
    • 案例类,
    • 依赖路径的类型,
    • 匿名类型,
    • 自我类型,
    • 类型别名,
    • 泛型类型,
    • 协变泛型,
    • 逆变泛型,
    • 有界泛型类型,
    • 抽象类型,
    • 存在的类型,
    • 隐式类型,
    • 增强类型,
    • 查看有界类型,以及
    • 在所有其他方法都失败时允许进行某种形式的鸭子类型的结构类型

    【讨论】:

    【解决方案2】:

    This article 是与 Martin Odersky(Scala 的创建者)的讨论,其中包括在 Scala 中为与 Java 兼容而做出的妥协。文章提到:

    1. 方法的静态重载
    2. 兼具特质和类别
    3. 包含null 指针。

    【讨论】:

      【解决方案3】:

      运行时的问题比文化遗留问题要少:普遍平等、散列、toString。

      与 VM 的联系更紧密:默认评估严格、不纯函数、异常。

      【讨论】:

      • +1 表示普遍相等和散列。通用toString有什么问题?
      • 1) 很容易不小心将Object#toString 显示给用户。 2) Collection[A]#toString 在显示A 类型元素的方式上不灵活。请参阅scalaz.Show 了解替代方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2010-12-02
      相关资源
      最近更新 更多