it-swarm.it

È Python interpretato o compilato?

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 il codice sorgente prima in base alla macchina e poi eseguire. Questo risultato è un'esecuzione molto più veloce.

Ora arrivo a Python :

  • A python ( somefile.py ) quando importato crea un file ( somefile.pyc ) nella stessa directory. Supponiamo che l'importazione avvenga in un python Shell o 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, questo suggerisce che i file * .pyc sono compilati python 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 file il codice viene eseguito come indica un comportamento interpretato.

Questi suggeriscono che un python di 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 Interpreted Languages della wiki, è elencata come una lingua compilata in Virtual Machine Code, cosa si intende con questo?

82
crodjer

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

Praticamente ogni Python è costituita da un interprete (piuttosto che da un compilatore). I file .pyc Che vedi sono in codice byte per Python macchina virtuale (simile ai file .class di Java). Non sono gli stessi del codice macchina generato da un compilatore C per un'architettura di macchina nativa. Alcuni Python, tuttavia, sono costituiti da un compilatore just-in-time che compilerà il codice byte Python in codice macchina nativo.

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

83
mipadi

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

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

36
aufather

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 Python) è per lo più interessante per l'esecuzione del codice. Quindi CPython verrebbe in genere descritto come interpretato. Sebbene si tratti di un'etichetta libera.

11
Paul Draper

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 una macchina virtuale come Python.

7

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 memorizzato sul disco, quindi può essere riutilizzato alla successiva esecuzione del programma.

5
ykombinator