.NET/CLR上Scala中的Reified泛型

Mec*_*ail 5 .net generics scala language-design type-erasure

Scala(至少在JVM上)使用类型擦除来实现Java兼容性.这个功能广泛 持有 ,以 .在JVM上解决这个问题很困难.

与JVM情况相反,.NET支持reified泛型.Scala的.NET实现是否使用它们?如果没有,可能,或者使用具体原因会出现什么问题?

小智 4

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

早在 2011 年,我就在 scala-tools 邮件列表上提出了这个问题,Miguel Garcia 给出了答案,他在其中概述了总体情况:

一些引言:

(1) Scala.Net 预览版当前的用途。正如您所注意到的,擦除阶段也作为管道的一部分运行。这是预览版的一个“功能”,是一个必须包含的“功能”,因为还不存在对 CLR 泛型的支持(更多内容见下文)。然而,在 Scala.Net 中运行 JVM 式擦除有一个很大的优势:所有依赖 Scala 库的 Scala 程序都可以在 .Net 上编译,而不用等待 CLR 泛型准备就绪。那些依赖于 Java JDK 的程序也可以被编译,但需要 IKVM 对相关 JDK API 的支持 [1]。

(2) Scala.Net 中对 CLR 泛型的支持。支持它的主要动机是获得与现有程序集的互操作性。在获得互操作性时,需要注意不要脱离 Scala 语义。换句话说,任何有效的 Scala 程序都将在 JVM 和 .NET 上运行并产生相同的结果。这让我们看到了正在进行的工作 [2]。初始原型仅处理 Scala 的 C# 子集。现在我要谈谈剩下的事情了。这比最初预期的工作量要多,但覆盖整个语言很重要。

关于与 .NET 程序集互操作的更多评论,特别是本机问题。是的,CLR 程序集可以使用“native int”(不同 CPU 上的不同大小)、.dll 导出的 C 函数的 P/Invoke 等来表达。Scala.Net 的目的并不是做这种低级的欺骗。感兴趣的程序集互操作性位于“公共语言规范”级别,即通常从任何 C#、VB.NET 等编译器获得的内容(“通常”,即除非使用“[DllImport]”属性和相关的 C++ 体系) )。

引用 CLI 规范:

--- 开始引用 --- 公共语言规范(CLS) -- CLS 是语言设计者和框架(即类库)设计者之间的协议。它指定了 CTS(通用类型系统)的子集和一组使用约定。语言通过至少实现属于 CLS 的 CTS 部分,为其用户提供访问框架的最大能力。类似地,如果框架的公开导出方面(例如,类、接口、方法和字段)仅使用属于 CLS 一部分且遵守 CLS 约定的类型,那么框架将得到最广泛的使用。--- 引用结束 ---

请参阅整个线程:

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