Scala 是一门很棒的语言,但我想知道如果它有自己的运行时如何改进?
即,由于 JVM 的选择而做出了哪些设计选择?
问问题
1564 次
3 回答
26
我知道的两个最重要的妥协是:
- 类型擦除(“反射类型”):它必须管理一个 Manifest以绕过 Java 编译(独立于 JVM,出于向后兼容性的原因)。
- 原始类型的集合:例如:数组
Scala 2.8 中处理数组的新方案。该方案依赖于隐式转换和清单来集成数组,而不是装箱/拆箱和其他编译器魔术
在管理泛型类型(有界限)时,这些是 JVM 的两个主要限制:Java JVM 不会在泛型对象中保留确切的类型使用,并且它具有“原始”类型。
但你也可以考虑:
- JVM 还没有完全支持尾调用优化,无论如何都很难做到(然而 Scala 2.8 引入了
@tailrec
注解) - UAP(universal Access Principle)需要仿真(Java不支持),即将完成Value Holder(
@proxy
) - 还需要模拟所有混入机制
- 更一般地说,Scala 引入的大量静态类型(其中大多数)需要在 Java 中生成:
为了涵盖尽可能多的可能性,Scala 提供:
- 常规类类型,
- 值类类型,
- 不可为空的类型,
- 单子类型,
- 特质类型,
- 单例对象类型(过程模块、实用程序类等),
- 复合类型,
- 功能类型,
- 案例类,
- 路径相关类型,
- 匿名类型,
- 自我类型,
- 键入别名,
- 通用类型,
- 协变泛型类型,
- 逆变泛型类型,
- 有界泛型类型,
- 抽象类型,
- 存在类型,
- 隐式类型,
- 增强型,
- 查看有界类型,以及
- 当所有其他方法都失败时,允许一种鸭子类型的结构类型
于 2010-04-21T12:48:16.140 回答
20
本文是与 Martin Odersky(Scala 的创建者)的讨论,包括在 Scala 中为与 Java 兼容所做的妥协。文章提到:
- 方法的静态重载
- 兼具特质和类别
- 包含
null
指针。
于 2010-04-21T18:33:41.720 回答
3
与文化宿醉相比,运行时的问题更少:普遍平等、散列、toString。
与 VM 的联系更紧密:默认情况下严格评估、不纯函数、异常。
于 2010-04-23T16:33:22.383 回答