Macchina virtuale Java: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Riformulata sezione iniziale |
non serve specificare l'ambito |
||
(4 versioni intermedie di 2 utenti non mostrate) | |||
Riga 1:
[[File:Java_Logo.svg|thumb|upright=0.5|Logo di [[Java (linguaggio di programmazione)|Java]], il primo [[linguaggio di programmazione ad alto livello]] per la JVM]]
Tipicamente un programma in formato bytecode può essere ottenuto dalla [[compilazione]] di un programma equivalente in un [[linguaggio di programmazione]] di livello più alto. Tra i vari che possono essere tradotti in Java bytecode figurano [[Java (linguaggio di programmazione)|Java]], [[Groovy]], [[Clojure]], [[Scala (linguaggio di programmazione)|Scala]], [[Kotlin (linguaggio di programmazione)|Kotlin]].<ref>{{Cita web|url = http://zeroturnaround.com/rebellabs/the-adventurous-developers-guide-to-jvm-languages-java-scala-groovy-fantom-clojure-ceylon-kotlin-xtend/|autore = Simon Maple|titolo = The Adventurous Developer's Guide to JVM Languages|lingua = en|accesso = 2015-05-30}}</ref>
==
La JVM è definita da una [[specifica tecnica|specifica]], mantenuta da [[Oracle Corporation|Oracle]]. Qualsiasi sistema che si comporti in modo coerente con tale specifica viene considerato come una particolare [[implementazione]] della JVM. Esistono implementazioni [[software]] per praticamente tutti i [[sistema operativo|sistemi operativi]] moderni, sia gratuite che commerciali. Inoltre, esistono implementazioni speciali per particolari ambienti [[hardware]]/[[software]], come [[telefono cellulare|telefoni cellulari]] e [[Computer palmare|palmari]]), e persino implementazioni hardware come [[Architettura ARM#Jazelle|Jazelle]].
Line 19 ⟶ 13:
{| border=1 align=center
! Software applicativo Java
|-
! Java Virtual Machine
|-
Line 75 ⟶ 69:
=== Area di memorizzazione dei metodi ===
L'area di memorizzazione dei [[Metodo (programmazione)|metodi]] contiene le tabelle dei simboli necessari per il link dinamico, informazioni di [[Debugging|debug]] aggiuntive, ambienti di sviluppo da associare all'implementazione di qualsiasi metodo e i bytecode di Java che implementano tutti i metodi presenti nel sistema. Poiché i bytecode vengono memorizzati come flusso di byte, l'area dei metodi è allineata per byte mentre le altre aree sono allineate a parole di 32 bit.
=== Compilazione ''Just-In-Time'' ===▼
{{Vedi anche|Compilatore just-in-time}}▼
Le prime implementazioni della macchina virtuale Java erano ''[[interprete (informatica)|interpreti]]''. Questa soluzione si è però rivelata poco efficiente, in quanto i programmi interpretati erano comunque molto lenti. Per questo motivo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un [[compilatore just-in-time]] (''JIT compiler''), cioè un compilatore interno, che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel [[linguaggio macchina]] del computer ospite<ref>{{Cita libro|autore = Haase, C.|titolo = Consumer JRE: Leaner, Meaner Java Technology|anno = 2007|editore = Sun Microsystem|città = |accesso = 30 maggio 2015|url = http://www.oracle.com/technetwork/articles/javase/consumerjre-135093.html|lingua = en}}</ref>. Inoltre, questa ricompilazione è dinamica, cioè la macchina virtuale analizza costantemente il modello di esecuzione del codice (''profilattico''), e ottimizza ulteriormente le parti più frequentemente eseguite, mentre il programma è in esecuzione.▼
Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permettono di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi propriamente compilati come il [[C++]], scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come il [[garbage collection|garbage collector]], che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano [[memoria (informatica)|memoria]] e tempo di [[CPU]] in fase di esecuzione del programma finito.▼
== Implementazioni ==
[[File:Eclipse Adoptium Logo.svg|thumb|[[Adoptium]] è un gruppo di lavoro della [[fondazione Eclipse]] che promuove l'uso delle [[piattaforma Java|tecnologie Java]]. Tra l'altro distribuisce versioni [[file eseguibile|pronte all'uso]] di varie implementazioni della JVM.]]
===
{{vedi anche|HotSpot}}
Per sostituire le parti di HotSpot che erano sotto licenza non open, è nato il progetto [[IcedTea]].<ref>Progetto [http://icedtea.classpath.org/wiki/Main_Page IcedTea] {{Webarchive|url=https://web.archive.org/web/20141006113838/http://icedtea.classpath.org/wiki/Main_Page |date=6 ottobre 2014 }}</ref> La macchina virtuale sviluppata in tale progetto si chiama HotSpot Zero Assembly, chiamata anche semplicemente Zero.<ref>{{Cita web |url=http://icedtea.classpath.org/wiki/ZeroSharkFaq |titolo=Zero and Shark FAQ |accesso=3 ottobre 2014 |dataarchivio=23 agosto 2009 |urlarchivio=https://web.archive.org/web/20090823042123/http://icedtea.classpath.org/wiki/ZeroSharkFaq |urlmorto=sì }}</ref> Il progetto ha anche lo scopo di supportare un numero maggiore di famiglie di processori rispetto alla macchina virtuale di Oracle. Per fare ciò, tutto il codice assembly presente in HotSpot è stato riscritto in C++, in modo da poter essere compilato su più architetture.<ref>[https://today.java.net/pub/a/today/2009/05/21/zero-and-shark-openjdk-port.html Zero and Shark: a Zero-Assembly Port of OpenJDK] {{webarchive|url=https://web.archive.org/web/20141006113630/https://today.java.net/pub/a/today/2009/05/21/zero-and-shark-openjdk-port.html |data=6 ottobre 2014 }}</ref>▼
[[File:OpenJDK_logo.svg|thumb|[[OpenJDK]] è la principale implementazione [[software libero|libera]] della [[piattaforma Java]]. Include un'implementazione di [[HotSpot]] per la componente JVM.]]
HotSpot, ufficialmente nota come ''Java HotSpot Performance Engine''<ref>{{cita web|url=http://www.thefreelibrary.com/Sun+Announces+Availability+of+the+Java+HotSpot+Performance+Engine%3B...-a054477747|urlarchivio=https://web.archive.org/web/20131101095145/http://www.thefreelibrary.com/Sun+Announces+Availability+of+the+Java+HotSpot+Performance+Engine%3B...-a054477747|titolo= Sun Announces Availability of the Java HotSpot Performance Engine|editore=Sun Microsystems|lingua=en}}</ref>
è l'[[implementazione di riferimento]] della JVM, realizzata originariamente da [[Sun Microsystems]] e successivamente gestita da [[Oracle Corporation]].
Dal 2006, con la creazione di [[OpenJDK]], HotSpot è [[software libero]].<ref>{{cita web|url=http://www.sun.com/2006-1113/feature/index.jsp|urlarchivio=https://web.archive.org/web/20070421151747/http://www.sun.com/2006-1113/feature/index.jsp|titolo=Sun Opens Java|data=2006-11-13|lingua=en}}</ref>
=== Zero ===
▲Per sostituire le parti di
=== OpenJ9 ===
Eclipse OpenJ9 (precedentemente conosciuta come IBM J9) è un'implementazione scalabile e ad alte performance della JVM, pienamente conforme alla ''Java Virtual Machine Specification''.<ref>{{cita web|url=https://medium.com/criciumadev/new-open-source-jvm-optimized-for-cloud-and-microservices-c75a41aa987d|autore=Leonardo Zanivan|titolo=New Open Source JVM optimized for Cloud and Microservices|data=2018-02-07|lingua=en}}</ref>
È parte di varie distribuzioni di [[OpenJDK]], tra cui IBM Semeru.<ref>{{cita web|url=https://developer.ibm.com/blogs/introducing-the-ibm-semeru-runtimes/|titolo=Introducing the IBM Semeru Runtimes|data=2021-08-02|accesso=2024-05-03|lingua=en}}</ref>
Rispetto a [[#HotSpot|HotSpot]], OpenJ9 presenta prestazioni migliori in fase di avvio e un minore utilizzo di memoria a livelli di produttività simili.<ref>{{cita web|url=https://jaxenter.com/eclipse-openj9-145182.html|autore=Dan Heidinga|titolo=Eclipse OpenJ9; not just any Java Virtual Machine|data=2018-08-06|accesso=2024-05-03|lingua=en}}</ref>
=== Le altre implementazioni ===
Numerose altre parti forniscono regolarmente implementazioni della macchina virtuale Java, in genere con l'intento di competere con l'implementazione Oracle in quanto a prestazioni; in alcuni casi si tratta di implementazioni commerciali. Sono disponibili anche altre implementazioni ''[[open source]]''; fra le più note si può citare Waba<ref>[http://waba.sourceforge.net/php/waba/waba.php Waba]</ref>.
Le specifiche della JVM vengono dettate e aggiornate dalla Oracle in quanto iniziatore e mantenitore del progetto, ma vengono spesso disattese da molte delle implementazioni ''non-Oracle'' di JVM che sono in circolazione, soprattutto per quanto riguarda il [[framework]] che ogni JVM include. Di conseguenza, le diverse JVM non sono totalmente compatibili tra loro ed occorre fare attenzione nello scrivere i programmi, se si vuole che essi funzionino su ogni JVM. La cosa migliore da fare a tale scopo sarebbe non usare le ultime caratteristiche del linguaggio introdotte dalla Oracle nelle JVM più recenti e usare delle [[Application programming interface|API]] "stabili", che cioè siano presenti nella JVM Oracle da varie versioni.
▲== Compilazione ''Just-In-Time'' ==
▲{{Vedi anche|Compilatore just-in-time}}
▲Le prime implementazioni della macchina virtuale Java erano ''[[interprete (informatica)|interpreti]]''. Questa soluzione si è però rivelata poco efficiente, in quanto i programmi interpretati erano comunque molto lenti. Per questo motivo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un [[compilatore just-in-time]] (''JIT compiler''), cioè un compilatore interno, che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel [[linguaggio macchina]] del computer ospite<ref>{{Cita libro|autore = Haase, C.|titolo = Consumer JRE: Leaner, Meaner Java Technology|anno = 2007|editore = Sun Microsystem|città = |accesso = 30 maggio 2015|url = http://www.oracle.com/technetwork/articles/javase/consumerjre-135093.html|lingua = en}}</ref>. Inoltre, questa ricompilazione è dinamica, cioè la macchina virtuale analizza costantemente il modello di esecuzione del codice (''profilattico''), e ottimizza ulteriormente le parti più frequentemente eseguite, mentre il programma è in esecuzione.
▲Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permettono di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi propriamente compilati come il [[C++]], scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come il [[garbage collection|garbage collector]], che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano [[memoria (informatica)|memoria]] e tempo di [[CPU]] in fase di esecuzione del programma finito.
== Note ==
|