2012-07-23 10 views
5

Scala (almeno su JVM) utilizza type erasure per la compatibilità Java. Questo feature è widelyheldtosuck. Fixing this would be difficult on the JVM.Generici reificati in Scala su .NET/CLR

In contrast to the JVM situation, .NET supports reified generics.Scala's .NET implementation li utilizza? In caso contrario, potrebbe farlo, o quali sarebbero i problemi con l'uso della reificazione?

+0

M. Garcia ha una relativa [articolo] (http://lampwww.epfl.ch/~ magarcia/ScalaNET/diapositive/TourCLRGenerics.pdf) e [aggiornamento stato] (http://lampwww.epfl.ch/~magarcia/ScalaNET/slides/2011-09-06-GenericsGettingCloser.pdf). Ma questi riguardano i dettagli di implementazione; è difficile ottenere il quadro generale. –

risposta

4

È in corso, con attenzione a non interrompere Scal una semantica tra JVM e .NET.

Ho fatto questa domanda nel 2011 sulla mailinglist Scala-strumenti e la risposta è data da Miguel Garcia in cui si delinea il quadro generale:

Alcune citazioni:

(1) Cosa l'anteprima di Scala.Net attualmente lo fa. Come hai notato, la fase di cancellazione viene eseguita anche come parte della pipeline. Questa è una "funzionalità" della versione di anteprima, una "funzione" che doveva essere inclusa perché il supporto per CLR Generics non era ancora presente (ulteriori informazioni su questo di seguito). C'è comunque un grande vantaggio nell'esecuzione della cancellazione stile JVM in Scala.Net: tutti i programmi Scala là fuori che si basano su la libreria Scala può già essere compilata su .Net, invece di aspettare per CLR Generics essere pronti. I programmi che si basano su Java JDK possono anche essere compilati, in base al supporto IKVM delle API JDK nella domanda [1].

(2) Supporto per CLR Generics in Scala.Net. La principale motivazione al supporto di sta ottenendo l'interoperabilità con gli assembly esistenti. In ottenendo tale interoperabilità, si presterà attenzione a non staccare dalla semantica di Scala. In altre parole, qualsiasi programma Scala valido sta eseguendo e produce gli stessi risultati su JVM e .NET. Il che ci porta ai lavori in corso [2]. Il prototipo iniziale gestisce solo il sottoinsieme C# di Scala. Quindi ora mi sto rivolgendo al resto. È più lavoro di inizialmente previsto, ma è importante coprire l'intera lingua.

Alcuni commenti in più relativi all'interoperabilità con assembly .NET, in in particolare problemi nativi. Sì, i gruppi CLR possono esprimere utilizzando "nativo int" (diverse dimensioni su diverse CPU), P/Invoke di funzioni C esportate da un dll e così via. Scala.Net non mira a fare questo inganno a basso livello. L'interoperabilità di assemblaggio di interesse è al livello di "Common Language Specification", ovvero ciò che uno normalmente ottiene da qualsiasi compilatore C#, VB.NET, ecc. ("Normalmente" ossia a meno che non si utilizzino attributi "[DllImport]" e relativi C++ - ismi).

Citando le specifiche CLI:

--- iniziare citazione --- specifica del linguaggio comune (CLS) - La CLS è un accordo tra i progettisti di linguaggi e framework (cioè, libreria di classi) designer . Specifica un sottoinsieme del CTS (Common Type System) e un insieme di convenzioni di utilizzo. Le lingue offrono ai propri utenti la massima capacità di accedere ai framework implementando almeno quelle parti del CTS che sono parte del CLS. Allo stesso modo, i framework saranno più ampiamente utilizzati se gli aspetti esportati pubblicamente (ad es. Classi, interfacce, metodi, e campi) verranno utilizzati solo i tipi che fanno parte del CLS e che aderiscono a le convenzioni CLS. --- Termina citazione ---

vedere di tutta la discussione:

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

3

Dalla risposta di this question, è possibile assumere che potrebbe non essere affatto un vantaggio conservare i farmaci generici in una VM, poiché imporrebbe comunque ciò che può essere rappresentato e quali sono le relazioni tra i tipi. (Per ulteriori approfondimenti, vai allo original blog di Ola Bini).

Altri esempi:

Erasure sembra utile non solo per la retro-compatibilità, ma perché completa runtime -le informazioni di tipo promosse da linguaggi digitati dinamicamente hanno un costo. Il design di .NET CLR Generics affronta questo costo con la specializzazione del codice. I casi di cui sopra dovrebbero aver chiarito quando si tratta di cancellazione e quando è la lingua che deve essere biasimata per una particolare mancanza.

La rete-net è che se la JVM aveva reificato generici (senza cancellazione del tipo), non sarebbe possibile attuare il sistema di tipi di Scala ... sistema di tipi di Scala è più complessa di Java e se la JVM avesse generici basati su generici Java, avremmo ancora problemi in Scala. D'altra parte, la cancellazione dei caratteri consente al compilatore di implementare un sistema di tipi complessi, anche se tutte le informazioni sul tipo non sono disponibili in fase di esecuzione.


Per quanto ne so .NET backend di Scala è molto indietro l'attuazione JVM corrente, e inoltre non supporta .NET reificata farmaci generici.


Scala 2.10 va ancora ulteriormente nella direzione di astrazione informazioni tipo dal modello reale macchina virtuale. Martin Odersky ha presentato la nuova interazione riflessione/reificazione in una presentazione che è ad esempio 01 Credo che sarà quindi possibile utilizzare i tag di testo (che sostituiscono i manifesti) a superare i problemi con il pattern matching e la cancellazione: c'è un po 'su this mailing list thread, ma non so fino a che punto funzioni o meno

(speculazione pura :) Approfondire l'astrazione potrebbe aiutare con i backend per piattaforme che hanno ancora meno informazioni di tipo rispetto alla JVM, ad esempio un'ipotetica compilazione su JavaScript