在斯卡拉具体化泛型在.NET / CLR(Reified generics in Scala on

2019-07-30 13:04发布

阶(至少在JVM )使用类型擦除为Java兼容性。 这个功能被广泛 持有 ,以 吸 。 要解决这个恐怕很难在JVM上 。

与此相反的JVM的情况下,.NET支持物化仿制药。 是否Scala的.NET实现使用它们? 如果没有,会呢,还是什么其他问题,将使用物化原因是什么?

Answer 1:

这是正在进行的工作,不小心打破JVM和.NET之间斯卡拉语义。

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

一些报价:

(1)什么Scala.Net预览当前一样。 正如您已经注意到,擦除阶段也运行作为管道的一部分。 这是预览版的“功能”,被列入该有一个“功能”,因为CLR泛型支持是现在还没有(详见下文)。 然而有一个很大的优势,在运行的JVM Scala.Net式擦除:所有的Scala程序在那里,依靠Scala库已经可以.Net的编译,而不是等待CLR泛型做好准备。 这依赖于Java JDK这些程序也可以被编译,受IKVM支持JDK的API的问题[1]。

(2)在Scala.Net支持CLR泛型。 的主要动机,以支持它获得与现有组件的互操作性。 在获得互操作性,将会注意不要从斯卡拉语义割舍。 换句话说,任何有效的Scala程序将运行并产生对JVM和.NET相同的结果。 这使我们对在建[2]的工作。 最初的原型只处理斯卡拉的C#子集。 所以现在我解决了休息。 这是更多的工作比最初的预期,而是覆盖整个语言是很重要的。

关于与.NET程序集,特别是原生的问题互操作的一些更多的评论。 是的,CLR组件可使用表达“天然INT”(不同在不同的CPU的尺寸),通过一个.dll并且这样导出的C函数P /调用。 Scala.Net的目的不是做低级别的挂羊头卖狗肉。 感兴趣的组件互操作性是“通用语言规范”的水平,即什么一个通常是从任何C#获取,VB.NET,等编译器(“正常”,即除非使用“[的DllImport]”的属性和相关的C ++ - ISMS )。

从CLI规格报价:

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

看到整个线程:

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



Answer 2:

从回答这个问题 ,你可以把它可能是没有优势可言有保存完好的仿制药在一个虚拟机,因为它仍然会决定什么可以表示,什么类型之间的关系。 (欲了解更多深入,进入博客原文由奥拉·比尼)。

其他例子:

  • 在斯卡拉和Java比较类型擦除的影响 (而老,2006) -博客文章由布拉克埃米尔,得出的结论

擦除似乎有用不只是为了向后兼容,但由于所提倡的动态类型语言完整的运行时类型信息是有代价的。 在.NET CLR泛型的设计铲球通过代码专业化这笔费用。 在上述情况下,应该明确,当它在消失,当它是要被指责为一个特定的缺点的语言。

  • 在擦除思考邮件列表线程- 。 如大卫·波拉克:

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


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


阶2.10甚至更进一步在从实际的虚拟机模型抽象类型信息的方向。 马丁·奥德斯基呈现在演示文稿是例如新的反射/物化交互嵌入该条目 (在42'18"开始)。

我相信你会那么可以使用类型标签(其替代舱单)克服与模式匹配和擦除的问题。 有对位的这个邮件列表的线程 ,但我不知道它的工作原理到什么程度或没有。

(纯属猜测:)去为更多的抽象可能与后端帮助它具有比JVM甚至更少种类的信息,例如假设编译成JavaScript平台。



文章来源: Reified generics in Scala on .NET/CLR