2010-02-17 9 views
34

Stavo leggendo brevemente su Maxine che è un'implementazione JVM open source scritta in Java. Questo suona circolare per me. Se java richiede l'esecuzione di una macchina virtuale, come può la macchina virtuale stessa essere scritta in Java (il codice della macchina virtuale non richiederà una VM in cui eseguire, e così via?).Come scrivere una JVM in Java

Modifica: Ok, quindi vedo che ho trascurato il fatto che Java non deve essere eseguito in una VM. Come si spiega allora come può essere scritto un compilatore LISP in LISP? O dovrebbe essere una nuova domanda?

+1

Non era il primo compilatore C++ di Bjarne Stroustroup scritto in C++ (quando era ancora chiamato "C With Classes")? Quale considererei ancora più impressionante, dal momento che il C++ non è un linguaggio interpretato ma richiede un compilatore! – Matthias

+1

Che è esattamente ciò che non capisco :) – kji

+5

Il nuovo libro del drago, prima edizione (stare lontano dalla seconda edizione corrotta dagli errori) spiega il bootstrap del compilatore. –

risposta

14

Presupposto che Java richiede una macchina virtuale is incorrect to begin with.

+1

java * language * potrebbe non richiedere una VM, ma il termine "java" copre più della semplice lingua, include anche la VM. – skaffman

+0

E Maxine sembra richiedere almeno una JVM JDK1.6 da eseguire. – Thilo

+0

@kji: Penso di essermi sbagliato. Sembra che Maxine si compili in un eseguibile nativo, quindi non c'è bisogno di JDK JVM dopo aver creato Maxine in un primo momento (credo che abbia ancora bisogno di una libreria di classi, credo). – Thilo

1

Il codice Java può essere compilato direttamente sul codice macchina in modo che non sia necessaria una macchina virtuale.

0

È possibile dare un'occhiata al metodo consolidato dei compilatori di avvio. Penso che sia iniziato negli anni '70 ...

6

La JVM che è necessario eseguire il bootstrap di una JVM scritta in Java probabilmente non ha bisogno di molte funzionalità (come la garbage collection e JIT), potrebbe essere molto semplice. Tutte le funzionalità più avanzate potrebbero quindi essere implementate in Java (che sembra essere esattamente il punto di Maxine, per sperimentare nuove idee nella tecnologia JVM).

Inoltre, Maxine contiene codice C, che presumibilmente costituisce un ambiente di runtime minimo che viene utilizzato per ottenere il resto di Maxine. Suppongo che i bit interessanti (compilatore JIT, garbage collection) siano completamente implementati in Java.

+0

buona spiegazione, grazie – kji

+0

No. Il codice C in Maxine è più utilizzato come un linguaggio di definizione dei dati, in realtà non implementa nulla di interessante. Il sistema operativo si aspetta che certe strutture siano disposte in un certo modo specifico in memoria, e il compilatore C sa come farlo, quindi Maxine usa C per far sì che queste strutture siano disposte correttamente. Ma ci sono solo pochi posti che usano C: un launcher minimale, che carica l'immagine della VM in memoria, scrive l'indirizzo del carico in una posizione specifica all'interno dell'immagine e poi salta in un'altra posizione specifica. Il debugger, poiché Maxine utilizza le funzionalità di debug del sistema operativo C. –

+0

La parte di basso livello di JNI, perché, ben l'intero punto di JNI è da integrare con C. E la parte di basso livello del threading, perché Maxine utilizza thread nativi che sono molto diversi da sistema a sistema. –

0

E 'un po 'l'uomo whooaoaa, come può quel lavoro ???' - ma penso che stiate descrivendo il fenomeno noto come "self-hosting":

Le lingue (o le toolchain/piattaforme) non iniziano come self-hosting - iniziano la vita essendo state costruite su una piattaforma esistente: a un certo punto diventano abbastanza funzionali da consentire la scrittura di programmi che comprendano la sintassi in cui è scritto.

C'è un grande esempio nel classico libro AWK, che introduce un programma AWK che può analizzare (una versione ridotta come succede) altri programmi AWK: vedi link sotto.

C'è un altro esempio nel libro "Codice bello" che ha un programma Javascript che può analizzare Javascript.

Penso che la cosa da ricordare su questo - se si dispone (per esempio) di una JVM scritta in Java che può quindi eseguire codice Java Byte: la JVM che esegue Java JVM stessa deve essere ospitata in modo nativo (forse questa JVM era scritto in 'C' e poi compilato in codice macchina): questo è vero in ogni caso di un programma di auto-hosting alla fine - da qualche parte lungo la linea.

Quindi il mistero viene rimosso, perché ad un certo punto, c'è un programma di codice macchina nativo che gira sotto ogni cosa.

È un equivalente di poter descrivere la lingua inglese (ecc.) Utilizzando la stessa lingua inglese .... forse ...

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/Self-hosting

2

ho dato un'occhiata a Maxine la scorsa settimana e si chiedeva lo stesso :)

Dal Maxine documentation:

1 Costruire il immagine di avvio

Ora creiamo un'immagine [immagine di avvio]. Nel passaggio , Maxine esegue su un host JVM per configurare un prototipo, quindi compila il proprio codice e i dati su crea un programma eseguibile per la piattaforma di destinazione .

2 Esecuzione Maxine

Ora che Maxine si è compilato, possiamo eseguirlo come una macchina virtuale Java standard. Il comando max vm gestisce i dettagli della classe e dei percorsi della libreria e fornisce un'interfaccia simile al comando java launcher standard .

0

So che questo post è vecchio ma ho pensato di aggiungere un po 'alla discussione perché sono punti che sono stati persi. Quindi i futuri lettori potrebbero trovare utile questo.

Mi chiedo se a tutti manca il punto qui. Puoi scrivere quasi tutti i tipi di compilatore, interprete o macchina virtuale in quasi tutte le lingue. Quando si usa C per scrivere un compilatore C, è necessario un compilatore C per compilare il nuovo compilatore. Tuttavia, l'output è un codice nativo che viene eseguito sulla piattaforma designata. Solo perché la JVM è scritta nella lingua che gira su JVM non significa che l'output debba generare codice che gira su JVM. Ad esempio, puoi scrivere C, Basic, Pascal Compilers o anche assemblatori in Java. In questo caso avrai bisogno della JVM per creare il compilatore o l'assemblatore, ma una volta creato potresti non aver più bisogno della JVM se il codice iniziale risultava in codice nativo. Un altro approccio è quello di scrivere un traduttore che prende una lingua di input e la converte in una lingua macchina nativa in modo da scrivere il programma nella lingua A che compila nel linguaggio B che viene poi compilato in codice macchina. Nel mondo dei microcontroller la vedi molto. Qualcuno vuole scrivere programmi in Basic o Java in modo che scrivano il compilatore Basic/Java per produrre codice C per un compilatore C esistente. Quindi il codice C risultante viene compilato nel linguaggio macchina fornendo il compilatore nativo di base/Java. Questo approccio è solitamente più semplice della scrittura del compilatore Basic/Java direttamente nel codice macchina.

Molti anni fa ho scritto programmi BasicA e GWBasic che producevano codice assembly in 6800 e Z80 micros. Il mio punto è che l'output non deve essere dello stesso tipo dell'ingresso o dell'obiettivo. OSSIA Solo perché stai scrivendo una JVM in Java non significa che il risultato finale deve essere eseguito con una JVM Java.