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


12

A partire da Java 1.6, JVM può eseguire una miriade di linguaggi di programmazione al posto di Java. Comprendo concettualmente come Java viene eseguito sulla Java VM, ma non come anche altre lingue possono essere eseguite su di essa. Per me, tutto sembra magia nera. Hai degli articoli che mi indicano in modo che io possa capire meglio come tutto questo si adatta?


2
Allo stesso modo in cui il tuo processore Intel / AMD / Solaris (??) può eseguire "qualsiasi lingua" (anche se in realtà non esegui le lingue, ma segui semplicemente il flusso qui) che può essere compilato nel suo codice assembly nativo.
Apoorv Khurasia,

13
Il fatto è che JVM non esegue Java. Esegue un linguaggio distinto (anche se correlato e intenzionalmente facile da creare per i compilatori Java), più di basso livello.

Questo è vero. Ma la JVM ha iniziato a eseguire altre lingue dalla versione 6; non puoi (o nessuno ha fatto) eseguire python o Groovy su di esso nella versione 1.4.2. Perchè è così? Cosa è cambiato?
Pomario

@delnan O piuttosto "modello di esecuzione di livello più basso, che il programma javac sa come costruire dal codice Java".
Apoorv Khurasia,

9
@Pomario Jython è in circolazione da un po 'di tempo. E questa pagina sembra suggerire che gli script Jython potrebbero essere eseguiti su 1.4.2.
Apoorv Khurasia,

Risposte:


23

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

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

Non sono a conoscenza di cambiamenti fondamentali nelle JVM Java 5 o 6 che avrebbero reso possibile o più semplice l'esecuzione (su codice compilato da) altre lingue. A mio avviso, la JVM 1.4 era più o meno in grado in questo senso rispetto alla JVM 6 (potrebbero esserci delle differenze; ​​non sono un esperto di JVM). Fu solo che le persone iniziarono a sviluppare altri linguaggi e / o compilatori bytecode nella prima metà del decennio, e i risultati iniziarono ad apparire (e divennero più noti) intorno al 2006 quando venne pubblicato Java 6.

Tuttavia, tutte queste versioni di JVM condividono alcune limitazioni: la JVM è tipicamente statica per natura e fino alla versione 7 non supportava i linguaggi dinamici. Questo è cambiato con l'introduzione di invokedynamic, una nuova istruzione bytecode che consente l'invocazione del metodo basandosi sul controllo dinamico del tipo.


8
Non è esattamente vero che la JVM non "supporta" i linguaggi dinamici. Dovevano solo usare soluzioni alternative che presentavano gravi inconvenienti.
Michael Borgwardt,

3
@MichaelBorgwardt, possiamo essere d'accordo sul fatto che JVM pre v7 abbia tollerato i linguaggi dinamici (in una certa misura)? :-)
Péter Török il

1
È un buon modo per dirlo :)
Michael Borgwardt,

3

Una macchina virtuale, come JVM, è un programma che accetta come input, generalmente file, un insieme di semplici istruzioni (che di solito sono facili da convertire in istruzioni CPU reali), e in realtà le compila e le esegue come istruzioni CPU native (di solito usando un compilatore su richiesta come HotSpot o JIT).

È essenzialmente uno strato di astrazione. Solitamente è molto più semplice trasferire le implementazioni del set di istruzioni VM su architetture di processori diverse, a causa di diverse somiglianze (come ad esempio lo stack based). È anche molto più facile trasferire diversi linguaggi di programmazione alle istruzioni della VM, poiché è più orientato ai moderni linguaggi di programmazione rispetto alle primitive istruzioni della CPU. Molte macchine virtuali come JVM e CLR (.NET) contengono istruzioni per la chiamata di metodi virtuali e la creazione di istanze di oggetti.

Quindi prendiamo una lingua per esempio. Chiamalo MyLanguage. Dal momento che è un linguaggio di programmazione, alla fine si compila in una serie di istruzioni sull'architettura della CPU. Ciò significa che, dato un set di istruzioni della macchina virtuale compatibile e flessibile, è anche possibile compilare MyLanguage in un set di istruzioni di quella VM.

C'è sempre una questione di efficienza, dal momento che potrebbe essere necessario hackerare alcune soluzioni alternative nei set di istruzioni della VM che non dovresti fare in modo nativo, ma è ancora possibile.


3

Una JVM è una macchina di calcolo completa di Turing (ad eccezione della memoria limitata) e qualsiasi macchina completa di Turing (fisica o virtuale) può eseguire qualsiasi linguaggio di programmazione (ad eccezione di limiti di memoria, prestazioni e I / O fisici).


Ehm ... perché allora abbiamo bisogno di compilatori? ;-)
Péter Török il

Compilatori e interpreti, essi stessi, possono funzionare su macchine di Turing (forse lentamente). Forse alcune fasi di pre-compilazione / traduzione possono migliorare le prestazioni di esecuzione di un determinato programma in una determinata lingua?
hotpaw2

1
Il mio punto era che la tua affermazione "qualsiasi macchina completa di Turing (fisica o virtuale) può eseguire qualsiasi linguaggio di programmazione" significa letteralmente che la CPU x86 del mio laptop può eseguire direttamente questo simpatico file sorgente Java su cui sto lavorando in questo momento. O codice macchina per processori PowerPC. Senza compilatori: le CPU non contengono compilatori, giusto? :-)
Péter Török

La tua "macchina" è molto più di una semplice CPU.
hotpaw2

1
@ PéterTörök Vedo il tuo punto. Non ha elaborato le macchine virtuali come abbiamo fatto noi. Ma penso che la sua risposta risponda ancora brevemente alla domanda del PO. La JVM può "eseguire" altri linguaggi di programmazione perché può "eseguire" qualsiasi linguaggio di programmazione, poiché è Turing completo. Forse non elaborato, ma comunque un punto conciso e valido. :)
Yam Marcovic,

2

Per un momento, pensa a JVM come a un processore con le sue 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, altre lingue possono essere eseguite sulla JVM proprio come su altri processori se tali lingue sono compilate secondo le istruzioni della macchina della JVM. La JVM può quindi eseguire queste istruzioni per il linguaggio X.


la tua analogia è bella
cobi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.