Qual è la differenza tra un linguaggio interpretato e uno compilato su una VM? [duplicare]

4

Mi viene in mente che non c'è molta differenza tra

$>python module.py

E

$>javac module.java
$>java module.class

Il precedente compila in un linguaggio intermedio (bytecode python) ed esegue il programma. Quest'ultimo rompe i passaggi, compilando prima il linguaggio intermedio (bytecode jvm) e quindi eseguendo su un'altra linea. In effetti posso riscrivere il python per rompere i due passaggi, come in questo domanda SO .

Sembra che le persone facciano un grosso problema sulla netta differenza tra i linguaggi compilati e quelli interpretati. Sembra che le linee siano completamente sfocate. Altri linguaggi interpretati popolari hanno caratteristiche simili. Php "compila" i propri opcode che possono essere memorizzati nella cache o memorizzati per un uso successivo. Anche Perl è compilato per qualcosa.

Quindi ... c'è davvero qualche differenza tra questi popolari linguaggi interpretati e i popolari linguaggi compilati che vengono compilati su macchine virtuali? Forse in un caso le VM sono in genere più residenti in memoria mentre con le lingue "interpretate" di solito hanno i loro runtime attivati? Eppure sembra che potrebbe essere facilmente cambiato.

Eppure sembra che ci sia ancora qualcosa di diverso. Se sono più o meno uguali, allora perché è la performance di Java / C # sembra avvicinarsi al C ++ mentre i linguaggi "interpretati" sono ancora in ordine di grandezza? Se sono tutti veramente bytecode in esecuzione su una VM e sono tutti uguali, perché la grande differenza nelle prestazioni?

    
posta Doug T. 18.07.2012 - 16:28
fonte

2 risposte

6

Ci sono molte differenze. Prima di tutto, pensa alla differenza tra un interprete bytecode e un interprete di linguaggio. È facile interpretare il bytecode, perché tutti i comandi seguono un formato prevedibile, ma l'interpretazione di una lingua implica l'analisi e il leingaggio - operazioni che possono essere molto onerose, a seconda della lingua.

C # e Java non si limitano a compilare in bytecode. Usano anche la compilazione JIT, che consente loro di interpertare il bytecode alcune volte per l'intera durata dell'applicazione e di memorizzare il risultato nella cache, invece di interpretarlo ogni volta che il thread di esecuzione incappa su di esso, il che implicherebbe una grande ridondanza.

Per quanto mi ricordo, python può compilare in bytecode, ma non usa JIT, che può aumentare drasticamente le prestazioni.

    
risposta data 18.07.2012 - 16:38
fonte
0

In genere, le lingue interpretate non sono idonee per l'analisi statica completa (ad esempio il controllo del tipo statico su più moduli) e l'ottimizzazione. La compilazione in bytecode può fornire questo. OTOH, le lingue interpretate possono essere eseguite anche se mancano alcune parti (librerie, ecc.), Perché i riferimenti sono in ritardo. IOW, se in realtà non si chiama il codice, non importa se è lì o no.

    
risposta data 18.07.2012 - 17:55
fonte