2012-07-23 82 views
5

Scala(至少在JVM上)使用type erasure来实现Java兼容性。这featurewidelyheldtosuckFixing this would be difficult on the JVM.NET/CLR Scala中的泛化泛型

In contrast to the JVM situation, .NET supports reified generics.Scala's .NET implementation是否使用它们?如果没有,是否可以,否则使用物化会导致什么问题?

+0

M.加西亚相关[文章](http://lampwww.epfl.ch/~ magarcia/ScalaNET /幻灯片/ TourCLRGenerics。pdf)和[状态更新](http://lampwww.epfl.ch/~magarcia/ScalaNET/slides/2011-09-06-GenericsGettingCloser.pdf)。但这些涉及执行的细节;很难获得大局。 – 2012-07-23 06:26:37

回答

4

它的工作正在进行中,小心不要打破Scal JVM和.NET之间的语义。

我问这个问题早在2011年斯卡拉工具邮件列表和答案被米格尔·加西亚,他勾勒出大画面给出:

的一些话:

(1)什么目前Scala.Net预览。如您所注意到的,删除阶段也作为管道的一部分运行。这是预览版本的“功能” ,必须包含“功能” ,因为对CLR泛型的支持尚未完成(更多信息,请参阅下面的 )。然而,在Scala.Net中运行JVM风格的 有一个很大的优势:依赖于 的所有Scala程序都可以在.Net上编译,而不是等待CLR泛型的 准备就绪。那些依赖于Java JDK 的程序也可以编译,但需要遵循 问题[1]中的JDK API的IKVM支持。

(2)支持Scala.Net中的CLR泛型。 支持它的主要动机是获得与现有组件的互操作性。在获得互操作性的 中,将不会忽略来自Scala语义的 。换句话说,任何有效的Scala程序都将运行 ,并在JVM和.NET上产生相同的结果。这为我们带来了 正在进行的工作[2]。最初的原型只处理Scala的C# 子集。所以现在我正在处理其余的问题。这比最初预期的 更多的工作,但覆盖整个语言是很重要的。

有关与.NET程序集互操作的更多注释,请参阅 特定的本机问题。是的,CLR程序集可以使用 “native int”(不同CPU上的不同大小),P/Invoke 使用.dll等导出的C函数。 Scala.Net不打算做 那低级的诡计。感兴趣的装配互操作性为“公共语言规范”级别的 ,即通常从任何C#,VB.NET等编译器(通常为“ ,除非使用”[DllImport]“属性和相关C++ - ISMS)。

从CLI规格报价:

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

看到整个线程:

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

3

this question的回答可以看出,在虚拟机中保留泛型可能并不是一个优点,因为它仍然会规定可以表示的内容以及类型之间的关系。 (欲了解更多信息,请访问Ola Bini的original blog)。

其他例子:

擦除似乎有用不只是为了向后兼容,但由于完整的运行时由动态类型语言提供的类型信息是有代价的。 .NET CLR泛型的设计通过代码专业化解决了这个代价。上述案件在删除时应该已经明确,并且应该将其归咎于特定缺陷的语言。

净净的,如果JVM已经具体化泛型(无类型擦除),就不可能实现Scala的类型系统... Scala的类型系统是复杂得多Java的如果JVM具有基于Java泛型的泛型,那么我们在Scala中仍然会遇到问题。另一方面,类型擦除允许编译器实现复杂类型系统,即使所有类型信息在运行时不可用。


据我所知,Scala的.NET后端是远远落后于目前的JVM实现,而且不支持NET的物化仿制药。


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

我相信你将能够使用类型标签(它将替换manifests)克服与模式匹配和擦除的问题。有上this mailing list thread了一点,但我不知道到什么程度有用,或者没有。

(纯属猜测:)去为更多的抽象可能与后端的帮助平台的类型信息比JVM更少,例如假想的JavaScript编译。