T3 esempio runtime
-
Upload
majong-devjfu -
Category
Technology
-
view
380 -
download
0
Transcript of T3 esempio runtime
![Page 1: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/1.jpg)
Parte 1
Un esempio diUn esempio diambiente di esecuzione:
il Perl
Linguaggi dinamici – A.A. 2009/20101
![Page 2: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/2.jpg)
Ciclo di vita di un programma Perl
� Il ciclo di vita di un programma scritto in Perl si compone di quattro fasi successivecompone di quattro fasi successive(due opzionali, due obbligatorie)
1)Compilazione (obbligatoria)1)Compilazione (obbligatoria)
2)Generazione di codice (opzionale)
3)Ri t i d l t ( i l )3)Ricostruzione del parse tree (opzionale)
4)Esecuzione (obbligatoria)
� Fasi gestite dall'eseguibile /usr/bin/perl
� Le fasi opzionali sono dovute al fatto che unLe fasi opzionali sono dovute al fatto che un programma in Perl può anche essere
compilato per generare un eseguibile (se si
Linguaggi dinamici – A.A. 2009/20102
compilato per generare un eseguibile (se si vuole)
![Page 3: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/3.jpg)
Ciclo di vita di un programma Perl
Linguaggi dinamici – A.A. 2009/20103
![Page 4: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/4.jpg)
Compilazione
� L'obiettivo della compilazione è quello di produrre una rappresentazione del codiceprodurre una rappresentazione del codice sorgente in grado di essere eseguita da un interpretete p ete
� L'interprete è in grado di eseguire comandi primitivi (detti opcode) in una ben specificaprimitivi (detti opcode) in una ben specifica sequenza
La rappresentazione finale deve raggiungere� La rappresentazione finale deve raggiungere due obiettivi:
l li d� elencare gli opcode
� elencare l'ordine di sequenza
Linguaggi dinamici – A.A. 2009/20104
![Page 5: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/5.jpg)
Compilazione
� La rappresentazione scelta è l‘Abstract SyntaxTree (AST) un albero in cui:Tree (AST), un albero in cui:
� ogni nodo non foglia è un opcode interno del Perl (eseguibile direttamente dall'interprete)Perl (eseguibile direttamente dall interprete)
� ogni nodo foglia è un operando
l' di di i it (l d d li t i)� l'ordine di visita (la precedenza degli operatori) è da sinistra verso destra e dal basso verso l'altrol altro
� Visita in post-ordine: prima il sottoalbero i i t i ll d t i il d disinistro, poi quello destro, poi il nodo radice
Linguaggi dinamici – A.A. 2009/20105
![Page 6: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/6.jpg)
Compilazione
AST associato allo statement$a = -($b + $c)
Linguaggi dinamici – A.A. 2009/20106
$ ($ $ )
![Page 7: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/7.jpg)
Compilazione
� Durante la fase di compilazione
può essere eseguito codice del programma!� può essere eseguito codice del programma!
� Blocchi di codice contrassegnati con la l hi BEGIN i t t ti bitparola chiave BEGIN: sono interpretati subito
dopo la loro scansione
Di tti il i t d i d li è� Direttiva use per il caricamento dei moduli: è interpretata subito dopo la sua scansione
� possono essere valutate espressioni!
� Definizioni di costanti
Linguaggi dinamici – A.A. 2009/20107
![Page 8: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/8.jpg)
Compilazione
� Viene effettuata una analisi sintattica completa del programma per determinare la presenza didel programma, per determinare la presenza di eventuali errori di sintassi
Se viene trovato un errore di sintassi il� Se viene trovato un errore di sintassi, il compilatore non si ferma subito (!), bensì continua l'analisi per scovare altri erroricontinua l analisi per scovare altri errori
� Tipicamente, un errore sintattico ne provoca altri in cascataaltri in cascata
� Dopo dieci errori, il compilatore si ferma
Linguaggi dinamici – A.A. 2009/20108
![Page 9: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/9.jpg)
Compilazione
� L'analisi sintattica avviene tramite l'uso di tre moduli distintimoduli distinti
� Lexer: identifica i token all'interno del codice sorgentesorgente
� Parser: prova ad associare un gruppo ti di t k d t ttcontiguo di token ad un costrutto
(espressione, statement) in base alla ti d l P lgrammatica del Perl
� Optimizer: riordina e riduce i costrutti prodotti dal parser, con l'obiettivo di produrre sequenze di codice equivalenti e più efficienti
Linguaggi dinamici – A.A. 2009/20109
![Page 10: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/10.jpg)
Compilazione
� Le fasi dell'analisi sintattica non sono consecutive bensì interallacciateconsecutive, bensì interallacciate
� Alcuni esempi
Il l h bi di l i i ti d� Il lexer ha bisogno di alcuni suggerimenti da parte del parser per capire come estrarre un tokentoken
� L'optimizer spesso non può entrare in azione fino a quando il parser non ha raggiunto unfino a quando il parser non ha raggiunto un certo punto (elaborazione di una espressione, di uno statement di un blocco di una subroutine)uno statement, di un blocco, di una subroutine)
� Similitudine con il linguaggio naturale
Linguaggi dinamici – A.A. 2009/201010
![Page 11: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/11.jpg)
Compilazione
� Le fasi di analisi sintattica si alternano nel modo seguente con una modalità dimodo seguente, con una modalità di compilazione multi-passo
Passo 1: Bottom-Up Parsing� Passo 1: Bottom-Up Parsing
� Il parser riceve in ingresso i token prodotti dal lexer ed usa yacc per costruire l'ASTlexer ed usa yacc per costruire l AST
� Il parsing è di tipo “bottom-up” perché parte dalle foglie ed arriva fino alla radice dell'ASTdalle foglie ed arriva fino alla radice dell'AST
� In seguito alla costruzione di un nodo, si ifi l ti d ll' d l ti èverifica se la semantica dell'opcode relativo è
congruente (ad es., se viene usato il numero ed il tipo corretto di parametri per una funzione)
Linguaggi dinamici – A.A. 2009/201011
il tipo corretto di parametri per una funzione)
![Page 12: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/12.jpg)
Compilazione
� Le fasi di analisi sintattica si alternano nel modo seguente con una modalità dimodo seguente, con una modalità di compilazione multi-passo
Passo 1: Bottom-Up Parsing� Passo 1: Bottom-Up Parsing
� Man mano che vengono costruiti sottoalberi dell'AST si invoca l'optimizer per produrredell AST, si invoca l optimizer per produrre porzioni di statement più efficienti
Se il parser capisce che lo statement attuale� Se il parser capisce che lo statement attuale è una chiamata ad una funzione con un numero di parametri fisso allora si può nonnumero di parametri fisso, allora si può non considerare l'opcode che gestisce le funzioni con numero di parametri variabile
Linguaggi dinamici – A.A. 2009/201012
con numero di parametri variabile
![Page 13: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/13.jpg)
Compilazione
� Le fasi di analisi sintattica si alternano nel modo seguente con una modalità dimodo seguente, con una modalità di compilazione multi-passo
Passo 1: Bottom-Up Parsing� Passo 1: Bottom-Up Parsing
� Non appena un sottoalbero dell'AST è generato, viene creata una struttura ciclica che collega iviene creata una struttura ciclica che collega i nodi dell'AST secondo l'ordinamento visto in precedenzaprecedenza
� Il nodo radice viene collegato con il primo nodo da visitare; il primo nodo da visitare vieneda visitare; il primo nodo da visitare viene collegato con il secondo nodo da visitare
Linguaggi dinamici – A.A. 2009/201013
![Page 14: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/14.jpg)
Compilazione
� Le fasi di analisi sintattica si alternano nel modo seguente con una modalità dimodo seguente, con una modalità di compilazione multi-passo
Passo 1: Bottom-Up Parsing� Passo 1: Bottom-Up Parsing
� Quando il sottoalbero dell'AST viene attaccato ad un altro AST il ciclo radice primo nodo siad un altro AST, il ciclo radice-primo nodo si spezza, e viene ricostruito con il nuovo albero
L'interprete può individuare in maniera� L'interprete può individuare in maniera efficiente (O(1)) il nodo iniziale della visita
Linguaggi dinamici – A.A. 2009/201014
![Page 15: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/15.jpg)
Compilazione
AST associato allo statement$a = -($b + $c)
Linguaggi dinamici – A.A. 2009/201015
$ ($ $ )
![Page 16: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/16.jpg)
Compilazione
� Le fasi di analisi sintattica si alternano nel modo seguente con una modalità dimodo seguente, con una modalità di compilazione multi-passo
Passo 2: Top-down Optimizer� Passo 2: Top-down Optimizer
� Non appena un sottoalbero dell'AST viene prodotto viene scandito dalla radice alle foglieprodotto, viene scandito dalla radice alle foglie per eventuali ottimizzazioni
Linguaggi dinamici – A.A. 2009/201016
![Page 17: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/17.jpg)
Compilazione
� Le fasi di analisi sintattica si alternano nel modo seguente con una modalità dimodo seguente, con una modalità di compilazione multi-passo
Passo 3: Peephole Optimizer� Passo 3: Peephole Optimizer
� Alcune porzioni di codice hanno un loro spazio di memorizzazione locale per le variabilidi memorizzazione locale per le variabili
� Singole Subroutine (variabili locali)
Si li fil ( i bili l b li)� Singoli file (variabili globali)
� Stringhe contenenti codice (eval())
Linguaggi dinamici – A.A. 2009/201017
![Page 18: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/18.jpg)
Compilazione
� Le fasi di analisi sintattica si alternano nel modo seguente con una modalità dimodo seguente, con una modalità di compilazione multi-passo
Passo 3: Peephole Optimizer� Passo 3: Peephole Optimizer
� Il peephole optimizer ottimizza tali porzioni di codice in maniera sequenzialecodice in maniera sequenziale
� Controlla se esiste codice non raggiungibile (lo cancella in tal caso)(lo cancella, in tal caso)
� Controlla se una funzione è invocata prima che il suo prototipo sia stato compilatoche il suo prototipo sia stato compilato
� Cerca di risolvere le espressioni costanti il iù t ibil (C t t f ldi )
Linguaggi dinamici – A.A. 2009/201018
più presto possibile (Constant folding)
![Page 19: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/19.jpg)
Compilazione
� Constant folding: l'ottimizzatore trova operazioni con operandi tutti costanti calcolaoperazioni con operandi tutti costanti, calcola l'espressione finale e sostituisce all'espressione di partenza il suo risultatoall espressione di partenza il suo risultato
� Per operando si intende anche il valore di ritorno di una funzione!ritorno di una funzione!
� Ad esempo, se nell'AST di esempio si sostituiscono a $b e $c due espressionisostituiscono a $b e $c due espressioni costanti qualunque, tali che il risultato della valutazione del sottoalbero AST con radicevalutazione del sottoalbero AST con radice pari al nodo 4 sia -42, si ottiene il seguente AST ottimizzato equivalente
Linguaggi dinamici – A.A. 2009/201019
AST ottimizzato equivalente
![Page 20: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/20.jpg)
Compilazione
Linguaggi dinamici – A.A. 2009/201020
![Page 21: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/21.jpg)
Compilazione
� Strength reduction: rimpiazza operazioni“lente” con operazioni equivalenti e più velocilente con operazioni equivalenti e più veloci
� Esempio:
� mul ax,2 Æ shift_left ax
� Null sequences: elimina operazioni inutili
� Esempio:
� mov r0 i; mov i r0 Æ mov r0 i� mov r0, i; mov i, r0 Æ mov r0, i
Linguaggi dinamici – A.A. 2009/201021
![Page 22: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/22.jpg)
Compilazione
� Combine Operations: rimpiazza un insieme di operazioni con una operazione singolaoperazioni con una operazione singola equivalente
Al b i L l i l b i h� Algebraic Laws: usa leggi algebriche per semplificare o riordinare le istruzioni
� Special Case Instructions: usa istruzioni “speciali” progettate per specifici operandi
Linguaggi dinamici – A.A. 2009/201022
![Page 23: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/23.jpg)
Compilazione
� A questo punto, la compilazione è terminata
Si può inspezionare l'AST prodotto con il� Si può inspezionare l'AST prodotto con il comando perl -MO=Concise,-src file.pl
� Se si era invocato il servizio di controllo sintattico del programma (perl -c source.pl), il compilatore ci informa del risultato dell'analisi sintattica
� Altrimenti, si passa allo stadio successivo, che nella nostra trattazione limitata è l'interprete
� Ma può anche essere un altro compilatore(perlcc -o hello hello.pl)
Linguaggi dinamici – A.A. 2009/201023
(p p )
![Page 24: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/24.jpg)
Interprete
� L'interprete Perl esegue gli opcode dell'AST nella sequenza specificatanella sequenza specificata
� L'interprete usa una macchina basata su stack per eseguire il codiceper eseguire il codice
� Gli opcode manipolano gli operandi che i iti ll t k dvengono inseriti nello stack, secondo una
modalità molto simile alla notazione polacca iinversa
� Push a, Push b
� Opcode (pop a, pop b, calcolo, push risultato)
Linguaggi dinamici – A.A. 2009/201024
![Page 25: T3 esempio runtime](https://reader033.fdocuments.net/reader033/viewer/2022052601/558d41ddd8b42a7f148b458b/html5/thumbnails/25.jpg)
Interprete
� L'interprete Perl crea diversi stack, fra gli altri:
Operand stack: memorizzazione degli operandi� Operand stack: memorizzazione degli operandi degli operatori
S t k i i d ll i bili il i� Save stack: memorizzazione delle variabili il cui scope è stato alterato da altre
E i bil l b l i il i l è t t� Es.: variabile globale i, il cui valore è stato offuscato dalla variabile locale i all'interno di una funzioneuna funzione
� Return stack: memorizzazione degli indirizzi di ritorno delle funzioniritorno delle funzioni
Linguaggi dinamici – A.A. 2009/201025