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
归档时间: |
|
查看次数: |
1198 次 |
最近记录: |