Come funziona effettivamente Python Runtime?

16

Ho alcuni problemi a comprendere il concetto di runtime library , in particolare quello di Python. Quindi ho scritto un programma Hello Python e ho intenzione di eseguirlo, quindi scrivo python ./hello_world.py .

Quali passi tra me e il tasto Invio vengono eseguiti e il codice macchina generato dal mio codice Python viene eseguito sulla mia CPU? E in che modo questo si riferisce al sistema di runtime Python e / o alla libreria?

    
posta hgiesel 19.03.2016 - 23:07
fonte

2 risposte

18

Per quanto diversi siano, ci sono una manciata di concetti comuni condivisi da tutti i linguaggi di programmazione moderni e seri. Due di questi sono il nucleo della risposta alle tue domande sopra.

What steps happens between me hitting the Enter button and the machine code generated from my python code being executed on my CPU?

Il codice viene analizzato, analizzato e inserito in un interprete. Si tratta di un'area molto importante dell'informatica conosciuta come teoria del compilatore . Un compilatore è un programma che traduce il codice da una lingua (il tuo codice sorgente) ad un'altra lingua (tipicamente il codice macchina, anche se esistono "transpilers" che traducono da un linguaggio di alto livello ad un altro). Questo è un argomento davvero enorme che potresti passare anni a cercare, 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 della lingua per capire se ha senso come codice Python valido (nel tuo caso) . In caso contrario, il parser genererà un errore e il compilatore verrà biasimato, ma se lo fa, il parser emetterà ciò che è noto come Abstract Syntax Tree o AST in breve. L'AST è una struttura dati ad albero i cui nodi contengono ciascuno un elemento della sintassi. Ad esempio, se pronunci x = 5 , potresti finire con un nodo BinaryExpression con un valore operator di = , un valore Left di ReferenceExpression(x) e un valore Right di IntegerLiteralExpression(5) . Il tuo intero programma può essere rappresentato da un grande albero come questo.

Una volta che il parser produce un AST, la seconda fase è 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, prova a chiamare una funzione a 1 argomento con 3 argomenti) e genera errori se lo fai. Altrimenti, analizza l'AST ed esegue modifiche per renderlo più semplice da capire per una macchina.

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

Con Python, usa un interprete piuttosto che un compilatore. Un interprete funziona esattamente allo stesso modo di un compilatore, con una differenza: invece di generare codice, carica l'output in memoria e lo esegue direttamente sul sistema. (I dettagli esatti su come ciò può accadere possono variare selvaggiamente tra lingue diverse e diversi interpreti.)

And how does this relate to the Python runtime system and/or library?

Tutti tranne i linguaggi più semplici hanno una serie di funzioni predefinite che sono importanti per una grande percentuale di utenti e sarebbe difficile per gli utenti implementarle da sole per un motivo o per un altro. Il loro codice può chiamare in queste funzioni senza bisogno di librerie di terze parti. (Ad esempio, in Python hai print , che manda l'output a stdout . Buona fortuna per implementarlo da solo!) Questo set di funzioni è generalmente raccolto in una libreria condivisa che il codice può chiamare in fase di esecuzione , ecco perché è conosciuto come la libreria di runtime della lingua, o semplicemente "il runtime" in breve.

    
risposta data 19.03.2016 - 23:34
fonte
5

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

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

    
risposta data 19.03.2016 - 23:33
fonte

Leggi altre domande sui tag