.NET / CLR上Scala中的Reified泛型

时间:2012-07-23 06:01:31

标签: .net scala generics language-design type-erasure

Scala(至少在JVM上)使用type erasure来兼容Java。此featurewidely held to suckFixing this would be difficult on the JVM

In contrast to the JVM situation, .NET supports reified generics. Scala's .NET implementation会使用它们吗?如果没有,可能,或者使用具体原因会出现什么问题?

2 个答案:

答案 0 :(得分:4)

它正在进行中,小心不要破坏JVM和.NET之间的Scala语义。

我在2011年就scala-tools邮件列表问了这个问题,Miguel Garcia给出了答案,他在其中概述了大局:

一些引言:

  

(1)Scala.Net预览目前的功能。你已经注意到了,   擦除阶段也作为管道的一部分运行。这是一个   预览版的“功能”,必须包含“功能”   因为还没有对CLR Generics的支持(更多关于此   下面)。然而,运行JVM风格有一个很大的优势   Scala.Net中的擦除:所有依赖的Scala程序   Scala库已经可以在.Net上编译,而不是等待   为CLR Generics做好准备。那些依赖Java JDK的程序   也可以编译,但需要支持JDK API的IKVM   问题[1]。

     

(2)支持Scala.Net中的CLR泛型。主要动机是   支持它正在获得与现有程序集的互操作性。在   获得这种互操作性,将注意不要脱离   来自Scala语义。换句话说,任何有效的Scala程序都将继续   在JVM和.NET上运行并生成相同的结果。这带来了我们   对正在进行的工作[2]。初始原型只处理C#   Scala的子集。所以现在我正在解决剩下的问题。这比工作更多   最初预期,但覆盖整个语言非常重要。

     

关于与.NET程序集互操作的更多评论   特殊的原生问题。是的,CLR程序集可以表达使用   “native int”(不同CPU上的不同大小),P / Invoke   由.dll等导出的C函数。 Scala.Net并不打算这样做   那种低级别的诡计。感兴趣的装配互操作性是   在“共同语言规范”的层面,即什么   通常从任何C#,VB.NET等编译器获得(“通常”即   除非使用“[DllImport]”属性和相关的C ++ - isms)。

     

从CLI规范引用:

     

---开始引用---公共语言规范(CLS) - CLS是语言设计者和框架之间的协议(即,   类库)设计师。它指定了CTS的一个子集(Common   输入System)和一组使用约定。   语言为用户提供了最强的访问权限   框架,至少实施CTS的那些部分   CLS的一部分。同样,如果框架将被广泛使用   他们公开出口的方面(例如,类,接口,方法,   和字段)仅使用属于CLS并且遵守的类型   CLS惯例。   ---结束语---

查看整个帖子:

https://groups.google.com/forum/?fromgroups#!topic/scala-tools/JDjstK1_uvM

答案 1 :(得分:3)

this question的答案中,您可以认为在VM中保留泛型可能不是一个优势,因为它仍然会决定可以表示什么以及类型之间的关系是什么。 (更深入一点,请转到Ola Bini的original blog)。

其他例子:

  

Erasure似乎不仅对向后兼容性有用,而且因为动态类型语言所提供的完整的运行时类型信息是有代价的。 .NET CLR Generics的设计通过代码专业化来解决这个问题。上述案例应该在删除时明确,并且当它是一种特定缺点的语言时。

  

网络是如果JVM已经统一了泛型(没有类型擦除),就不可能实现Scala的类型系统...... Scala的类型系统比Java更复杂,如果JVM具有基于的泛型Java泛型,我们在Scala中仍然存在问题。另一方面,类型擦除允许编译器实现复杂类型系统,即使所有类型信息在运行时都不可用。


据我所知,Scala的.NET后端远远落后于当前的JVM实现,并且也不支持.NET的具体化泛型。


Scala 2.10甚至在实际虚拟机模型中抽象类型信息的方向进一步。 Martin Odersky在一个演示文稿中提出了新的反思/具体化互动,例如embedded in this entry(从42'18开始)。

我相信您将能够使用type-tags(替换清单)来克服模式匹配和擦除的问题。 this mailing list thread上有一点,但我不知道它在多大程度上有效。

(纯粹推测:)对于比JVM具有更少类型信息的平台而言,寻求更多抽象可能有助于后端。一个假想的JavaScript编译。