Java" Macchina virtuale "vs Python" Interprete " gergo?


Sembra raro leggere di una "macchina virtuale" Python mentre in Java "macchina virtuale" viene utilizzato tutto il tempo.

Entrambi interpretano i codici byte; perché chiamare uno una macchina virtuale e l'altro un interprete?

Author: Matthias Braun, 2009-01-14

9 answers

Una macchina virtuale è un ambiente di calcolo virtuale con un insieme specifico di istruzioni atomiche ben definite che sono supportate indipendentemente da qualsiasi linguaggio specifico ed è generalmente pensata come una sandbox a sé stante. La VM è analoga a un set di istruzioni di una CPU specifica e tende a funzionare a un livello più fondamentale con blocchi di base di tali istruzioni (o codici di byte) che sono indipendenti dalla successiva. Un'istruzione viene eseguita in modo deterministico in base solo al stato corrente della macchina virtuale e non dipende da informazioni altrove nel flusso di istruzioni in quel momento.

Un interprete d'altra parte è più sofisticato in quanto è adattato per analizzare un flusso di una sintassi che è di un linguaggio specifico e di un grammer specifico che deve essere decodificato nel contesto dei token circostanti. Non puoi guardare ogni byte o anche ogni riga in isolamento e sapere esattamente cosa fare dopo. I token nella lingua non possono essere presi in isolamento come possono rispetto alle istruzioni (codici byte) di una VM.

Un compilatore Java converte il linguaggio Java in un flusso di codice byte non diverso da un compilatore C converte i programmi in linguaggio C in codice assembly. Un interprete d'altra parte non converte realmente il programma in una forma intermedia ben definita, prende solo le azioni del programma come una questione del processo di interpretazione della fonte.

Un altro test della differenza tra una VM e un interprete è se lo pensi come indipendente dalla lingua. Ciò che conosciamo come Java VM non è realmente specifico per Java. È possibile creare un compilatore da altre lingue che generano codici di byte che possono essere eseguiti sulla JVM. D'altra parte, non penso che penseremmo davvero di "compilare" qualche altro linguaggio diverso da Python in Python per l'interpretazione da parte dell'interprete Python.

A causa della sofisticazione del processo di interpretazione, questo può essere relativamente lento processo....in particolare l'analisi e l'identificazione dei token di lingua, ecc. e comprendere il contesto della fonte per essere in grado di intraprendere il processo di esecuzione all'interno dell'interprete. Per accelerare tali linguaggi interpretati, è qui che possiamo definire forme intermedie di codice sorgente pre-analizzato e pre-tokenizzato che è più facilmente interpretato direttamente. Questo tipo di forma binaria è ancora interpretato al momento dell'esecuzione, è solo a partire da una forma molto meno leggibile da migliorare prestazione. Tuttavia, la logica che esegue quel modulo non è una macchina virtuale, perché quei codici non possono ancora essere presi in isolamento - il contesto dei token circostanti è ancora importante, sono solo ora in una forma diversa più efficiente del computer.

 113
Author: Tall Jeff, 2009-01-14 17:16:25

In questo post, "macchina virtuale" si riferisce a elaborare macchine virtuali, non a macchine virtuali di sistema come Qemu o Virtualbox. Una macchina virtuale di processo è semplicemente un programma che fornisce un ambiente di programmazione generale a un programma che può essere programmato.

Java ha un interprete e una macchina virtuale, e Python ha una macchina virtuale macchina così come un interprete. La ragione "macchina virtuale" è un altro termine comune in Java e "interprete" è un termine più comune in Python ha molto a che fare con la principale differenza tra le due lingue: tipizzazione statica (Java) vs tipizzazione dinamica (Python). In questo contesto, "tipo" si riferisce a tipi di dati primitivi types tipi che suggeriscono la dimensione della memoria dati. La macchina virtuale Java è facile. Richiede al programmatore di specificare il tipo di dati primitivo di ciascuna variabile. Ciò fornisce sufficiente informazioni per Java bytecode non solo per essere interpretato ed eseguito dal Macchina virtuale Java, ma anche essere compilato nelle istruzioni della macchina . La macchina virtuale Python è più complessa nel senso che assume compito aggiuntivo di pausa prima dell'esecuzione di ogni operazione per determinare i tipi di dati primitivi per ogni variabile o struttura di dati coinvolti nel operazione. Python libera il programmatore dal pensare in termini di dati primitivi tipi e consente di esprimere le operazioni a un livello superiore. Il prezzo di questa libertà è performance. "Interprete" è il termine preferito per Python perché deve mettere in pausa per ispezionare i tipi di dati e anche perché sintassi relativamente concisa di linguaggi tipizzati dinamicamente è una buona misura per interfacce interattive. Non c'è barriera tecnica per costruire un interattivo Interfaccia Java, ma cercando di scrivere qualsiasi codice tipizzato staticamente in modo interattivo sarebbe noioso, quindi non è fatto in questo modo.

Nel mondo Java, la macchina virtuale ruba lo spettacolo perché esegue programmi scritto in una lingua che può effettivamente essere compilato in istruzioni della macchina, e il risultato è la velocità e l'efficienza delle risorse. Java bytecode può essere eseguito dalla macchina virtuale Java con prestazioni che si avvicinano a quelle di compiled programmi, relativamente parlando. Ciò è dovuto alla presenza di dati primitivi digitare le informazioni nel bytecode. La macchina virtuale Java mette Java in un categoria propria:

Portable interpreted statically-typed language

La prossima cosa più vicina è LLVM, ma LLVM opera a un livello diverso:

Linguaggio assembly interpretato portatile

Il termine "bytecode" è usato sia in Java che in Python, ma non tutti i bytecode sono creato uguale. bytecode è solo il termine generico per le lingue intermedie utilizzato da compilatori / interpreti. Anche i compilatori C come gcc usano un intermedio lingua (o più) per ottenere il lavoro fatto. bytecode Java contiene informazioni sui tipi di dati primitivi, mentre il bytecode Python no. In questo rispetto, il Python (e Bash, Perl, Ruby, ecc.) la macchina virtuale è veramente fondamentalmente più lento della macchina virtuale Java, o meglio, ha semplicemente ancora lavoro da fare. È utile considerare quali informazioni sono contenute in diversi formati di bytecode:

  • Per maggiori informazioni clicca qui]}
  • Java: tipi di dati primitivi
  • Python: tipi definiti dall'utente

Per tracciare un'analogia del mondo reale: LLVM funziona con gli atomi, il Java macchina virtuale funziona con le molecole e la macchina virtuale Python funziona con i materiali. Dal momento che tutto deve alla fine decomporsi in particelle subatomiche (reali operazioni macchina), la macchina virtuale Python ha il compito più complesso.

Intepreters / compilatori di linguaggi tipizzati staticamente semplicemente non hanno lo stesso bagaglio che hanno interpreti / compilatori di linguaggi tipizzati dinamicamente. I programmatori di linguaggi tipizzati staticamente devono prendere il gioco, per il quale il guadagno è prestazione. Tuttavia, proprio come tutte le funzioni non deterministiche sono segretamente deterministico, così sono tutti i linguaggi tipizzati dinamicamente segretamente tipizzato staticamente. Differenze di prestazioni tra le due famiglie linguistiche dovrebbe quindi livellare intorno al tempo Python cambia il suo nome in HAL 9000.

Le macchine virtuali di linguaggi dinamici come Python implementano alcuni idealizzati macchina logica, e non necessariamente corrispondono molto da vicino a qualsiasi reale hardware fisico. Il Java virtuale la macchina, al contrario, è più simile in funzionalità di un compilatore C classico, tranne che invece di emettere istruzioni della macchina, esegue le routine incorporate. In Python, un numero intero è un oggetto Python con una serie di attributi e metodi ad esso collegati. In Java, un int è un numero designato di bit, di solito 32. Non è proprio un confronto equo. Gli interi Python dovrebbero davvero essere confrontati con Java Classe Integer. Il tipo di dati primitivo "int" di Java non può essere paragonato a nulla in il linguaggio Python, perché il linguaggio Python manca semplicemente di questo livello di primitive, e così fa Python bytecode.

Poiché le variabili Java sono esplicitamente digitate, ci si può ragionevolmente aspettare qualcosa come Jython prestazioni per essere nello stesso campo da baseball di cPython . D'altra parte, una macchina virtuale Java implementata in Python è quasi garantito per essere più lento del fango. E non aspettarti Ruby, Perl, ecc., per cavarsela meglio. Non sono stati progettati per farlo. Sono stati progettati per "scripting", che è ciò che si chiama programmazione in un linguaggio dinamico.

Ogni operazione che si svolge in una macchina virtuale alla fine deve colpire l'hardware reale. Le macchine virtuali contengono routine precompilate che sono abbastanza generali da eseguire qualsiasi combinazione di operazioni logiche. Una macchina virtuale potrebbe non emettere nuove istruzioni della macchina, ma certamente sta eseguendo le proprie routine più e più volte in sequenze arbirtrarily complesse. Java macchina virtuale, la macchina virtuale Python, e tutte le altre macchine virtuali general-purpose là fuori sono uguali nel senso che possono essere blanditi in esecuzione di qualsiasi logica si può sognare, ma sono diversi in termini di quali compiti assumono, e quali compiti lasciano al programmatore.

Psyco per Python non è una macchina virtuale Python completa, ma un just-in-time compilatore che dirotta la normale macchina virtuale Python nei punti in cui lo pensa può compilare alcune righe di codice -- principalmente loop dove pensa che il primitivo il tipo di qualche variabile rimarrà costante anche se il valore sta cambiando con ogni iterazione. In tal caso, può rinunciare ad alcuni del tipo incessante determinazione della normale macchina virtuale. Devi stare un po ' attento, anche se, per non tirare il tipo fuori da sotto i piedi di Psyco. Pysco, tuttavia, di solito sa di tornare alla normale macchina virtuale se non lo è completamente sicuro che il tipo non cambierà.

La morale di la storia è che le informazioni sul tipo di dati primitivi sono davvero utile per un compilatore / macchina virtuale.

Infine, per mettere tutto in prospettiva considera questo: un programma Python eseguito da un interprete Python / macchina virtuale implementata in Java in esecuzione su un Java interprete / macchina virtuale implementata in LLVM in esecuzione in un qemu virtuale macchina in esecuzione su un iPhone.

Permalink

 128
Author: pooryorick, 2009-11-14 04:55:15

Probabilmente una ragione per la diversa terminologia è che normalmente si pensa di alimentare il codice sorgente grezzo leggibile dall'interprete Python e non preoccuparsi del bytecode e tutto il resto.

In Java, devi compilare esplicitamente in bytecode e quindi eseguire solo il bytecode, non il codice sorgente sulla VM.

Anche se Python usa una macchina virtuale sotto le coperte, dal punto di vista di un utente, si può ignorare questo dettaglio la maggior parte del tempo.

 54
Author: Mr Fooz, 2009-01-14 03:56:21

Interprete, traduce il codice sorgente in una rappresentazione intermedia efficiente (codice) e lo esegue immediatamente.

Virtual Machine , esegue esplicitamente il codice precompilato memorizzato creato da un compilatore che fa parte del sistema dell'interprete.

Una caratteristica molto importante di una macchina virtuale è che il software in esecuzione all'interno, è limitato alle risorse fornite dalla macchina virtuale. Precisamente, non può uscire dal suo mondo virtuale. Pensa all'esecuzione sicura di codice remoto, applet Java.

Nel caso di python, se stiamo mantenendo i file pyc, come menzionato nel commento di questo post, allora il meccanismo diventerebbe più simile a una VM, e questo bytecode viene eseguito più velocemente-sarebbe ancora interpretato ma da una forma molto più amichevole del computer. Se guardiamo a questo nel suo complesso, PVM è un ultimo passo di interprete Python.

La linea di fondo è, quando si riferiscono interprete Python, significa che ci riferiamo come un intero, e quando diciamo PVM, ciò significa che stiamo solo parlando di una parte dell'interprete Python, un ambiente di runtime. Simile a quello di Java, ci riferiamo a diverse parti differentyl, JRE,JVM, JDK, ecc.

Per saperne di più, Voce di Wikipedia: Interprete , e Macchina virtuale . Ancora un altro qui . Qui puoi trovare il Confronto delle macchine virtuali applicative . Aiuta a comprendere la differenza tra compilatori, interpreti e macchine virtuali.

 14
Author: Adeel Ansari, 2015-05-29 11:15:40

Il termine interprete è un termine legacy risalente ai precedenti linguaggi di scripting della shell. Poiché i "linguaggi di scripting" si sono evoluti in linguaggi completi e le loro piattaforme corrispondenti sono diventate più sofisticate e sandbox, la distinzione tra una macchina virtuale e un interprete (nel senso Python), è molto piccola o inesistente.

L'interprete Python funziona ancora allo stesso modo di uno script di shell, nel senso che può essere eseguito senza un separato fase di compilazione. Oltre a ciò, le differenze tra l'interprete di Python (o Perl o Ruby) e la macchina virtuale di Java sono per lo più dettagli di implementazione. (Si potrebbe sostenere che Java è più completamente sandbox di Python, ma entrambi alla fine forniscono l'accesso all'architettura sottostante tramite un'interfaccia C nativa.)

 12
Author: Daniel Naab, 2009-01-14 04:27:47

Non c'è vera differenza tra loro, le persone seguono semplicemente le convenzioni che i creatori hanno scelto.

 8
Author: Cody Brocious, 2009-01-14 03:41:23

Non dimenticare che Python ha compilatori JIT disponibili per x86, confondendo ulteriormente il problema. (Vedi psyco).

Un'interpretazione più rigorosa di un 'linguaggio interpretato' diventa utile solo quando si discutono problemi di prestazioni della VM, ad esempio, rispetto a Python, Ruby was (is?) considerato più lento perché è un linguaggio interpretato, a differenza di Python-in altre parole, il contesto è tutto.

 3
Author: Arafangion, 2009-01-14 04:36:21

Prima di tutto dovresti capire che la programmazione o l'informatica in generale non è matematica e non abbiamo definizioni rigorose per la maggior parte dei termini che usiamo spesso.

Ora alla tua domanda :

Che cos'è un interprete (in informatica)

Traduce il codice sorgente per unità eseguibile più piccola e quindi esegue quell'unità.

Che cos'è una macchina virtuale

In caso di JVM la macchina virtuale è un software che contiene un interprete, caricatori di classe, garbage collector , scheduler di thread, compilatore JIT e molte altre cose.

Come puoi vedere l'interprete è una parte o JVM e l'intera JVM non può essere chiamata interprete perché contiene molti altri componenti.

Perché usare la parola "Interprete" quando si parla di python

Con java la parte di compilazione è esplicita. python d'altra parte non è esplicito come java sul suo processo di compilazione e interpretazione, dalla fine l'interpretazione prospettica dell'utente è l'unico meccanismo utilizzato per eseguire programmi python

 0
Author: mightyWOZ, 2016-10-01 09:06:40

No, entrambi non interpretano il codice byte.

Python interpreta il bytecode solo se si esegue con pypy. Altrimenti viene compilato in C e interpretato a quel livello.

Java compila in bytecode.

 0
Author: Michael Tamillow, 2018-03-12 17:46:44