È una grande confusione per le persone che hanno iniziato a lavorare su Python e le risposte qui sono un po 'difficili da comprendere, quindi renderò più facile.
Quando chiediamo a Python di eseguire il nostro script, ci sono alcuni passaggi che Python esegue prima che il nostro codice inizi effettivamente a sgretolarsi:
- È compilato in bytecode.
- Quindi viene instradato alla macchina virtuale.
Quando eseguiamo un codice sorgente, Python lo compila in un codice byte. La compilazione è una fase di traduzione e il codice byte è una rappresentazione di codice sorgente indipendente dalla piattaforma di basso livello. Si noti che il codice byte Python non è un codice macchina binario (ad es. Istruzioni per un chip Intel).
In realtà, Python traduce ogni istruzione del codice sorgente in istruzioni per il codice byte, scomporle in singole fasi. La traduzione del codice byte viene eseguita per velocizzare l'esecuzione. Il codice byte può essere eseguito molto più rapidamente rispetto alle istruzioni del codice sorgente originale. Ha estensione.pyc e verrà scritto se può scrivere sulla nostra macchina.
Quindi, la prossima volta che eseguiremo lo stesso programma, Python caricherà il file .pyc e salterà il passaggio della compilazione a meno che non sia stato modificato. Python controlla automaticamente i timestamp dei file di codice sorgente e byte per sapere quando deve essere ricompilato. Se ripristiniamo il codice sorgente, il codice byte viene automaticamente creato nuovamente alla successiva esecuzione del programma.
Se Python non è in grado di scrivere i file del codice byte sulla nostra macchina, il nostro programma funziona ancora. Il codice byte viene generato in memoria e semplicemente scartato all'uscita dal programma. Ma poiché i file .pyc accelerano il tempo di avvio, potremmo voler assicurarci che sia stato scritto per programmi più grandi.
Riassumiamo cosa succede dietro le quinte. Quando un Python esegue un programma, Python legge il .py in memoria e lo analizza per ottenere un bytecode, quindi continua l'esecuzione. Per ogni modulo importato dal programma, Python verifica innanzitutto se esiste una versione precompilata di bytecode, in un .pyo o .pyc, che ha un timestamp che corrisponde al suo file .py. Python utilizza l'eventuale versione bytecode. Altrimenti, analizza il file .py del modulo, lo salva in un file .pyc e utilizza il bytecode appena creato.
I file di codice byte sono anche un modo per spedire i codici Python. Python eseguirà comunque un programma se non riesce a trovare i file are.pyc, anche se i file sorgente .py originali non sono presenti.
Python Virtual Machine (PVM)
Una volta che il nostro programma è stato compilato in codice byte, viene spedito per essere eseguito su Python Virtual Machine (PVM). PVM non è un programma separato. Non è necessario che sia installato da solo. In realtà, il PVM è solo un grande ciclo che scorre attraverso le nostre istruzioni di codice byte, uno per uno, per eseguire le loro operazioni. PVM è il motore di runtime di Python. È sempre presente come parte del sistema Python. È il componente che esegue veramente i nostri script. Tecnicamente è solo l'ultimo passo di quello che viene chiamato l'interprete Python.