vuoi
o PayPal
tutte le volte che vuoi
M tabelle di verità, ciascuna con N+1 colonne (N possibili valori delle variabili+ 1valore verità
risultato) si possono compattare tra di loro in una tabella a N+M colonne. rappresentano per tanto
una trasformazione da stringhe di N bit a M bit.
anche la rete ha bisogno di un certo tempo di commutazione per produrre sulle uscite il segnali
corrispondenti al bit del risultato.
reti sequenziali
le , calcolano non una singola funzione, ma una sequenza finita di funzioni
booleane.
una rete sequenziale ha come ingresso il contenuto del registro IR (registro istruzione corrente),
ovvero il codice operativo dell’istruzione corrente, e come uscita i segnali di abilitazione dei registri
e i segnali di selezione delle operazioni dell’ALU.
gli elementi della sequenza vengono generati uno dopo l’altro in corrispondenza di un segnale di
sincronizzazione detto clock.
alla fine di ciascuna sequenza l’unità di controllo genera la sequenza di segnali di abilitazione che
corrisponde alla fase di fetch.
la durata del periodo del clock deve essere sufficiente affinché la rete possa generare un nuovo
risultato prima del periodo successivo.
capitolo 10
nella strutturazione del programma si possono distinguere due aspetti:
la strutturazione logica: decomposizione in parti dell’algoritmo. un insieme di sottoprogrammi e
un insieme di variabili globali. non implica necessariamente la suddivisione del programma in più
file: il codice di un programma strutturato in sottoprogrammi potrebbe essere interamente
contenuto in un unico file.
il principale meccanismo di strutturazione logica è la possibilità di isolare un segmento di
sottoprogramma
codice in un .
le variabili di appoggio definite e utilizzate all’interno del sottoprogramma sono definite
locali.
le variabili che sono dichiarate all’esterno del sottoprogramma, ma usate e definite dal
corpo sono dette variabili globali o statiche. le variabili globali possono essere utilizzate da
più sottoprogrammi. poiché vengono usate e definite da sottoprogrammi diversi non è
sempre facilmente identificabile il codice che le manipola o la sequenza dinamica con cui
vengono usate o definite.
la strutturazione fisica: divisione in parti del testo del programma. (divisione in file del
programma)
esistono due meccanismi (che possono essere combinati) attraverso i quali è possibile
dividere un programma in file:
• meccanismo dell’inclusione (attraverso la direttiva #include): causa la sostituzione della riga di
testo che la contiene con l’intero contenuto del file ad argomento della direttiva. il processore
restituisce un unico file (non visibile) che viene compilato per produrre il programma
eseguibile. il meccanismo dell’inclusione viene usato per mettere in un file separato le
dichiarazioni di tipi o variabili globali che vanno ripetute in più di un’unità di compilazione.
es. #include <math.h>
inclusione del contenuto del file “math.h” al posto della direttiva.
• meccanismo della compilazione separata: i file vengono compilati separatamente
(indipendentemente l’uno dall’altro) e i prodotti delle compilazioni vengono ricambianti con un
linker
ulteriore strumento detto (collegatore). una porzione di codice che non sia un
programma completo, ma che possa essere compilato separatamente dal resto del
programma viene detta unità di compilazione. un’unità di compilazione deve rispettare alcune
regole: le istruzioni che definiscono singole componenti logiche del programma (variabili
globali o sottoprogrammi) devono essere interamente contenute in essa; devono essere
presenti le dichiarazioni di tutti gli identificatori che in essa compaiono. la definizione vera e
propria è quella contenuta nella prima unità, mentre la dichiarazione presente nella seconda
unità viene detta allusione e caratterizzata dall’uso della parola chiave extern, indica che essa
è definita in un’altra unità. questo modo di procedere comporta vantaggi pratici nel caso di
programmi di grosse dimensioni e sviluppo in parallelo di parti diverse ad opera di più
programmatori. tale possibilità permette di ricompilare solo una piccola parte del programma
quando si vogliono apportare modifiche limitate. macchina astratta
programma sorgente rende il programma
processore più maneggevole
attraverso la
sostituzione di
caratteri
compilatore
traduce dal
linguaggio sorgente
al linguaggio
macchina programma eseguibile
macchina dati di uscita
dati di ingresso reale
richiesta di esecuzione
macchina astratta
: realizzata mediante l’uso combinato di una macchina reale
basata sul modello di Von Neumann, e di programmi speciali che traducono il programma
formulato nel linguaggio ad alto livello in un equivalente programma formulato nel linguaggio
direttamente eseguibile dalla macchina reale.
durante l’esecuzione del programma il codice macchina e le variabili globali vengono memorizzati
in due porzioni contigue della memoria distinte dette rispettivamente area codice e area dati statici.
ogni istruzione e ogni variabile globale è associata a un indirizzo assoluto.
l’associazione di un indirizzo di memoria a un’istruzione o a un dato viene indicata con il termine
allocazione. binding
il procedimento attraverso cui si determina un indirizzo di un operando viene detto .
(quindi richiede che sia stata stabilita l’allocazione).
binding statico: le istruzioni contengono gli indirizzi completi dei suoi operandi (indirizzi assoluti)
binding dinamico: le istruzioni contengono indirizzi fittizi o incompleti dei loro operandi (indirizzi
relativi) {l’istruzione contiene l’indirizzo del vero indirizzo che quindi può essere modificato
durante l’esecuzione}.
il binding statico prevede alcuni inconvenienti tra cui che non possono essere eseguiti più
programmi contemporaneamente (a meno che l’insieme dei programmi da eseguire non sia deciso
a priori in modo da preallocarli in zone disgiunte della memoria) e lo spazio assegnato ai
programmi che provvedono alla gestione della macchina dovrebbe essere delimitato a priori.
per questo l’esecuzioni dei programmi sulle macchine reali impiega tecniche dinamiche di binding
basate sull’impiego delle istruzioni di indirizzi relativi (la posizione è relativa alla prima cella che
assume indirizzo ‘0’, la successiva ‘1’ e così via).
col termine rilocazione del codice si intende la traslazione del codice da una zona di memoria a
un’altra.
se il codice contiene indirizzi assoluti, la rilocazione viene detta rilocazione statica.
quando invece nel codice si fa uso di indirizzi relativi, un programma può essere allocato in una
zona qualsiasi della memoria, effettuando la rilocazione inizializzando opportunamente il contenuto
dei registri base. tale forma di rilocazione è detta rilocazione dinamica.
compilatore
il compito principale del compilatore è quello di tradurre il programma scritto dal programmatore in
linguaggio a alto livello (file sorgente) in un equivalente in linguaggio macchina. il prodotto della
traduzione viene detto file oggetto.
nell’effettuare la traduzione il compilatore assegna a istruzioni e dati indirizzi relativi a partire
dall’indirizzo 0. tale binding statico viene effettuato solo sugli operandi locali, cioè sulle istruzioni e
sui dati definiti nell’unità di compilazione in esame. nel caso siano presenti operandi per i quali non
è disponibile la definizione (sottoprogrammi o variabili globali definiti in un’altra unità di
compilazine) il compilatore non è in grado di determinare l’allocazione e quindi di effettuare il
binding. i riferimenti a tali operandi restano indefiniti e vengono detti riferimenti esterni.
collegatore
il ruolo del collegatore è quello di risolvere i riferimenti esterni di ciascun file oggetto.
per raggiungere il suo obbiettivo effettua alcune fasi:
identifica le unità di compilazione da collegare, disponendo i file oggetto uno dopo l’altro
separando l’aria codice dall’area dati statici. il contenuto dei file oggetto è unificato in due blocchi.
viene ripetuto il binding statico di tutti gli operandi (in quanto dopo l’unificazione l’allocazione
relativa di dati e istruzioni risulta modificata). effettua il binding dei riferimenti esterni.
al termine del collegamento viene prodotto un file in codice macchina in cui non sono più presenti
riferimenti esterni e quindi completamente tradotto.
il collegamento di più file oggetto può dare luogo a prodotti diversi: il file eseguibile, la libreria dati e
la libreria dinamica.
file eseguibile
il (caratterizzato dal suffisso “.exe”) è un file che contiene il codice e le
informazioni necessarie per l’esecuzione di un programma.
per produrre un file eseguibile occorre specificare tutti i file oggetto e le librerie che contengono il
codice necessario per il programma e informazioni necessarie per capire come allocare e come
caricare il programma in memoria. tra i simboli definiti deve esistere il simbolo globale “_main” che
indica il punto da cui iniziare l’esecuzione.
libreria statica
la (caratterizzata dal suffisso “.lib”) è una collezione di file oggetto e alcune
informazioni ausiliarie. la libreria deve contenere tutti i file oggetto in cui compare la definizione di
simboli (programmi e variabili globali) usati negli altri file oggetto appartenenti alla libreria. la lista
deve essere completa. non è necessario che sia presente il simbolo “_main” dal momento che
essa non rappresenta in alcun modo una porzione di codice eseguibile autonomamente. il
collegatore estrae in modo selettivo i file utili dalla libreria partendo dai riferimenti esterni
aggiungendo i file oggetto in modo incrementale fino a che tutti i riferimenti esterni siano risolti.
interprete
tuttavia è possibile un approccio diverso per realizzare la macchina astratta: invece di tradurre il il
programma sorgente in un programma eseguibile, viene utilizzato un interprete in grado di
ricostruire il significato del codice sorgente e di eseguire direttamente le operazioni della macchina
astratta che esso descrive. non viene quindi generata alcuna traduzione in linguaggio macchina
del file sorgente.
file compilati: traduzione del programma in una forma che l’hardware può direttamente eseguire.
richiede più tempo per iniziare l’esecuzione e ogni modifica richiede una nuova compilazione
• non portabili
•
file interpretati: l’hardware esegue un programma (l’interprete) che analizza il programma sorgente
e compie direttamente le corrispondenti azioni elaborative.
inizio immediato dell&rsq