Python è interpretato o compilato?


76

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

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

Ora in arrivo su 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 sta ancora eseguendo 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 .pyc mentre viene interpretato quando eseguito direttamente.

Quindi quale tipo di linguaggio dovrei considerarlo? Interpretato o compilato? E come si confronta la sua efficienza con i linguaggi interpretati e compilati?

Secondo la pagina Lingue interpretate della wiki , è elencata come una lingua compilata in Virtual Machine Code, cosa si intende con questo?


1
Quando c'è dubbio sul fatto che Ruby sia una lingua interpretata? Quando viene compilato. :) macruby.org
mipadi

8
Vale la pena notare che nessun linguaggio moderno è interpretato in senso stretto. Praticamente tutti compilati in bytecode.
Winston Ewert,

@Winston Ewert: bravo! Applesoft Basic (negli anni '80) è stato compilato con codice byte. "moderno" in questo caso, significa che ogni linguaggio interpretato nella memoria vivente con la sola eccezione possibile sono alcune implementazioni rudimentali di Dartmouth Basic.
S.Lott

6
>> Al contrario, C è un linguaggio compilato << root.cern.ch/drupal/content/cint
igouy,

3
@ S.Lott: Chiamare il processo di tokenizzazione che Applesoft e gli interpreti BASIC degli anni '80 hanno fatto "compilazione bytecode" è più che un po 'disonesto. Sì, il codice del programma inserito dall'utente è stato memorizzato in una forma compressa, un byte per parola riservata, ma non è stato fatto nulla fino a quando non è stato digitato RUN. Era come se tu avessi un compilatore che eseguiva il passaggio di lexing e quindi emettesse un flusso di token che dovevano essere replicati ogni volta che il programma veniva eseguito. Non è come la moderna compilazione di bytecode come, diciamo javac, fatta che comprende lex, analisi e ottimizzazione.
dodgethesteamroller,

Risposte:


80

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 di Python è composta da un interprete (piuttosto che da un compilatore). I .pycfile visualizzati sono in codice byte per la macchina virtuale Python (simile ai .classfile Java ). Non sono gli stessi del codice macchina generato da un compilatore C per un'architettura macchina nativa. Alcune implementazioni di Python, tuttavia, consistono in un compilatore just-in-time che compilerà il codice byte Python in 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.)


A seconda della definizione, esistono compilatori di macchine native per Python. Alcuni compilano solo un sottoinsieme di Python. Altri implementano tutto python ma usano l'API python per eseguire effettivamente le operazioni che non può eseguire in C.
Winston Ewert

Penso che tu stia effettivamente descrivendo che Python è o quello che definirei "semi-compilato", o che in realtà può essere completamente compilato. Per semi-compilato intendo che, poiché di solito è compilato nel file .pyc "linguaggio intermedio" utilizzato dalla macchina virtuale Python, di solito viene eseguito da questo modulo "semi-compilato", che generalmente rende il codice più veloce di semplice interpretazione runtime del codice interpretato. È interessante notare che il codice semi-compilato a volte può essere più veloce del codice compilato nativamente (ad es. C # è generalmente più veloce di C ++).
Chris Halcrow,

5
Cython compila il codice Python in C in modo che possa essere compilato come oggetto condiviso.
Greyfade,

Distinguere il codice byte e il codice macchina in questo modo è abbastanza arbitrario. Java viene compilato: il compilatore javac produce file di classe contenenti istruzioni di basso livello che possono essere eseguite, sia in una macchina virtuale (es. Hotspot) o direttamente dall'hardware (es. Su processori ARM con estensione Jazelle). Per quanto ne so, non esiste alcun motivo tecnico per cui un'architettura di processore simile non possa essere progettata per eseguire direttamente le istruzioni di Python VM.
Jules,

@Jules Per coincidenza, il codice Jython è in realtà compilato in file .class che credo siano riutilizzati fino a quando non si modifica la fonte py.
JimmyJames,

35

Python rientrerà nel codice byte interpretato. .pyil codice sorgente viene prima compilato in codice byte come .pyc. Questo codice byte può essere interpretato (CPython ufficiale) o compilato JIT (PyPy). Il codice sorgente Python ( .py) può essere compilato in diversi codici byte anche come IronPython (.Net) o Jython (JVM). Esistono molteplici implementazioni del linguaggio Python. Quello ufficiale è un codice byte interpretato. Esistono anche implementazioni compilate con codice byte JIT.

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


grazie per le informazioni. Secondo i benchmark le prestazioni di Python sono decisamente inferiori!
Crodjer,

1
Il link che ho dato molto chiaramente afferma che si tratta di parametri di riferimento imperfetti delle implementazioni del linguaggio . Python non dovrebbe essere la scelta del linguaggio se ti preoccupi troppo delle prestazioni di esecuzione. Se vuoi ancora confrontare, confronta lingue simili. CPython ufficiale interpretato da codice byte è paragonabile o più veloce di Ruby compilato da JIT.
aufather

1
@ jase21 - "I miei piani per il 2006 sono il porting delle tecniche implementate in Psyco su PyPy. PyPy ci permetterà di costruire uno specialista JIT più flessibile, più facile da sperimentare e senza il sovraccarico di dover rimanere in sintonia con le evoluzioni di il linguaggio Python ". psyco.sourceforge.net/introduction.html
igouy l'

1
@ jase21 - "fa correre i codici python più velocemente delle controparti C" - Dobbiamo solo prendere la tua parola per quello?
igouy,

3
Il link nella risposta è interrotto.
Basilevs

11

Compilato vs. interpretato può essere utile in alcuni contesti, ma se applicato in senso tecnico, è una falsa dicotomia.

Un compilatore (nel senso più ampio) è un traduttore . Traduce il programma A nel programma B e per future esecuzioni con una macchina M.

Un interprete (nel senso più ampio) è un esecutore . È una macchina M che esegue il programma A. Sebbene di solito escludiamo da queste definizioni macchine fisiche (o 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" una regex in una forma intermedia e quella forma intermedia viene interpretata / valutata / eseguita.


Alla fine, dipende dal livello di astrazione di cui stai parlando e da cosa ti interessa. La gente dice "compilato" o "interpretato" come ampie descrizioni delle parti più interessanti del processo, ma in realtà quasi tutti i programmi vengono compilati (tradotti) e interpretati (eseguiti) 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 verrebbe in genere descritto come interpretato. Anche se questa è un'etichetta sciolta.


7

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

Alcune macchine virtuali generano il codice macchina mentre interpretano il codice macchina virtuale per la prima volta (compilazione just in time - JIT). Le seguenti chiamate utilizzeranno direttamente questo codice macchina, il che porta a un'esecuzione più rapida.

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


5

Il runtime Python esegue il 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 si preferisce) viene archiviato sul disco, quindi può essere riutilizzato alla successiva esecuzione del programma.

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.