Laboratorio di Informatica (Chimica) Algoritmi, Dati e Programmi. Walter Cazzola Dipartimento di Università degli Informatica e Comunicazione Studi di Milano. e-mail: [email protected] Walter Cazzola Algoritmi, Dati e Programmi 1 Algoritmi, Dati e Programmi Introduzione ai concetti di: – – – – – Algoritmo; Programma; Dato; Diagramma di flusso; Linguaggio di programmazione. Walter Cazzola Algoritmi, Dati e Programmi 2 Algoritmi, Dati e Programmi: Nozioni Algoritmo = Successione di operazioni elementari che possono essere eseguite da un calcolatore. Dato = informazione da elaborare rappresentata in un formato che consenta al programma di operare su di essa. Programma = algoritmo in un linguaggio “comprensibile” dal computer. Linguaggio macchina = Basato sul set di istruzioni della macchina, rappresentato da sequenze di 0 e 1. Linguaggio ad alto livello = Linguaggio più vicino al linguaggio naturale, rigoroso e non ambiguo. Walter Cazzola Algoritmi, Dati e Programmi 3 Elaborazione dell’Informazione Ogni problema legato all’elaborazione di informazioni è caratterizzato da: – un insieme di dati di partenza, ed – un risultato cercato. Ogni sua soluzione è: – una procedura che genera il risultato cercato a partire dall’insieme dei dati di partenza specificati. Walter Cazzola Algoritmi, Dati e Programmi 4 Elaborazione dell’Informazione Distinguiamo tra: – conoscenza di come si risolve un problema: Î Î Î analisi del problema; identificazione di una soluzione; e descrizione della soluzione – ed effettiva capacità di risolvere un problema: Î Î interpretazione della soluzione; e attuazione della soluzione La conoscenza di come si risolve un problema è ciò che ci permette di sviluppare un programma. Walter Cazzola Algoritmi, Dati e Programmi 5 Elaborazione dell’Informazione Il programma sarà poi interpretato ed eseguito da un esecutore (es. calcolatore). Un esecutore è caratterizzato da: – – – il linguaggio che è in grado di interpretare; l’insieme di azioni che è in grado di compiere; e l’insieme delle regole che ad ogni costrutto linguistico sintatticamente corretto associano le relative azioni da compiere. Walter Cazzola Algoritmi, Dati e Programmi 6 Elaborazione dell’Informazione Per la descrizione della soluzione si utilizza: – linguaggio naturale (ad es. italiano, inglese, …): ambiguo; – linguaggio formale (non ambiguo): Î Î Î Î formalismo matematico; pseudo-codice; diagramma di flusso; e linguaggio di programmazione. La descrizione rigorosa di un metodo che consente di ottenere un risultato attraverso passi elementari si chiama algoritmo. Walter Cazzola Algoritmi, Dati e Programmi 7 Elaborazione dell’Informazione Processo di sviluppo di un programma: – analisi del problema e identificazione di una soluzione; – formalizzazione della soluzione e definizione dell’algoritmo risolutivo; – programmazione in un linguaggio di programmazione “ad alto livello”; e – traduzione in linguaggio macchina Walter Cazzola Algoritmi, Dati e Programmi 8 Algoritmo Un algoritmo è un insieme finito ed ordinato di passi che determinano un procedimento atto a risolvere in un tempo finito un problema utilizzando i dati iniziali ed ottenendo dei risultati. Esempi: Algoritmi per eseguire le 4 operazioni che ci sono stati insegnati alle elementari – Espressi in un linguaggio adatto ai bambini Ricette di cucina – Espresse nel linguaggio dei libri di cucina Walter Cazzola Algoritmi, Dati e Programmi 9 Algoritmo: Esempio Esempio: Algoritmo per accedere al proprio account sul computer del laboratorio: 1. 2. 3. 4. 5. Accendere lo schermo se è spento; Scrivere il proprio <username> nella riga in cui compare la scritta login: Scrivere la propria <password> nella riga in cui compare la scritta password; Se il sistema risponde con la frase: «utente non abilitato» ritornare al punto 2. e riprovare; Se il sistema continua a rispondere con la frase: «utente non abilitato» allora chiamare il tutor. Walter Cazzola Algoritmi, Dati e Programmi 10 Algoritmi e Programmi: Sviluppo Per costruire un programma conviene procedere con metodo: – passando da un’analisi del problema da risolvere, – all’algoritmo della soluzione rappresentato in un “linguaggio” adatto all’uomo ma non troppo lontano dai linguaggi di programmazione, – ed infine al programma scritto nel linguaggio di programmazione prescelto. Walter Cazzola Algoritmi, Dati e Programmi 11 Algoritmi e Programmi: Sviluppo Introdurremo la nozione di: – contenitore di dati (variabile) – come astrazione dalla nozione di zona della memoria utilizzata da un computer per i dati Descriveremo gli algoritmi mediante: – diagrammi di flusso; e – un linguaggio di programmazione didattico (LP) Walter Cazzola Algoritmi, Dati e Programmi 12 Processo di Sviluppo A. Diamo un nome al problema e partiamo dall’analisi del problema; B. Scriviamo la specifica funzionale; C. Outline dell’algoritmo, 1. Si introducono i contenitori di dati necessari e le relative operazioni elementari; 2. Si disegna un diagramma di flusso che indica in modo preciso e non ambiguo la successione di operazioni da eseguire; D. Traduciamo il diagramma di flusso in un programma. Walter Cazzola Algoritmi, Dati e Programmi 13 A. Problema e Analisi del Problema L’analisi del problema è il primo passo e deve fornire: – un nome e una breve descrizione di cosa si vuol fare; – un elenco di requisiti: richieste che il programma deve soddisfare. Walter Cazzola Algoritmi, Dati e Programmi 14 Esempio di Analisi del Problema Problema: RADICI Descrizione: vogliamo trovare le soluzioni reali di un’equazione di secondo grado. Requisiti: l’equazione può non avere soluzioni, avere due soluzioni coincidenti o due soluzioni distinte; a seconda dei casi, si vuole il messaggio: – “nessuna radice x”; – “radici coincidenti = r” dove r è il valore reale delle radici; – “due radici distinte r1, r2” dove r1 e r2 sono i valori reali delle due radici. Walter Cazzola Algoritmi, Dati e Programmi 15 B. Specifica Funzionale La specifica funzionale indica: – quali sono i dati iniziali, cioè quelli da elaborare, detti anche ingressi all’algoritmo; e – Qual è il risultato atteso, in funzione degli ingressi, detto anche uscita dell’algoritmo. Walter Cazzola Algoritmi, Dati e Programmi 16 Esempio di Specifica Funzionale RADICI: specifica funzionale Argomenti o ingressi: – a,b,c: numeri reali, coefficienti dell’equazione da elaborare Risultati o uscite: – “nessuna radice” – “x1 = x2 = r” se l’equazione a.x2+b.x+c ha radici coincidenti = r – “x1 = r1, x2 = r2” se l’equazione a.x2+b.x+c ha radici distinte = r1, r2 Walter Cazzola Algoritmi, Dati e Programmi 17 C. Outline dell’Algoritmo Descrivere brevemente l’idea dell’algoritmo – cioè i passi da eseguire per giungere alla soluzione a partire dagli ingressi. Il primo outline non deve necessariamente essere molto dettagliato: si procede per raffinamenti successivi. Walter Cazzola Algoritmi, Dati e Programmi 18 Esempio di Outline dell’Algoritmo RADICI: Outline dell’Algoritmo. – Risolvo il problema calcolando il discriminante delta dell’equazione; – Analizzo i vari casi di delta: < 0 = 0 > 0 – Caso per caso costruisco il messaggio da inviare in uscita. Successivamente definisco le variabili coinvolte e dettaglio l’algoritmo grazie ad un diagramma di flusso. Walter Cazzola Algoritmi, Dati e Programmi 19 C.1. Contenitori di Dati Un algoritmo deve tener traccia degli ingressi, dei risultati e dei valori intermedi che prodice durante il calcolo. Allo scopo, usa dei contenitori di dati. Un contenitore dati, detto anche variabile, è un’astrazione della nozione di area di memoria contenente dei dati. I dati contenuti hanno un tipo, che caratterizza un insieme di elementi e le operazioni possibili su di essi. Walter Cazzola Algoritmi, Dati e Programmi 20 C.1. Contenitori di Dati (Segue) Tipo dei Contenitori. TIPO di DATO = insieme di elementi rappresentabili in modo finito, dotato di operazioni primitive su di esso. ESEMPIO: il tipo degli interi – è l’insieme degli interi, sono successioni finite di cifre con eventuale segno; – dotato delle seguenti operazioni primitive (e calcolabili): +, -, *, divisione intera, resto. pippo: intero 54 Walter Cazzola Nome contenitore e tipo Contenuto = dato appartenete al tipo di dati associato al nome Algoritmi, Dati e Programmi 21 C.1. Contenitori di Dati (Segue) I contenitori di dati utilizzati per i risultati intermedi dipendono dall’algoritmo: – quindi, a meno di casi assai elementari, è necessario avere già un’idea ben delineata dell’algoritmo per determinarli – difficilmente sono TUTTI prevedibili sin dall’inizio; man mano che l’algoritmo prende forma, si possono aggiungere al volo nuovi contenitori Walter Cazzola Algoritmi, Dati e Programmi 22 Esempio di Contenitori di Dati Contenitori di dati usati da RADICI. Di quali contenitori abbiamo bisogno per RADICI? – Sicuramente di quelli per contenere i dati di ingresso ed il risultato: 3 contenitori per a,b,c (ingressi) e r1, r2. – Eventuali contenitori per i risultati intermedi (ad es. delta) ed eventualmente quello finale. Tutti i contenitori saranno di tipo float. Walter Cazzola Algoritmi, Dati e Programmi 23 C.2 Diagrammi di Flusso Diagramma di Flusso: è un formalismo visuale per rappresentare in modo semplice ed intuitivo un algoritmo. Un algoritmo compie due tipi fondamentali di operazioni: – calcoli primitivi: ottenibili mediante le operazioni primitive dei tipi di dati (sostanzialmente, valutando espressioni); – azioni: consistono nel modificare il contenuto dei contenitori di memoria, eventualmente eseguendo calcoli primitivi. Walter Cazzola Algoritmi, Dati e Programmi 24 Calcoli Primitivi Valutazione di espressioni in cui compaiono i nomi dei contenitori di dati utilizzati e solo operazioni primitive disponibili sui relativi tipi di dati; il valore dell’espressione è riferito allo STATO di memoria dell’algoritmo, cioè al contenuto attuale dei suoi contenitori dati. Esempio: b .b - 4 . a . a : float b : float c : float 2 4 2 Stato della Memoria c = 0 È un’espressione valutabile perché contiene operazioni primitive disponibili nel tipo float. Walter Cazzola Algoritmi, Dati e Programmi 25 Calcoli Primitivi: Espressioni Booleane Fra le espressioni valutabili assumono particolare importanza quelle di tipo booleano. Il tipo booleano contiene due valori: – vero, falso. Esempi di espressioni booleane disponibili nei tipi numerici: – x < y – (x + 5) = y – ecc. Walter Cazzola Algoritmi, Dati e Programmi 26 Azioni Modificano lo stato di memoria, cioè i valori dei contenitori dati. Le azioni più semplici sono gli assegnamenti, della forma: – metti ESPRESSIONE in CONTENITORE – si valuta ESPRESSIONE e si mette il risultato in CONTENITORE, sostituendone il valore precedente. Esempi di altre azioni: leggi da input, scrivi su output. Esempio: Stato della Memoria a : float b : float c : float delta: float 2 4 2 0 Metti b . b - 4 Walter Cazzola . a . c in delta. Algoritmi, Dati e Programmi 27 Diagrammi di Flusso – Blocchi Computazionali. – Blocchi Decisionali. vero metti x+y in y; metti x-1 in x; Contengono sequenze di azioni. x = 0 falso Contengono una condizione booleana: – se vera, si segue la freccia etichettata “vero”; – se falsa si segue la freccia etichettata “falso” Walter Cazzola Algoritmi, Dati e Programmi 28 Strutture di Controllo Modulari Un diagramma di flusso si ottiene collegando le frecce uscenti dai blocchi di elaborazione e decisionali. Una buona norma è attenersi a diagrammi con strutture predefinite, con una sola freccia entrante ed una sola uscente. Tali strutture sono dette strutture di controllo e sono alla base della programmazione strutturata. Ciò consente di modularizzare (cioè dividere in parti o moduli) il diagramma; è utile poiché spesso i moduli corrispondono a sottoproblemi Walter Cazzola Algoritmi, Dati e Programmi 29 Strutture di Controllo Principali – Sequenza. – Iterazione. falso – Selezione. vero Walter Cazzola vero falso Algoritmi, Dati e Programmi 30 Esempio Diagramma di Flusso Ingresso: 1, 2, 1 Assegna ad a,b,c i valori d’ingresso RADICI: Diagramma di Flusso Metti il valore di b2-4ac in delta a:float b:float c:float 1 2 1 delta:float 0 MESSAGGIO: radici coincidenti = -1 Stato della Memoria delta<0? vero MESSAGGIO: ‘nessuna soluzione’ Walter Cazzola falso delta=0? falso vero MESSAGGIO: ‘radici coincidenti=’ -b/2a Algoritmi, Dati e Programmi MESSAGGIO: ‘radici distinte=’ (-b-radice(delta))/2a (-b+radice(delta))/2a 31 D. Il Programma Disegnato il diagramma di flusso e quindi delineato in tutte le sue parti l’algoritmo non resta che tradurlo in un programma che il calcolatore sarà in grado di eseguire. Il programma verrà scritto usando un linguaggio di programmazione (ad es. C, Java, Matlab etc.). Noi cominceremo con un linguaggio didattico per prendere dimestichezza coi vari concetti. Walter Cazzola Algoritmi, Dati e Programmi 32 Linguaggi di Programmazione Un linguaggio di programmazione è costituito da: – un vocabolario – un insieme di regole sintattiche che specificano come comporre istruzioni ben formate – una semantica che associa un “significato” alle istruzioni ben formate, cioè l’azione denotata da ciascuna istruzione. Rispetto ad una qualsiasi lingua parlata da esseri umani, un linguaggio di programmazione è molto più semplice, perché la sua sintassi è molto semplice. Walter Cazzola Algoritmi, Dati e Programmi 33 Linguaggi di Programmazione Linguaggi di Basso Livello. Sono linguaggi di programmazione caratterizzati da istruzioni molto elementari (ad es. l’Assembly). Richiedono uno sforzo di codifica maggiore da parte del programmatore. Linguaggi di Alto Livello. Sono linguaggi di programmazione in cui ad ogni istruzione corrisponde un insieme di azioni più articolato. Richiedono uno sforzo di codifica inferiore. Walter Cazzola Algoritmi, Dati e Programmi 34 Esempio Il linguaggio L1 mette a disposizione i comadi: – – – – Aggiungi_una_unità_al_dato_A Leggi_dato_A Leggi_dato_B Esegui_per <numero di volte> Il linguaggio L2 mette a disposizione i comadi: – Leggi_dato_A – Leggi_dato_B – Somma <addendo1, addendo2> Walter Cazzola Algoritmi, Dati e Programmi 35 Esempio (Segue) Vogliamo scrivere un programma per la somma di due numeri memorizzati rispettivamente nei registro A e B. In L1: Leggi_dato_A Leggi_dato_B Esegui_per B volte: Aggiungi _una_unità_al_dato_A In L2: Leggi_dato_A Leggi_dato_B Somma (A, B) L2 è un linguaggio di livello più alto rispetto a L1, perché offre al programmatore la possibilità di usare istruzioni che sono meno “vicine” al modo in cui lavora il processore. Walter Cazzola Algoritmi, Dati e Programmi 36 Il Linguaggio Macchina Il processore è in grado di riconoscere (e quindi di eseguire) solo programmi scritti in un proprio linguaggio di basso livello (linguaggio macchina). Ogni modello di processore (es: Intel, Pentium, Motorola, PowerPC) ha un proprio linguaggio macchina diverso da quello degli altri processori. Un programma scritto in un linguaggio diverso dal linguaggio macchina deve essere quindi tradotto nel linguaggio che il processore sa interpretare. Walter Cazzola Algoritmi, Dati e Programmi 37 Linguaggi di Programmazione Invece di codificare algoritmi in linguaggi macchina si utilizzano linguaggi ad alto livello. Le istruzione dei linguaggi ad alto livello sono facilmente comprensibili ai programmatori. Compilatore: (programma che) traduce automaticamente un programma ad alto livello in linguaggio macchina. Affronteremo la programmazione tramite un linguaggio semplificato che chiameremo LP (riepilogo sintassi sul sito del corso). Walter Cazzola Algoritmi, Dati e Programmi 38 Nozione di Variabile Come si indirizzano le celle di memoria? Invece di usare gli indirizzi fisici si usano dei nomi simbolici (es., x, y, nome,...) che vengono mappati in indirizzi fisici attraverso la fase di compilazione. Le variabili vanno dichiarate all’inizio del programma (celle diverse, nomi diversi). Valore di una variabile = contenuto corrente della cella di memoria associata alla variabile. Walter Cazzola Algoritmi, Dati e Programmi 39 Nozione di Costante Per esprimere direttamente valori prefissati (cioè che non devono essere modificati dal programma) si utilizzano le costanti Una costante è una rappresentazione simbolica di un numero, stringa, ecc. Ad esempio, 1, ‘ciao’, 3.14, ecc. Il set di costanti disponibile dipende dal linguaggio di programmazione. Walter Cazzola Algoritmi, Dati e Programmi 40 Espressioni Le espressioni servono per rappresentare calcoli a livello simbolico. Un’espressione può coinvolgere nomi di variabili, costanti, operatori aritmetico-logici, ecc. Es: 3+4, x+y-1 (dove x è una variabile), x>0 and y>1 Walter Cazzola Algoritmi, Dati e Programmi 41 Programma LP La sintassi di un programma LP consiste di due blocchi. Dichiarazione di variabili e costanti: const pi = 3.14, nome = “Walter”; var x: int, y: string, z: float; Sono liste di dichiarazioni introdotte rispettivamente dalla keyword const e var. Sequenza di istruzioni racchiusa tra le parole chiave begin … end e separate dal punto e virgola ‘;’ Walter Cazzola Algoritmi, Dati e Programmi 42 Esecuzione di un Programma Qual è significato (semantica) di un programma? Trasformazione da Input iniziale a Output finale! Un programma deve essere eseguito per poter calcolare la trasformazione InputÎOutput. L’esecuzione modifica lo stato del programma: stato iniziale, corrente, e finale. L’esecuzione dipende dalla semantica dei singoli costrutti. Walter Cazzola Algoritmi, Dati e Programmi 43 Lettura e Scrittura Le operazioni di lettura e scrittura servono per ottenere valori in input (es. tastiera) o fornire valori in output (es. Video). Assumiamo che input e output siano sequenze di valori: – write(Variabile): aggiunge il valore corrente di Variabile all’output; – read(Variabile): toglie il primo valore della lista input e lo assegna a Variabile. Walter Cazzola Algoritmi, Dati e Programmi 44 Assegnamento Si utilizza per assegnare il valore corrente di un’espressione ad una variabile. L’assegnamento cambia il valore della variabile. Variabile := Espressione; se nello stato corrente Espressione si valuta in val allora Variabile varrà val dopo l’esecuzione dell’assegnamento. Es. x:=x+1 L’espressione x+1 va valutata nello stato corrente. Il risultato dell’espressione è assegnato nuovamente ad x. Walter Cazzola Algoritmi, Dati e Programmi 45 Istruzione Condizionale Sintassi: if Condizione then Lista Istruzioni1 else Lista Istruzioni2 endif Condizione = Espressione Booleana. Se la condizione si valuta in vero si esegue ramo then, altrimenti si esegue vero il ramo else Lista Istruzioni1 Walter Cazzola Algoritmi, Dati e Programmi Condizione falso Lista Istruzioni2 46 Esempi Lettura da tastiera e Leggere due numeri, sommarli Calcolare il massimo tra 2 scrittura su video: valori letti in input: e stampare il risultato: var s: string begin read(s); write(s); end. Walter Cazzola var x,y,somma: int; begin read(x); read(y); somma:=x+y; write(somma); end. Algoritmi, Dati e Programmi var x,y: int; begin read(x); read(y); if x>y then write(x) else write(y); endif end. 47 Istruzione Ciclica Sintassi: while Condizione do Lista Istruzioni endw Lista Istruzioni viene eseguita fintantochè Condizione si valuta in vero. Quando Condizione si valuta in falso si Condizione falso vero Lista Istruzioni passa all’istruzione seguente nel programma Walter Cazzola Algoritmi, Dati e Programmi 48 Esempio: Somma di K Numeri Problema: leggere K, e quindi calcolare la somma di K valori letti dall’input. Devo memorizzare K, la somma, e i valori letti V1,V2,…,VK – Poiche uso ogni Vi una sola volta, bastano 3 variabili: K, x ed S; – x manterrà il valore Vi corrente, S la somma progressiva; var K, x, S: int; begin read(K); S:=0; while K>0 do read(x); S:=S+x; K:=K-1; endw; write(somma); end. Walter Cazzola Algoritmi, Dati e Programmi 49 Esecuzione del while Inizialmente: val(x),val(K)=indefiniti,val(somma)=0. Leggo il valore 3: val(K)=3 Poiché val(K)>0, entro nel ciclo. Leggo il primo valore in input V1 su cui fare la somma e lo memorizzo in x. Calcolo somma=somma+x, e decremento K. Cioè dopo l’esecuzione delle istruzioni dentro il ciclo val(x)=3, val(somma)=3, val(K)=2 Proseguo con il ciclo fino a che val(K)=0. A tal punto esco dal ciclo e scrivo il valore finale di somma Walter Cazzola Algoritmi, Dati e Programmi 50 Esempio: Calcolo MCD Calcolare il massimo comun divisore tra due numeri interi letti da input, utilizzando l’algoritmo di Euclide: – mcd(m,n)=m=n se n=M – mcd(m,n)=mcd(m-n,n) se m>n – mcd(m,n)=mcd(m,n-m) se n>m Walter Cazzola Algoritmi, Dati e Programmi 51 Algoritmo di Euclide Leggo m and n (*) Fino a che m diverso da n, – se m>n allora sottraggo n ad m – se n>m sottraggo m ad n – torno a (*) Quando m=n stampo, ad es, n Walter Cazzola Algoritmi, Dati e Programmi 52 Es. Calcolo MCD var m,n: int; begin read(m); read(n); while not(m=n) do if m>n then m:=m-n else n:=n-m; endif endw; write(n); (Nota: a questo punto n=m!) end Walter Cazzola Algoritmi, Dati e Programmi 53 Strutture Dati Complesse Oltre a variabili di tipo intero, stringa, ecc può essere molto utile utilizzare dati strutturati (ad es. liste, insiemi, ecc) Molti linguaggi di programmazione forniscono vari tipi di dato quali – array, – record, – list Nel linguaggio LP abbiamo solo array e record. Walter Cazzola Algoritmi, Dati e Programmi 54 Array Un array rappresenta una sequenza di celle consecutive contenenti dati omogenei (es. interi). Una variabile V di tipo array denota la sequenza di celle Per accedere direttamente alla cella i-esima si utilizza il suo indice i come segue: V[i]. Sintassi dichiarazione: – NomeVarArray: array 1..N of Tipo; (N costante) Nelle espressioni, assegnamenti, ecc si utilizza poi – NomeVarArray[Exp] dove Exp è un espressione che si valuta in un valore da 1…N Walter Cazzola Algoritmi, Dati e Programmi 55 Esempio: Array Leggere K=<10 valori e stamparli in ordine inverso: – Dobbiamo leggere V1,…,VK, memorizzarli e poi stamparli in ordine VK,…,V1. – Usiamo un array A di N>K posizioni per memorizzare i dati in input. – Dopo aver memorizzato i dati, li scriviamo scorrendo l’array dall’indice K all’indice 1. Walter Cazzola var A : array 1..10 of int; i,K : int; begin read(K); i := 1; while i=<K do read(A[i]); i:=i+1; endw; i:=K; while i>0 do write(A[i]); i:=i-1; endw; end. Algoritmi, Dati e Programmi 56 Record Tipo di dato per gestire dati strutturati di tipo eterogeneo; ogni dato viene chiamato campo del record. Sintassi: Variabile: record Campo-1:Tipo1; … Campo-N:TipoN; end Per accedere ai campi di un record si utilizza: Variabile.Campo-i (rappresenta l’i-esimo campo) Walter Cazzola Algoritmi, Dati e Programmi 57 Esempio di Record Coordinate: var Punto:record x,y:int end; z:int; Punto.x=3; Punto.y=2; z:=Punto.x*Punto.y; Walter Cazzola Algoritmi, Dati e Programmi 58 Compilatore e Loader Un compilatore è un programma che traduce un programma scritto in linguaggio ad alto livello in un programma scritto in linguaggio macchina: – Un compilatore produce quindi un programma eseguibile (.exe in Windows) Il loader è il programma che carica un programma in linguaggio macchina in memoria principale (e quindi mappa indirizzi logici in indirizzi fisici) Walter Cazzola Algoritmi, Dati e Programmi 59 Come Funziona la Compilazione Un compilatore (che abbia anche la funzione di loader) deve – riconoscere la sintassi del linguaggio ad alto livello; – associare uno spazio in memoria principare per poter gestire le variabili dichiarate nel programma; – tradurre i costrutti di alto livello in sequenze di istruzioni in linguaggio macchina. Walter Cazzola Algoritmi, Dati e Programmi 60