Python è interpretato o compilato?

69

Questa è solo una meraviglia che ho avuto durante la lettura di linguaggi interpretati e compilati.

Ruby è senza dubbio un linguaggio interpretato in quanto il codice sorgente viene elaborato da un interprete nel punto di esecuzione.
Al contrario, C è un linguaggio compilato, in quanto è necessario compilare il codice sorgente prima in base alla macchina e quindi eseguirlo. Questo risultato è un'esecuzione molto più rapida.

Ora arrivo a Python :

  • Un codice python ( somefile.py ) quando importato crea un file ( somefile.pyc ) nella stessa directory. Supponiamo che l'importazione avvenga in una shell python o in un modulo django. Dopo l'importazione cambio un po 'il codice ed eseguo di nuovo le funzioni importate per scoprire che è ancora in esecuzione il vecchio codice. Ciò suggerisce che i file * .pyc sono file python compilati simili all'eseguibile creato dopo la compilazione di un file C, sebbene non sia possibile eseguire direttamente il file * .pyc.
  • Quando il file python (somefile.py) viene eseguito direttamente (./somefile.py o python somefile.py) non viene creato alcun file .pyc e il codice viene eseguito come indica un comportamento interpretato.

Questi suggeriscono che un codice python viene compilato ogni volta che viene importato in un nuovo processo per creare un file .pyc mentre viene interpretato quando viene eseguito direttamente.

Quindi quale tipo di linguaggio dovrei considerare come? Interpretato o compilato? E come si confronta la sua efficienza con le lingue interpretate e compilate?

Secondo la pagina Interpreted Languages di wiki, è elencata come una lingua compilata su Virtual Machine Code, che cos'è significato da quello?

    
posta crodjer 08.12.2010 - 08:28
fonte

5 risposte

71

Vale la pena notare che le lingue non sono interpretate o compilate, ma piuttosto le implementazioni linguistiche interpretano o compilano il codice. Hai notato che Ruby è un "linguaggio interpretato", ma puoi compilare Ruby à la MacRuby , quindi non è sempre un linguaggio interpretato.

Praticamente ogni implementazione Python consiste in un interprete (piuttosto che in un compilatore). I file .pyc che vedi sono codice byte per la macchina virtuale Python (simile ai file .class di Java). Non sono uguali al codice macchina generato da un compilatore C per un'architettura macchina nativa. Alcune implementazioni Python, tuttavia, consistono in un compilatore just-in-time che compilerà il codice byte Python nel codice macchina nativo.

(Dico "praticamente ogni" perché non conosco alcun compilatore di macchine native per Python, ma non voglio affermare che nessuno esiste da nessuna parte.)

    
risposta data 08.12.2010 - 15:39
fonte
31

Python cadrà sotto il codice byte interpretato. .py il codice sorgente viene prima compilato nel codice byte come .pyc . Questo codice byte può essere interpretato (CPython ufficiale) o JIT compilato (PyPy). Il codice sorgente Python ( .py ) può essere compilato in codice byte differente, come IronPython (.Net) o Jython (JVM). Esistono diverse implementazioni del linguaggio Python. Quello ufficiale è un codice byte interpretato. Esistono anche implementazioni compilate JIT in codice byte

Per i confronti di velocità di varie implementazioni di lingue puoi provare qui .

    
risposta data 08.12.2010 - 08:52
fonte
10

Compilato contro interpretato può essere utile in alcuni contesti, ma quando viene applicato in senso tecnico, è una falsa dicotomia.

Un compilatore (nel senso più ampio) è un traduttore . Traduce il programma A nel programma B e per l'esecuzione futura usando una macchina M.

Un interprete (nel senso più ampio) è un esecutore . È una macchina M che esegue il programma A. Anche se in genere escludiamo da queste definizioni le macchine fisiche (o le macchine non fisiche che agiscono proprio come quelle fisiche). Ma dal punto di vista teorico, questa distinzione è alquanto arbitraria.

Ad esempio, prendi re.compile . "Compila" un'espressione regolare su una forma intermedia e quella forma intermedia viene interpretata / valutata / eseguita.

Alla fine, dipende da quale livello di astrazione stai parlando e da cosa ti interessa. Le persone dicono "compilate" o "interpretate" come descrizioni ampie delle parti più interessanti del processo, ma in realtà la maggior parte di ogni programma è compilato (tradotto) e interpretato (eseguito) in un modo o nell'altro.

CPython (l'implementazione più popolare del linguaggio Python) è per lo più interessante per l'esecuzione del codice. Quindi CPython sarebbe tipicamente descritto come interpretato. Anche se questa è un'etichetta sfusa.

    
risposta data 23.10.2015 - 07:33
fonte
6

Codice macchina virtuale è una versione più compatta del codice sorgente originale (codice byte). Ha ancora bisogno di essere interpretato da una macchina virtuale, poiché non è un codice macchina. Tuttavia, è più facile e più veloce analizzare il codice originale scritto da un essere umano.

Alcune macchine virtuali generano codice macchina durante l'interpretazione del codice della macchina virtuale per la prima volta (just in time compilation - JIT). Le seguenti chiamate useranno direttamente questo codice macchina, che porta a un'esecuzione più rapida.

Per quanto ne so, Ruby > = 1.9 usa anche una macchina virtuale come Python.

    
risposta data 08.12.2010 - 08:48
fonte
5

Il runtime Python esegue codice oggetto personalizzato (codice byte) su una macchina virtuale.

Il processo di compilazione converte il codice sorgente in codice oggetto.

Per velocizzare le cose, il codice oggetto (o il codice byte, se preferisci) è memorizzato su disco, quindi può essere riutilizzato al prossimo avvio del programma.

    
risposta data 08.12.2010 - 08:55
fonte