2012-07-23 81 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編譯。