In che modo Java Virtual Machine esegue il codice scritto in altre lingue?

12

Da Java 1.6, la JVM può eseguire una miriade di linguaggi di programmazione, anziché solo Java. Comprendo concettualmente come Java viene eseguito sulla Java VM, ma non su come possono essere eseguiti anche altri linguaggi. Per me, tutto sembra magia nera. Hai qualche articolo che mi indichi in modo da poter capire meglio come tutto questo combaci?

    
posta Pomario 07.06.2012 - 15:08
fonte

4 risposte

23

La chiave è la lingua nativa della JVM: il bytecode Java. Qualsiasi linguaggio può essere compilato in bytecode che la JVM comprende: tutto ciò che serve è un compilatore che emette bytecode. Da quel momento in poi, non c'è differenza dal punto di vista della JVM. Tanto che puoi prendere un file di classe compilato Scala, Clojure, Jython ecc. E decompilarlo (usando ad esempio JAD ) in codice sorgente Java dall'aspetto normale.

Puoi trovare maggiori dettagli a riguardo nei seguenti articoli / discussioni:

Non sono a conoscenza di modifiche fondamentali in Java 5 o 6 JVM che avrebbero reso possibile o più semplice per (codice compilato da) altri linguaggi per eseguirlo. A mio parere, la JVM 1.4 era più o meno all'altezza di JVM 6 (potrebbero esserci delle differenze, però: non sono un esperto di JVM). Solo la gente ha iniziato a sviluppare altri linguaggi e / o compilatori bytecode nella prima metà del decennio, ei risultati hanno iniziato ad apparire (e diventare più noti) intorno al 2006, quando è stato pubblicato Java 6.

Tuttavia, tutte queste versioni di JVM condividono alcune limitazioni: la JVM è tipizzata staticamente per natura e fino alla versione 7 non supportava le lingue dinamiche. Ciò è cambiato con l'introduzione di invokedynamic , una nuova istruzione bytecode che abilita il metodo invocazione basata sul controllo dinamico dei tipi.

    
risposta data 07.06.2012 - 15:09
fonte
3

Una macchina virtuale, come la JVM, è un programma che accetta come input, di solito file, una serie di semplici istruzioni (che di solito sono facili da convertire in vere istruzioni della CPU), e in realtà le compila e le esegue come istruzioni native della CPU (solitamente utilizzando un compilatore on-demand come HotSpot o JIT).

È essenzialmente uno strato di astrazione. In genere è molto più semplice eseguire il porting di implementazioni di set di istruzioni VM su architetture di processori diverse, a causa di molte somiglianze (come lo stack). È anche molto più facile trasferire diversi linguaggi di programmazione in istruzioni VM, dal momento che è più orientato verso i moderni linguaggi di programmazione rispetto alle primitive istruzioni della CPU. Molte macchine virtuali come JVM e CLR (.NET) contengono istruzioni per chiamare metodi virtuali e creare istanze di oggetti.

Quindi prendiamo un linguaggio per esempio. Chiamalo MyLanguage. Dal momento che si tratta di un linguaggio di programmazione, alla fine viene compilato su un insieme di alcune istruzioni di architettura della CPU. Ciò significa che, dato un set di istruzioni Virtual Machine compatibile e flessibile, è anche possibile compilare MyLanguage su un set di quelle istruzioni della VM.

C'è sempre una questione di efficienza, dal momento che potrebbe essere necessario modificare alcuni workaround nei set di istruzioni VM che non dovresti fare in modo nativo, ma è ancora possibile.

    
risposta data 07.06.2012 - 16:22
fonte
3

Una JVM è una macchina di elaborazione completa di Turing (eccetto che per memoria limitata), e qualsiasi macchina completa di Turing (fisica o virtuale) può eseguire qualsiasi linguaggio di programmazione (eccetto limitazioni di memoria, prestazioni e I / O fisico).

    
risposta data 07.06.2012 - 16:58
fonte
2

Per un attimo pensate alla JVM come a un processore con le proprie istruzioni impostate come forse x86. Il processore può eseguire dire il codice C che è stato compilato nel suo linguaggio macchina. Applicando la stessa analogia alla JVM, è possibile eseguire altre lingue sulla JVM proprio come su altri processori, se tali lingue sono compilate nelle istruzioni della JVM della macchina. La JVM può quindi eseguire queste istruzioni per la lingua X.

    
risposta data 08.06.2012 - 03:39
fonte

Leggi altre domande sui tag