Domanda

mi è stato dato di capire che Python è un linguaggio interpretato ... Tuttavia, quando guardo il mio codice sorgente Python vedo file .pyc, che identifica Windows come "Files Python compilato". Da dove vengono questi sono disponibili in?

È stato utile?

Soluzione

byte di codice , che è ciò che l'interprete Python compila la sorgente. Questo codice viene poi eseguito da macchina virtuale di Python.

la documentazione di Python, spiega la definizione in questo modo:

Python è un linguaggio interpretato, come invece di uno compilato, se la distinzione può essere sfocata a causa di la presenza del compilatore bytecode. Ciò significa che i file di origine può essere eseguire direttamente senza esplicitamente creando un eseguibile che viene poi run.

Altri suggerimenti

mi è stato dato di capire che Python è un linguaggio interpretato ...

Questo meme popolare è errato, o meglio, costruito su un equivoco di livelli (naturale) della lingua: un errore simile sarebbe a dire "la Bibbia è un libro a copertina rigida". Mi spiego che similitudine ...

"La Bibbia" è "un libro", nel senso di essere un class di (reali oggetti fisici, identificati come) libri; i libri identificati come "copie della Bibbia" si suppone di avere qualcosa di fondamentale in comune (il contenuto, sebbene anche questi possono essere in diverse lingue, con diverse traduzioni accettabili, livelli di note e altre annotazioni) - tuttavia, quei libri sono perfettamente consentito differire in una miriade di aspetti che sono non considerato fondamentale - tipo di legame, colore del legame, font (s) utilizzato nella stampa, illustrazioni eventuali, ampi margini scrivibile o no , numeri e tipi di builtin segnalibri, e così via, e così via.

E 'abbastanza possibile che un tipico la stampa della Bibbia sarebbe veramente in copertina rigida vincolante - dopo tutto, è un libro che è in genere fatto per essere letto più e più volte, segnalibro in diversi posti, sfogliato attraverso alla ricerca di dati puntatori capitolo-e-verse, ecc, ecc, e una buona copertina rigida vincolante può fare una determinata copia durare più a lungo sotto tale utilizzo. Tuttavia, questi sono banali (pratiche) questioni che non possono essere utilizzati per determinare se un dato oggetto libro vero e proprio è una copia della Bibbia o no: stampe brossura sono perfettamente possibile

!

Allo stesso modo, Python è un "linguaggio", nel senso di definire una classe di lingua implementazioni , che deve essere tutti simile in alcuni aspetti fondamentali (sintassi, la maggior parte semantica, eccetto quelle parti di quelli dove sono esplicitamente permesse di dissentire), ma sono pienamente autorizzati a differire in quasi ogni dettaglio "implementazione" - tra cui il modo in cui trattano i file di origine sono dato, se compilare i sorgenti in una certa inferiore forme di livello (e, in caso affermativo, quale forma - e se risparmiano tali forme compilati, su disco o altrove)., come si eseguono dette forme, e così via

L'applicazione classica, CPython, è spesso chiamato semplicemente "Python" in breve - ma è solo una delle numerose implementazioni di produzione di qualità, fianco a fianco con Microsoft IronPython (che viene compilato in codice CLR, vale a dire, "NET" ), Jython (che viene compilato in codice JVM), PyPy (che è scritto in Python per sé e in grado di compilare in una grande varietà di forme "back-end" tra cui "just-in-time" linguaggio macchina generato). Sono tutti Python (== "implementazioni del linguaggio Python"), proprio come molti oggetti del libro superficialmente differenti possono essere tutti Bibbie (== "copie della Bibbia").

Se siete interessati a CPython particolare: compila i file di origine in un Python specifica forma di livello inferiore (noto come "bytecode"), lo fa automaticamente quando necessario (se non c'è alcun file bytecode corrispondente ad una fonte file o il file bytecode è più vecchio di quello di origine o compilato da una diversa versione di Python), di solito salva i file bytecode su disco (per evitare di ricompilare in futuro). OTOH IronPython in genere compilare in codice CLR (salvandoli su disco o meno, a seconda) e Jython per codici JVM (salvarli su disco o no - sarà utilizzare l'estensione .class se lo fa salvarli).

Queste forme di livello inferiore vengono quindi eseguito da adeguate "macchine virtuali" noto anche come "interpreti" -. Il CPython VM, il runtime .NET, Java VM (aka JVM), a seconda dei casi

Quindi, in questo senso (quello che fanno le implementazioni tipiche fanno), Python è un "linguaggio interpretato" se e solo se C # e Java sono: tutti hanno una strategia tipica implementazione di produrre bytecode prima, quindi l'esecuzione tramite un VM / interprete.

È più probabile che il focus è su come "pesante", Lento, e di alta cerimonia il processo di compilazione è. CPython è progettato per compilare il più velocemente possibile, il più leggero possibile, con un minimo di cerimonia fattibile - il compilatore fa molto poco controllo degli errori e l'ottimizzazione, in modo che possa correre veloce e in piccole quantità di memoria, che a sua volta lascia essere eseguito automaticamente e in modo trasparente quando necessario, senza che l'utente nemmeno bisogno di essere consapevoli del fatto che v'è una compilazione in corso, la maggior parte del tempo. Java e C # di solito accettano più lavoro durante la compilazione (e quindi non eseguono la compilazione automatica) al fine di verificare gli errori più a fondo e di eseguire più ottimizzazioni. Si tratta di un continuum di scale di grigio, non una situazione di bianco o nero, e sarebbe del tutto arbitrario di mettere una soglia a un certo determinato livello e dire che solo al di sopra di tale livello si chiama "compilation" -!)

Non v'è alcuna cosa come un linguaggio interpretato. Se un interprete o un compilatore viene utilizzato è puramente una caratteristica del applicazione e non ha assolutamente nulla a che fare con la lingua.

ogni la lingua può essere implementata sia da un interprete o un compilatore. La stragrande maggioranza delle lingue hanno almeno una realizzazione di ogni tipo. (Per esempio, ci sono interpreti per C e C ++ e ci sono compilatori per JavaScript, PHP, Perl, Python e Ruby.) Inoltre, la maggior parte delle moderne implementazioni lingua effettivamente combinano sia un interprete e un compilatore (o anche più compilatori).

Una lingua è solo un insieme di regole matematiche astratte. Un interprete è una delle diverse strategie di implementazione concrete per una lingua. Quei due in diretta su completamente differenti livelli di astrazione. Se inglesi erano un linguaggio tipizzato, il termine "linguaggio interpretato" sarebbe un errore di tipo. L'affermazione "Python è un linguaggio interpretato" non è solo falsa (perché essere falsa implicherebbe che la dichiarazione rende ancora senso, anche se è sbagliato), ma semplicemente non fa senso , perché una lingua può non essere definito come "interpretato".

In particolare, se si guardano le implementazioni Python attualmente esistenti, queste sono le strategie di attuazione che stanno utilizzando:

  • IronPython: compila in alberi DLR cui il DLR compila poi a CIL bytecode. Quello che succede al bytecode CIL dipende da quale CLI VES si esegue su, ma Microsoft .NET, GNU Portable.NET e Novell Mono finirà per compilarlo in codice macchina nativo.
  • Jython: interpreta pitone sorgente fino all'individuazione percorsi di codice caldi, che si compila poi JVML bytecode. Quello che succede al bytecode JVML dipende da quale JVM si esegue su. Maxine compilerà direttamente al codice nativo non-ottimizzata fino all'individuazione percorsi di codice caldi, che si ricompone poi in codice nativo ottimizzato. HotSpot dapprima interpretare il bytecode JVML e poi eventualmente compilare i percorsi di codice caldo in codice macchina ottimizzato.
  • PyPy:. Compilato in PyPy bytecode, che poi viene interpretata dalla PyPy VM fino a quando non individua i percorsi di codice calde che si compila poi in codice nativo, JVML bytecode o CIL bytecode a seconda di quale piattaforma si sta lavorando su
  • CPython:. Viene compilato in bytecode CPython che poi interpreta
  • Stackless Python:. Viene compilato in bytecode CPython che poi interpreta
  • vuoto rondine. Compilazioni a CPython bytecode che poi interpreta fino all'individuazione percorsi di codice caldi che si compila poi LLVM IR cui il compilatore LLVM compila poi in codice macchina nativo
  • Cython: compila il codice Python in codice C portatile, che viene poi compilato con un compilatore C standard
  • Nuitka: compila codice Python per macchina-dipendente codice C ++, che viene poi compilato con un compilatore standard C

Si potrebbe notare che ogni singolo una delle implementazioni in tale elenco (più alcuni altri non ho menzionato, come tinypy, Shedskin o Psyco) ha un compilatore. Infatti, per quanto ne so, non c'è attualmente alcuna implementazione Python che è puramente interpretato, non esiste prevista attuazione e non c'è mai stato un tale attuazione.

Non solo il termine "interpretato linguaggio" non ha senso, anche se si interpreta nel senso "linguaggio con l'attuazione interpretato", chiaramente non è vero. Chiunque voi ha detto che, ovviamente, non sa che cosa sta parlando.

In particolare, i file .pyc che state vedendo vengono memorizzati nella cache bytecode file prodotti da CPython, Stackless Python o vuoto Rondine.

Questi sono creati da l'interprete Python quando un file .py viene importato, e contengono il "bytecode compilato" del modulo / programma importato, l'idea è che la "traduzione" dal codice sorgente in bytecode (che ha solo bisogno di essere fatto una volta) può essere saltato su imports successivi se la .pyc è più recente del file corrispondente .py, accelerando così l'avvio un po '. Ma è ancora interpretato.

Per accelerare il caricamento dei moduli, Python memorizza il contenuto compilato dei moduli in .pyc.

CPython compila il suo codice sorgente in "byte code", e per motivi di prestazioni, si memorizza nella cache il codice di byte del file system ogni volta che il file di origine contiene modifiche. Questo rende il caricamento di moduli Python molto più veloce perché la fase di compilazione può essere bypassato. Quando il file di origine è foo.py, CPython memorizza nella cache il bytecode in un file foo.pyc proprio accanto alla sorgente.

In python3, macchinari di importazione di Python è esteso a scrittura e la ricerca di file di cache bytecode in una singola directory all'interno di ogni directory del pacchetto di Python. Questa directory verrà chiamato __pycache__.

Ecco un diagramma di flusso che descrive come moduli vengono caricati:

 entrare descrizione dell

Per ulteriori informazioni:

ref: PEP3147
ref: “compilato” file Python

Questo è per i principianti,

Python compila automaticamente lo script di codice compilato, così chiamato bytecode, prima di eseguirlo.

L'esecuzione di uno script non è considerato un'importazione e verrà creato alcun .pyc.

Per esempio, se si dispone di un file di script abc.py che le importazioni un altro modulo xyz.py , quando si esegue abc.py , xyz.pyc sarà creato dal xyz è importata, ma nessun file abc.pyc sarà creato dal abc.py non viene importato.

Se è necessario creare un file .pyc per un modulo che non è importata, è possibile utilizzare i moduli py_compile e compileall.

Il modulo py_compile può compilare manualmente qualsiasi modulo. Un modo è quello di utilizzare la funzione py_compile.compile in quel modulo interattivo:

>>> import py_compile
>>> py_compile.compile('abc.py')

Questo scriverà il .pyc nella stessa posizione come abc.py (è possibile ignorare che con il parametro cfile opzionale).

È inoltre possibile compilare automaticamente tutti i file in una directory o le directory utilizzando il modulo compileall.

python -m compileall

Se il nome della directory (la directory corrente in questo esempio) viene omesso, la compilazione dei moduli tutto trova sul sys.path

Python (almeno il più comune implementazione di esso) segue un modello di compilazione del sorgente originale per codici byte, allora interpretare i codici byte su una macchina virtuale. Ciò significa che (ancora una volta, l'implementazione più comune) non è né un interprete puro, né un compilatore puro.

L'altra faccia di questo è, tuttavia, che il processo di compilazione è in gran parte nascosto - i file .pyc sono fondamentalmente trattati come una cache; essi accelerare le cose, ma normalmente non c'è bisogno di essere a conoscenza di loro a tutti. E 'invalida automaticamente e ri-carichi (ri-compila il codice sorgente), se necessario, sulla base dei file data / ora francobolli.

Circa l'unica volta che ho visto un problema con questo è stato quando un file bytecode compilato in qualche modo ha un timestamp anche in futuro, il che significava che sempre guardato più recente del file di origine. Dal momento che sembrava più recente, il file di origine non è mai stato ricompilato, quindi non importa quali modifiche hai fatto, sono stati ignorati ...

file .py * di Python è solo un file di testo in cui si scrive alcune righe di codice. Quando si tenta di eseguire questo file utilizzando diciamo "python filename.py"

Questo comando richiama Python Virtual Machine. Python Virtual Machine ha 2 componenti: "compilatore" e "interprete". Interprete non può leggere direttamente il testo nel file * .py, in modo da questo testo è prima convertito in un codice di byte che si rivolge al PVM (non hardware, ma PVM) . PVM esegue questo codice di byte. viene generato anche file * .pyc, come parte di eseguirlo che svolge l'operazione di importazione in archivio in guscio o in qualche altro file.

Se questo file * .pyc viene già generato poi ogni successivo avvio / esecuzione il file * .py, sistema carica direttamente il file .pyc * che non avrà bisogno di alcun compilazione (Questo vi farà risparmiare alcuni cicli macchina di processore).

Una volta che il file * .pyc viene generato, non c'è bisogno di file * .py, a meno di modificarlo.

codice Python passa attraverso 2 fasi. Primo passo compila il codice in file .pyc che è in realtà un bytecode. Quindi questo file .pyc (bytecode) viene interpretato utilizzando CPython interprete. Si prega di fare riferimento a questo link . Qui processo di compilazione di codice e l'esecuzione è spiegato in termini semplici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top