Continuando a leggere l'articolo di cui ho parlato nel mio ultimo post, ho scoperto una cosa inquietante: Il compilato generato da Java 1.5 "Tiger", sarà perfettamente eseguibile su una virtual machine precedente a questo compilatore.

Questo si traduce nel seguente ragionamento rispetto i Generics: Nessuna modifica è stata introdotta nel bytecode di Java, quindi i generics sono una mera traduzione del codice Java 1.5 in Java 1.4 oggetto della compilazione finale. Questo significa che per effettuare una traduzione vengono introdotti un'infinità di cast e dei metodi bridge per consentire le conversioni. (leggete l'articolo, è tutto nero su bianco)

Ora, se mettiamo assieme le problematiche di boxing/unboxing di cui sopra e le attività di cast a go-go, ne otteniamo che le performance di un codice che usa i generics saranno notevolmente peggiorate.

Conclusione: I generics in Java sono una pura operazione di marketing.

Chissà perchè?


Commenti (8) -

# | Daniele Proietti | 09.09.2004 - 20.37

Non è che si tratta solo di una modalità di compilazione?

Voglio sperare che i "generics" vengano trattati correttamente quando si esegue il programma su una VM 1.5 e facciano tutte le cose che hai detto solo se si compila il programma per girare su una VM 1.4

# | Andrea Boschin | 09.09.2004 - 20.41

Nel documento cui faccio riferimento, e che puoi controllare, non si fa nessun accenno a modalità di compilazione.



La retrocompatibilità del bytecode è un prerequisito che gli sviluppatori hanno dovuto garantire, probabilmente per fare in modo che già dall'uscita del compilatore fosse possibile usare le nuove feature, senza attendere l'aggiornamento delle JVM.

# | Daniele Proietti | 09.09.2004 - 22.18

E' vero, nell'articolo non si parla di differenti modalità di compilazione (quando ho risposto non l'avevo ancora finito di leggere) ma non le esclude neanche, infatti l'articolo dice: "the translation is from generic Java code directly to Java byte code".

Certo che scritto così lascia però intendere che non ci saranno diverse modalità ma che i "generics" sono trattati in questo modo.

Un'altra importante limitazione dei "generics" in Java è l'impossibilità di trattare i "primitivi".

Sono comunque curioso di verificare praticamente le prestazioni e poi di confrontarle con C#

# | Andrea Boschin | 09.09.2004 - 22.26

ho postato questo messaggio perchè mi sembra di aver rilevato una sostanziale differenza.



In C# i generics sono nati principalmente per limitare le problematiche di boxing/unboxing e il casting selvaggio. Su MSDN trovi l'ottimo articolo di Juval Lowy (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/csharp_generics.asp) che lo spiega molto bene.



In Java i generics nascono per dare un nuovo strumento ai programmatori, ma introducono un maggiore overhead nell'esecuzione. Almeno questo è quello che si può desumere da quanto letto... spero di essere smentito.

# | Lorenzo Barbieri @ UGIblogs! | 23.09.2004 - 01.21

# | LastKnight .NET Blog | 12.10.2004 - 06.07

# | 尖锐湿疣 | 30.12.2004 - 18.07

Pretty cool! Thank you!

# | Di .NET e di altre amenita' | 16.03.2005 - 20.55

Aggiungi Commento