Parte VII Traduzione e Collegamento VII.1
Linguaggi di Programmazione Linguaggi ad alto livello Maggiore espressività Maggiore produttività Migliore leggibilità Facilità di documentazione Minore controllo dell efficienza Linguaggi a basso livello Minore espressività Minore produttività Peggiore leggibilità Difficoltà di documentazione Pieno controllo dell efficienza VII.2
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 VII.3
Traduzione PROGRAMMA SORGENTE TRADUTTORE Compilatore Assemblatore PROGRAMMA OGGETTO Condotta una tantum in modo statico in un tempo precedente all esecuzione Il Programma Sorgente è scritto in un linguaggio simbolico, orientato all utente Il Programma Oggetto: Esegue le operazioni specificate dal Programma Sorgente È scritto in linguaggio macchina e quindi è direttamente eseguibile Il programma oggetto costituisce i dati del programma traduttore, il programma oggetto ne è il risultato dell esecuzione VII.4
Interpretazione PROGRAMMA SORGENTE INTERPRETE SISTEMA DI ELABORAZIONE (Livello del Sistema Operativo) L interpretazione viene effettuata ogni volta che il programma viene eseguito Non viene generato nessun programma oggetto L interprete esegue direttamente le istruzioni del programma sorgente Soluzione più semplice da realizzare ma tipicamente inefficiente Esempi: BASIC, PROLOG, SQL,... VII.5
Linguaggi Assemblativi (es. Pentium II) VII.6 Queste istruzioni calcolano N=I+J Corrispondenza uno ad uno con le istruzioni macchina Codici mnemonici ed etichette associate ad indirizzi Pseudoistruzioni dichiarative per la definizione di etichette e l associazione di valori iniziali
Pseudoistruzioni Utilizzate nella parte dichiarativa di un programma in linguaggio asemblativo Dichiarano etichette, costrutti, o esprimono direttive di assemblaggio Ad esse non corrispondono istruzioni nel programma oggetto VII.7
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 Costituiscono una sorta di convenzione stenografica (accettata dall assemblatore) Servono a rendere il programma più compatto (e più leggibile) La sostituzione della macro avviene staticamente in fase di assemblaggio VII.8
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 dell assemblaggio, a sostituzione avvenuta, nel programma oggetto non resta nessuna traccia delle macro, con o senza parametri VII.9
Macro e Procedure VII.10
Il Processo di Assemblaggio L assemblatore traduce da linguaggio assemblativo a linguaggio macchina Processo molto semplice salvo per le istruzioni con riferimenti a etichette non ancora dichiarate (riferimenti in avanti) Assemblatori ad una passata Traducono tutte le istruzioni tranne quelle con riferimenti in avanti Mettono queste istruzioni in una lista Alla fine traduce anche queste Assemblatori a due passate Prima passata: Calcola la lunghezza delle istruzioni Genera una tavola dei riferimenti Seconda passata: Tutti i riferimenti sono noti Può generare direttamente il codice VII.11
La Prima Passata Valuta la lunghezza di ciascuna istruzione Calcola il valore dell ILC (Instruction Location Counter) Inserisce tutte le etichette nella Tavola dei Simboli, con i corrispondenti valori di ILC Alla fine della passata il problema dei riferimenti in avanti non sussiste più VII.12
La Seconda Passata Sfrutta il prodotto della prima passata La Tavola dei Simboli fornisce l indirizzo di tutte le etichette Genera il codice, istruzione per istruzione, appoggiandosi su apposite tavole (usate anche nella prima passata) che forniscono: La lunghezza delle istruzioni I codici operativi La classe delle istruzioni (che dipende dal tipo di operandi e dalle modalità di indirizzamento) VII.13
Collegamento e Caricamento VII.14 Procedure assemblate o compilate separatamente Il Collegatore (Linker) produce un unico modulo assoluto pronto ad essere caricato Il Caricatore (Loader) finalizza gli indirizzi 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 Occorre risolvere tutti i Riferimenti Esterni, cioè le chiamate tra moduli VII.15
Aggiornamento degli Indirizzi VII.16
Struttura del Modulo Oggetto Identification: nome, data, lunghezza delle varie parti Entry point table: simboli definiti nel modulo e riferibili dall esterno External refrence table: simboli definiti in altri moduli e riferiti dal modulo Relocation dictionary: informazioni da aggiornare all atto della rilocazione VII.17
Collegamento Dinamico È spesso troppo costoso collegare staticamente tutte le procedure Alcune sono chiamate solo in circostanze inusuali (gestione di errori ed eccezioni) Il collegamento, viene effettuato a tempo di chiamata (e solo se necessario) In Multics la chiamata fa un salto indiretto, tramite il Linkage Segment La prima volta che una procedura viene chiamata il salto provoca una trap VII.18
Collegamento Dinamico (2) La trap attiva il Dynamic Linker che alloca in memoria virtuale la procedura chiamata e scrive l indirizzo nel linkage segment Alla ripresa la chiamata viene effettuata regolarmente Tutte le successive chiamate si svolgono normalmente VII.19
DLL (Dynamic Link Library) Soluzione adottata in ambiente Windows Una DLL contiene sia procedure che dati 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 all atto della chiamata VII.20