Come funziona effettivamente Python Runtime?


26

Ho dei problemi a comprendere il concetto di a runtime library, specialmente quello di Python. Quindi ho scritto un programma Hello World Python e intendo eseguirlo, quindi scrivo python ./hello_world.py.

Quali passaggi si verificano tra me premendo il pulsante Invio e il codice macchina generato dal mio codice Python in esecuzione sulla mia CPU? E come si collega al sistema di runtime Python e / o alla libreria?


Questi due thread offrono una visione approfondita del runtime di Python: Python viene interpretato, compilato o entrambi? & Python è interpretato (come Javascript o PHP)? . Il runtime e la libreria di runtime non sono gli stessi. Mappandolo al mondo .NET che conosco: Common Language Runtime (CLR) e Framework / Base Class Library (FCL / BCL) non sono gli stessi.
RBT,

Risposte:


33

Per quanto diversi siano, ci sono una manciata di concetti comuni che condividono tutti i linguaggi di programmazione moderni e seri. Due di questi sono il nucleo della risposta per le tue domande precedenti.

Quali passaggi si verificano tra me premendo il pulsante Invio e il codice macchina generato dal mio codice Python in esecuzione sulla mia CPU?

Il codice viene analizzato, analizzato e inserito in un interprete. Si tratta di un'area molto importante dell'informatica nota come teoria dei compilatori . Un compilatore è un programma che traduce il codice da una lingua (il codice sorgente) in un'altra lingua (in genere codice macchina, anche se esistono "transpilers" che traducono da una lingua di alto livello in un'altra). Questo è un argomento davvero enorme che potresti dedicare anni alla ricerca, ma ecco la versione di base:

Il compilatore inizia con un parser , una routine che legge il codice sorgente e applica le regole di sintassi del linguaggio per capire se ha senso come codice Python valido (nel tuo caso). In caso contrario, il parser genererà un errore e il compilatore uscirà, ma in caso affermativo, il parser genera quello che è noto come albero di sintassi astratto, o in breve AST. L'AST è una struttura di dati ad albero i cui nodi contengono ciascuno un elemento della sintassi. Ad esempio, se dici x = 5, potresti finire con un BinaryExpressionnodo con un operatorvalore di =, un Leftvalore di ReferenceExpression(x)e un Rightvalore di IntegerLiteralExpression(5). L'intero programma può essere rappresentato da un grande albero come questo.

Una volta che il parser produce un AST, la seconda fase è l'analisi semantica . In parole povere, questo significa "capire cosa significa questo AST". Controlla l'AST per determinare se hai fatto qualcosa di illegale anche se è un'analisi valida (ad esempio, cercando di chiamare una funzione a 1 argomento con 3 argomenti) e genera errori se lo fai. Altrimenti, analizza l'AST ed esegue le modifiche per renderlo più semplice da capire per una macchina.

La terza fase è la generazione del codice. Una volta che si dispone di un AST completamente analizzato, semplificato e valido, lo si inserisce nel generatore, che percorre l'AST e produce codice nella lingua di output. Questo è il tuo prodotto finito.

Con Python, utilizza un interprete anziché un compilatore. Un interprete funziona esattamente come un compilatore, con una differenza: invece della generazione del codice, carica l'output in memoria ed esegue direttamente sul sistema. (I dettagli esatti su come ciò può accadere possono variare selvaggiamente tra lingue e interpreti diversi).

E come si collega al sistema di runtime Python e / o alla libreria?

Tutti tranne i linguaggi più semplici sono dotati di una serie di funzioni predefinite che sono importanti per una grande percentuale di utenti e che sarebbero difficili da implementare da soli per un motivo o per l'altro. Il loro codice può chiamare queste funzioni senza la necessità di librerie di terze parti. (Ad esempio, in Python avete print, che invia output a stdout. Buona fortuna implementandolo da soli!) Questo set di funzioni è generalmente raccolto in una libreria condivisa che il codice può chiamare in fase di esecuzione, motivo per cui è noto come la libreria di runtime della lingua, o semplicemente "il runtime" in breve.


Quindi il mio codice viene inviato a un altro programma (il sistema di runtime Python) che fa tutto ciò e termina quando il mio codice termina (e dopo la pulizia, ovviamente)?
hgiesel

@hgiesel Credo che nel caso di Python, l'interprete faccia parte del runtime. Questo non è il caso di ogni lingua. certo, ma è abbastanza comune tra le lingue interpretate.
Mason Wheeler,

5

L'implementazione standard di Python è una macchina virtuale con codice byte. Ciò significa che il codice macchina ( codici op del set di codici op del processore) non viene generato dal programma. Gli opcode sono selezionati solo dagli opcode già compilati nella macchina virtuale mentre la VM interpreta il codice byte.

Il modo in cui il tuo programma viene trasformato in codice byte in primo luogo è una domanda leggermente diversa, ma la risposta breve è "attraverso la compilazione, proprio come qualsiasi altra traduzione linguistica discendente".

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.