Compilatore Java e compatibilità VM

4

Un collega e io di recente abbiamo discusso di versioni Java e JVM. Io uso Java 7 ma usiamo Java 6 per il nostro client (mentre dice che alcuni sono ancora su 5). Il mio pensiero immediato è stato: perché non possiamo indirizzare anche quelle macchine virtuali?

La Java VM è in qualche modo diversa da una macchina reale in quanto ha un sacco di funzioni di runtime. Digitare controllo, gestione delle eccezioni, garbage collection, ecc. Ma è ancora una macchina virtuale con un bytecode. (Questo è il motivo per cui possiamo avere cose come C in compilatori JVM .) Quindi, perché non possiamo mirare a macchine virtuali più vecchie con la versione più recente di Java? Perché la lingua e il runtime devono essere legati insieme? Oltre all'evidente penalizzazione delle prestazioni, sembra che sia completamente possibile compilare il codice Java 7 su Java 6 JVM. (E considerando quanto poco è cambiato da Java 6 a 7, non riesco a immaginare che il compilatore cambi di così tanto.)

    
posta GJK 22.07.2013 - 15:33
fonte

3 risposte

8

Penso che la ragione principale sia semplicemente il fatto che la richiesta di questa funzione non è molto alta, perché l'aggiornamento a JVM più recenti è generalmente abbastanza indolore. E il tipo di organizzazioni e persone che insistono nell'utilizzare JVM obsolete non sono probabilmente inclini a utilizzare le funzionalità linguistiche più recenti.

Certamente, è certamente possibile - nessuno ti impedisce di scrivere un compilatore del genere. Ma l'unico esempio di cui sono a conoscenza che ha visto un uso diffuso è Retroweaver , che consente di utilizzare le funzionalità di Java 5 su 1.4 JVM. Ma poi, Java 5 ha le più grandi e utili nuove funzionalità di qualsiasi versione di Java, quindi c'era molto più valore nell'avere questo che con altre versioni.

    
risposta data 22.07.2013 - 16:01
fonte
2

il principale colpevole sono gli aggiornamenti della libreria, java è pazzo compatibile all'indietro in modo tale che il codice scritto per 1.1 continui a funzionare su java 8 senza bisogno di essere ricompilato

le modifiche più importanti sono le librerie interne e JRE, a livello di byte di codice non molto cambiate

spetta a te (r manager) decidere se targetizzare 1.5 o 1.7 e poi gestire la libreria limitata disponibile

    
risposta data 22.07.2013 - 15:46
fonte
1

Se il team JVM dovesse ricominciare tutto da capo, probabilmente avrebbe una JVM modulare in modo da poter combinare le implementazioni JVM e le funzionalità del linguaggio. Ad esempio potresti avere Lambdas implementato come classi interne anonime o utilizzando invokedynamic e MethodHandles .

Hmm, in realtà stanno guardando qualcosa come fare questo per Java 9 con il progetto Jigsaw

    
risposta data 22.07.2013 - 15:55
fonte

Leggi altre domande sui tag