Architettura di un linguaggio dinamico

Documenti analoghi
Traduzione e interpretazione

Fasi di un Compilatore

Corso di Fondamenti di Informatica Linguaggi di Programmazione

I Linguaggi di Programmazione

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

PROGRAMMAZIONE Macchine astratte, linguaggi, interpretazione e compilazione

Informatica. Dipartimento di Economia. Ing. Cristiano Gregnanin. 20 ottobre Corso di laurea in Economia

Linguaggi e Ambienti di Programmazione

permette di utilizzare lo stesso programma su CPU diverse (con opportuni traduttori)

Concetti Introduttivi

Cosa è un programma. Informatica di Base -- R.Gaeta 18

Programmazione. Andrea Passerini Informatica. Programmazione

Programmazione. Andrea Passerini Informatica. Programmazione

Sommario Linguaggi, messaggi e comunicazione. Introduzione ai Linguaggi di Programmazione. Linguaggio. Messaggio

COMPILAZIONE. Tarsformazione di linguaggi

Octave. Luca Abeni. Informatica Luca Abeni 1 / 21

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Programmazione. Dipartimento di Matematica. Ing. Cristiano Gregnanin. 29 febbraio Corso di laurea in Matematica

Linguaggi di Programmazione

Macchine Astratte. Luca Abeni. February 22, 2017

LA CODIFICA DELLE INFORMAZIONI

Macchine astratte, linguaggi, interpretazione, compilazione

Architettura degli Elaboratori

o Introduzione agli algoritmi o Rappresentazione delle Informazioni o Architettura del calcolatore o Reti di Calcolatori

Sommario Linguaggi, messaggi e comunicazione. Introduzione ai Linguaggi di Programmazione. Linguaggio (1) Linguaggio (2)

Linguaggi di Programmazione

ASTRAZIONE. Sono indipendenti dalla macchina hardware sottostante ASTRAZIONE 1

LINGUAGGI DI ALTO LIVELLO. Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware

Iniziare a programmare in C++

LINGUAGGI DI ALTO LIVELLO

10: I LINGUAGGI di PROGRAMMAZIONE PARTE 1

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

LINGUAGGI DI ALTO LIVELLO

Il linguaggio di programmazione Python

Linguaggi di programmazione

Linguaggi, messaggi e comunicazione Traduzione di programmi Interpreti e compilatori Introduzione al processo di compilazione

Programmazione: Sommario

Linguaggi di Programmazione

Le istruzioni corrispondono univocamente a quelle macchina, ma vengono espresse tramite nomi simbolici i (parole chiave)

Elementi di programmazione

DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione

Linguaggi di alto livello, compilatori e interpreti

Elementi di programmazione

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd

Programmazione. Fondamenti di Informatica

Elementi di programmazione

Linguaggi di programmazione

Macchina Astratta: struttura e realizzazione.

Traduzione ed Interpretazione

Macchine Astratte. Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari. Linguaggi di Programmazione feb, 2016

Traduzione ed Interpretazione. Queste sconosciute

Informatica Problema Algoritmo Programma

Corso di Linguaggi di Programmazione + Laboratorio

Marco Tarini - Università dell'insubria A.A. 2016/17. Università degli Studi dell Insubria Dipartimento di Scienze Teoriche e Applicate

Linguaggi di Programmazione

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Le basi del linguaggio Java

Informatica 3. LEZIONE 1: Introduzione. Modulo 1: Introduzione al corso Modulo 2: Introduzione ai linguaggi di programmazione

Assembly. Linguaggio di programmazione corrispondente al linguaggio macchina P.H. Cap. 2.1, 2.2 e App. A. Linguaggio assembly (App.

Informatica 3. Informatica 3. Lezione 1- Modulo 1. LEZIONE 1: Introduzione. Concetti di linguaggi di programmazione. Introduzione

Java: un linguaggio per applicazioni di rete

Unità di apprendimento 6. Il software: dal linguaggio alla applicazione

ASTRAZIONE. Sono indipendenti dalla macchina hardware sottostante ASTRAZIONE 1

C++ Barriera di astrazione. Barriera di astrazione. Basic. Basic. Lisp. Lisp. Pascal. Prolog. Pascal. Prolog. Cobol. Fortran IMPERATIVI FUNZIONALI

Linguaggi di alto livello. Barriera di astrazione. Pascal. Cobol. Fortran. Basic. Modula-2. Lisp. Simula67 Scheme. Smalltalk C++ Prolog AN

INFORMATICA. L informatica comprende:

Introduzione alla Programmazione. Giselda De Vita

Programmazione in Java e gestione della grafica (I modulo) Lezione 2: Prime nozioni di Java

Laboratorio di Architettura

Fondamenti di Programmazione

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

PROBLEMI E ALGORITMI

Algoritmo. La programmazione. Algoritmo. Programmare. Procedimento di risoluzione di un problema

Linguaggi di alto livello, compilatori e interpreti

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Lezione n. 2i Informatica e tecnologia informatica Sistema di elaborazione Algoritmo Linguaggi di programmazione Realizzazione di un programma

Davide Cervi Classe : 3E I.T.E Agostino Bassi - Lodi

Introduzione alla programmazione strutturata

Corso di Laurea Magistrale in Ingegneria Informatica A.A Linguaggi Formali e Compilatori. Introduzione. Giacomo PISCITELLI

Lez. 5 La Programmazione. Prof. Salvatore CUOMO

Scrivere il software. Scrivere il software. Interprete. Compilatore e linker. Fondamenti di Informatica

Introduzione a Java. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni

Corso di Fondamenti di Informatica Linguaggi di Programmazione

Argomento del corso: una trattazione generale dei linguaggi di programmazione Completare le conoscenze acquisite finora: Linguaggi di programmazione

Tecnologie dell'informazione e della comunicazione

Automi e Linguaggi Formali

La Programmazione. Cos è la programmazione? Concetti preliminari

la traduzione dei programmi ed introduzione a Java

Linguaggi, Traduttori e le Basi della Programmazione

AMBIENTI DI PROGRAMMAZIONE

Fondamenti Teorici e Programmazione Modulo A. Architettura dei calcolatori Ioanna Miliou, Ph.D.

Corso di Laurea Magistrale in Ingegneria Informatica A.A Linguaggi Formali e Compilatori. Introduzione. Giacomo PISCITELLI

Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Simulazione del Questionario a Risposte Multiple.

Transcript:

Parte 3 Architettura di un linguaggio dinamico 1

Compilatori ed interpreti Gli strumenti per la generazione di codice eseguibile sono classificabili in due categorie distinte: Compilatori Interpreti Compilatore: traduce un codice (sorgente) scritto in un linguaggio di programmazione in un altro linguaggio (codice oggetto) di più basso livello Caso limite: C codice oggetto in linguaggio macchina (codice binario) Interprete: considera porzioni limitate (statement) di codice (sorgente o intermedio), le traduce in codice macchina e le esegue direttamente Ricordiamo: non è una caratteristica del linguaggio 2

Linguaggi interpretati vs. compilati Svantaggi di un linguaggio interpretato: Più lento nell'esecuzione (ogni esecuzione implica una traduzione a run time) Richiede più memoria Richiede la presenza del software interprete sul calcolatore Svantaggi di un linguaggio compilato: Minore portabilità Minore flessibilità (es. non permette meccanismi di type checking dinamico) Supporto per debugging a run time meno flessibile e potente 3

Linguaggi Dinamici Obiettivi dei linguaggi dinamici: Portabilità e rapidità di prototipazione Velocità maggiore di un linguaggio completamente interpretato (es. Shell) Approccio ibrido Compilazione + interpretazione Formato di rappresentazione intermedia del codice indipendente dalla architettura A seconda del tipo di formato intermedio, si distinguono due diversi modelli di esecuzione: Modello Abstract Syntax Tree (AST) Modello Bytecode 4

Modello Abstract Syntax Tree Modello Abstract Syntax Tree: prevede utilizzo di un compilatore e di un interprete Compilatore: Traduce il codice sorgente in una rappresentazione ad albero sintattico (Abstract Syntax Tree) Possibilità di inserire durante questa fase una fase di interpretazione/esecuzione di codice (es. per motivi di inizializzazione) Blocchi BEGIN/END (ES. Perl) 5

Modello Abstract Syntax Tree Interprete: Attraverso algoritmi di visita dell'ast, considera porzioni di albero, le traduce in istruzioni corrispondenti e le esegue - statement di codice Possibilità di inserire durante questa fase una fase di compilazione di codice Es. Perl - Comando eval(espressione) Usato tipicamente in caso di Metaprogramming per la generazione di nuovo codice a runtime (richiede presenza di un compilatore a run time) 6

Modello Bytecode Il modello bytecode prevede l'utilizzo di un compilatore e di una macchina virtuale (interprete) Compilatore: Traduce il codice sorgente in una linguaggio intermedio di basso livello, portabile Bytecode (o p-code portable code) Rappresenta un passo successivo rispetto all'ast (potenzialmente più ottimizzato) Il bytecode viene installato sui sistemi di destinazione, dove viene tradotto in codice macchina ed eseguito 7

Modello Bytecode Macchina virtuale (interprete): Fornisce una astrazione di un sistema operativo Il Bytecode può essere considerato come il 'codice macchina' della macchina virtuale Traduce le istruzioni e le richieste di sistema espresse in bytecode nelle richieste concrete al sistema operativo reale Le funzionalità di base della macchina virtuale sono contenute nella libreria di funzioni detta runtime library Runtime library + MV = Runtime Environment 8

Compilazione Just-In-Time (JIT) Anche detta dynamic translation Meccanismo usato per aumentare le prestazioni dei linguaggi che usano un modello a bytecode Es. Java, Python, Ruby, PHP Utilizzata da quasi tutte le recenti implementazioni di macchine virtuali L'ambiente di esecuzione (macchina virtuale) incorpora un compilatore interno just-in-time (JIT compiler) che a run time: compila porzioni di codice bytecode traducendole nel linguaggio macchina nativo del computer ospite le memorizza per il riuso 9

Compilazione Just-In-Time (JIT) Attenzione: il codice nativo (eseguibile) non viene prodotto per intero e salvato in un file Il JIT compiler: Traduce porzioni (sequenze) di bytecode in codice macchina (come gli interpreti) Effettua il caching delle parti tradotte, che saranno eseguite più velocemente in caso di riutilizzo all'interno dello stesso run del programma Utile per eseguire più velocemente parti specifiche di codice (es. funzioni chiamate più volte, regular expression complesse fornite a run-time) Possibili ottimizzazioni su porzioni di codice eseguite più di frequente 10

Modelli a confronto Metteremo a confronto Modello di esecuzione del C Modello completamente compilato Modello di esecuzione del Perl Modello Abstract Syntax Tree (AST) 11

Compilazione completa Operazioni principali di un compilatore C-like 1) Analisi (lessicale, sintattica e semantica): il testo viene diviso in unità di base e analizzato e con diversi tipi di controlli; genera in output una rappresentazione intermedia del codice detta Abstract Syntax Tree (AST) 2) Generazione del codice: la rappresentazione intermedia viene tradotta nel formato finale 3) Ottimizzazione del codice: il codice risultante viene ottimizzato secondo un qualche criterio specifico (velocità, uso memoria, batteria) 12

Compilatore: analisi lessicale Obiettivo: dividere il flusso di caratteri in ingresso (codice sorgente) in tante unità chiamate token Token: elementi minimi (non ulteriormente divisibili) di un programma Es.: keywords (for, while), nomi di entità (pippo), operatori (+, -, «),... La fase di tokenization è eseguita da un analizzatore lessicale detto scanner (o lexer) Scanner: macchina a stati finiti che riconosce possibili token attraverso espressioni regolari Es.: un intero è un (possibile) carattere +/- seguito da una sequenza di digit 13

Compilatore: analisi lessicale Ad ogni token identificato è associata una categoria (significato nel lessico del linguaggio) assegnata in base all'espressione regolare che ha riconosciuto il token Esempio: tabella dei token di sum = 3 + 2 Token Categoria sum IDENTIFIER = ASSIGN_OP 3 INT_NUMBER + ADD_OPERATOR 2 INT_NUMBER 14

Compilatore: analisi sintattica Prende in ingresso la sequenza di token ed esegue il controllo sintattico: verificare che i token formino un'espressione valida ES. L'espressione a = + = b è riconosciuta non valida solo a questo livello: prima lo scanner avrebbe targato ogni operatore come identifier, assign o add (visione locale) Eseguita da analizzatore sintattico o parser Il risultato è un albero di sintassi o parse tree: Albero che rappresenta la struttura sintattica di una espressione in accordo alla grammatica usata I token sono tutti rappresentati da nodi foglia 15

Compilatore: analisi sintattica Esempio di Parse Tree generato per: sum = ( 3 + 2 ) Expr ID ASS_OP Expr sum = ( Expr ) Molte informazioni presenti derivanti dalla tabella dei token INT_N ADD_OP INT_N 3 + 2 16

Compilatore: analisi semantica Obiettivo: rilevare (sequenze di) istruzioni non corrette, ovvero senza un significato valido a livello semantico Controlli tipici di questa fase: Controllo che gli identificatori siano stati dichiarati e inizializzati Type checking (controllo di tipo) operazioni possibili e assegnamenti di valori corretti Durante questa fase viene creata una tabella dei simboli con informazioni su ciascun simbolo (nome, scope, tipo, ) 17

Compilatore: analisi semantica Il risultato dell'analisi semantica è un albero detto Abstract Syntax Tree (AST) Operatori e keyword NON sono nodi foglia Astratto: non rappresenta esplicitamente tutti i dettagli rappresentati nella sintassi, che vengono però rappresentati in modo implicito (es. parentesi) = sum + 3 2 sum = ( 3 + 2 ) 18

Esempio AST 19

Esempio AST 2.2 ( ( X / 11 ) + 7 ) * cos( Y ) - 2.2 * + cos / 7 Y X 11 20

Esempio AST 21

Compilatore: generazione del codice Il modulo di generazione di codice: prende in input l'abstract Syntax Tree prodotto dall analisi semantica converte la struttura ad albero in una sequenza di codice/istruzioni Spesso integra alcune tecniche di ottimizzazione La sequenza prodotta può ancora essere intermedia se è prevista una fase separata di ottimizzazione, seguita da generazione del codice target/macchina ES. Linguaggio intermedio: assembly o linguaggio intermedio interno al compilatore 22

Compilatore: generazione del codice La generazione del codice avviene attraverso tre processi: instruction selection, instruction scheduling e register allocation 1) Instruction selection: vengono definite le istruzioni che rappresenteranno la conversione dalla rappresentazione ad albero Approccio: si spezza la rappresentazione ad albero nel numero più basso possibile di tile tile = porzione di albero che può essere implementato con una singola istruzione nel codice generato 23

Compilatore: generazione del codice Ottimizzazione integrata nella fase di instruction selection Es. Una traduzione naive può generare codice inefficiente: necessità di eliminare accessi ridondanti alla memoria, riordinando e fondendo istruzioni, e sfruttando l'uso dei registri t1 = a t2 = b t3 = t1 + t2 a = t3 b = t1 MOV EAX, a XCHG EAX, b ADD a, EAX 24

Compilatore: generazione del codice 2) Instruction scheduling: si sceglie la sequenza in cui le istruzioni vengono piazzate Obiettivo: migliorare il parallelismo a livello di istruzioni (maggior throughput di istruzioni) Tecnica di ottimizzazione tipica: instruction pipeline (classica pipeline su architetture RISC - Reduced Instruction Set Computer applicazioni embedded) IF = Instruction Fetch, ID = Instruction Decode, EX = Execute, MEM = Memory access, WB = Register write back Tentativo di utilizzare in modo parallelo accessi a livelli diversi di memoria e risorse di calcolo 25

Compilatore: generazione del codice 3) Register allocation: si decide come allocare le variabili dentro ai registri della CPU Obiettivo: cercare di assegnare quante più variabili possibili ai registri della CPU per velocizzare l'accesso alle variabili Accesso più veloce rispetto alla RAM Spesso le variabili contemporaneamente in uso sono in numero maggiore dei registri disponibili Ottimizzazione integrata: scelta delle variabili che vengono accedute più di frequente (scrittura vs lettura) 26

Schema delle fasi della compilazione Codice sorgente Tabella dei token Parse Tree Analisi lessicale Analisi sintattica Analisi semantica Codice intermedio ottimizzato Abstract Syntax Tree Generazione codice target Fase di ottimizzazione Generazione codice intermedio Programma eseguibile Assembly 27