t3 esempio runtime

25
Parte 1 Un esempio di Un esempio di ambiente di esecuzione: il Perl Linguaggi dinamici – A.A. 2009/2010 1

Upload: majong-devjfu

Post on 26-Jun-2015

375 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: T3 esempio runtime

Parte 1

Un esempio diUn esempio diambiente di esecuzione:

il Perl

Linguaggi dinamici – A.A. 2009/20101

Page 2: T3 esempio runtime

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

Ciclo di vita di un programma Perl

Linguaggi dinamici – A.A. 2009/20103

Page 4: T3 esempio runtime

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

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

Compilazione

AST associato allo statement$a = -($b + $c)

Linguaggi dinamici – A.A. 2009/20106

$ ($ $ )

Page 7: T3 esempio runtime

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

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

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

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

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

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

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

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

Compilazione

AST associato allo statement$a = -($b + $c)

Linguaggi dinamici – A.A. 2009/201015

$ ($ $ )

Page 16: T3 esempio runtime

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

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

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

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

Compilazione

Linguaggi dinamici – A.A. 2009/201020

Page 21: T3 esempio runtime

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

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

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

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

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