Prof. Riccardo Torlone Universita di Roma Tre Anno Accademico 2011/2012 Linguaggi di Programmazione Linguaggi ad alto livello Maggiore espressivit Maggiore produttivit Migliore leggibilit Facilit di documentazione Minore controllo dellefficienza Linguaggi a basso livello Minore espressivit Minore produttivit Peggiore leggibilit Difficolt di documentazione Pieno controllo dellefficienza Costi di Sviluppo ed Efficienza del Software Approccio Misto: isolare le parti critiche del programma e codificare solo quelle in linguaggio assemblativo Il 10% del codice responsabile del 90% del tempo di esecuzione I tempi di esecuzione vengono abbattuti nella fase di tuning, che riguarda ora solo una piccola parte del codice Vantaggi del linguaggio assemblativo Pu servire per ottimizzare una applicazione (ma solo seguendo lapproccio misto) E a volte necessario se le risorse sono limitate (microcontrollori - applicazioni embedded) E utile alla comprensione dei compilatori E molto utile alla comprensione dellarchitettura di un calcolatore Traduzione Condotta una tantum in modo statico in un tempo precedente allesecuzione Il Programma sorgente scritto in un linguaggio simbolico, orientato allutente Il Programma Oggetto: Esegue le operazioni specificate dal programma sorgente scritto in linguaggio macchina e quindi direttamente eseguibile Il programma sorgente costituisce i dati del programma traduttore, il programma oggetto ne il risultato dellesecuzione PROGRAMMA SORGENTE TRADUTTORE Compilatore Assemblatore PROGRAMMA OGGETTO Interpretazione Linterpretazione viene effettuata ogni volta che il programma viene eseguito Non viene generato nessun programma oggetto Linterprete esegue direttamente le istruzioni del programma sorgente Soluzione pi semplice da realizzare potenzialmente inefficiente Esempi: BASIC, PROLOG, SQL,... PROGRAMMA SORGENTE INTERPRETE SISTEMA DI ELABORAZIONE (Livello del Sistema Operativo) Linguaggi Assemblativi (es. Pentium) Corrispondenza uno ad uno con le istruzioni macchina Codici simbolici ed etichette associate ad indirizzi Pseudoistruzioni dichiarative per la definizione di etichette e per lallocazione di spazio di memoria Il traduttore detto assemblatore e la traduzione assemblaggio Lo stesso programma (N=I+J ) in altri assembler Pseudoistruzioni Utilizzate nella parte dichiarativa di un programma in assembler Dichiarano etichette, costrutti, o esprimono direttive di assemblaggio Ad esse non corrispondono istruzioni nel programma oggetto Macro Definizioni Associano un nome ad un segmento di codice (macro definizione) Il nome cos definito pu essere usato (pi volte) nel corso del programma Servono a rendere il programma pi compatto (e pi leggibile) La sostituzione della macro avviene staticamente in fase di assemblaggio Macro con Parametri possibile definire ed utilizzare anche macro con parametri La sostituzione dei parametri formali con gli argomenti attuali viene effettuata staticamente in fase di assemblaggio A valle dellassemblaggio, a sostituzione avvenuta, nel programma oggetto non resta nessuna traccia delle macro, con o senza parametri Differenze tra Macro e Procedure Il Processo di Assemblaggio Lassemblatore traduce da linguaggio assemblativo a linguaggio macchina Processo molto semplice salvo per le istruzioni con riferimenti (salti) a etichette non ancora dichiarate (riferimenti in avanti) Assemblatori ad una passata Traducono in un formato intermedio compatto Mettono la forma intermedia in una tabella Alla fine traduce il contenuto della tabella Assemblatori a due passate Prima passata: Calcola la lunghezza e la posizione delle istruzioni Genera una tavola dei simboli Seconda passata: Tutti i riferimenti sono noti nella tavola dei simboli Genera il codice usando i valori della tavola La Prima Passata Valuta la lunghezza di ciascuna istruzione Calcola il valore dellILC (Instruction Location Counter) Inserisce tutte le etichette nella Tavola dei Simboli, con i corrispondenti valori di ILC Alla fine della passata i riferimenti in avanti sono noti Tabella dei codici operativi Viene mostrata una porzione Un elemento per ciascun codice simbolico del linguaggio La classe individua le combinazioni che seguono le stesse regole La Seconda Passata Sfrutta il prodotto della prima passata La Tavola dei Simboli fornisce lindirizzo di tutte le etichette Genera il codice, istruzione per istruzione, utilizzando la tavola dei codici operativi che fornisce: La lunghezza delle istruzioni I codici operativi La classe delle istruzioni (che dipende dal tipo di operandi e dalle modalit di indirizzamento) Possibili organizzazioni delle tabelle dei simboli Collegamento e Caricamento Procedure assemblate o compilate separatamente Il Collegatore (Linker) produce un unico modulo assoluto pronto ad essere caricato Il Caricatore (Loader) definisce gli indirizzi finali e carica il modulo assoluto in memoria centrale Collegamento (Linking) Ciascun modulo ha il suo spazio degli indirizzi Quando i moduli vengono collegati occorre: traslare i loro spazi degli indirizzi risolvere tutti i riferimenti esterni (le chiamate tra moduli) Aggiornamento degli Indirizzi Struttura del Modulo Oggetto Identification: nome, data, lunghezza delle varie parti Entry point table: simboli definiti nel modulo e riferibili dallesterno External reference table: simboli definiti in altri moduli e riferiti dal modulo Relocation dictionary: indirizzi che devono essere rilocati Collegamento statico e rilocazione dinamica Diversi approcci possibili Uso di un registro di rilocazione Uso della tavola delle pagine Collegamento Dinamico spesso troppo costoso collegare staticamente tutte le procedure Alcune sono chiamate solo in circostanze inusuali (gestione di eccezioni) Il collegamento pu essere effettuato a tempo di chiamata (e solo se necessario) In Multics ogni procedura ha a disposizione un Linkage Segment La prima invocazione di una procedura provoca una trap Collegamento Dinamico (2) La trap attiva il Dynamic Linker che alloca in memoria virtuale la procedura chiamata e scrive lindirizzo nel linkage segment Alla ripresa la chiamata viene eseguita regolarmente Tutte le successive chiamate si svolgono normalmente DLL (Dynamic Link Library) Soluzione adottata in ambiente Windows Una DLL pu contenere sia procedure che dati (es. librerie grafiche) Pi programmi condividono una DLL Risparmio di memoria centrale e di massa Semplicit di aggiornamento delle librerie Implicit linking: il programma collegato alla DLL tramite una tabella (import library), le DLL necessarie sono caricate in memoria Explicit linking: la DLL viene richiesta e caricata dinamicamente allatto della chiamata