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.