Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate
Architettura degli elaboratori
Astrazione e Macchine Virtuali parte 1: in generale
Architettura di Von Neumann
Architettura degli elaboratori
Architettura degli elaboratori
Il concetto di astrazione
Astrazione = ignorare (nascondere) dettagli (anche rilevanti) per semplificare il problema
Utile (necessario) per affrontare sistemi complessi Loro analisie loro sintesi
Approccio riduzionista
tipico della scienza e ingegneria (contrario: «olistico»)
Esempi:
Motore visto come elemento che eroga potenza – astraggo da dettagli costruttivi
Database: sistema in grado di memorizzare dati persistenti, gestendo accessi concorrenti, sicurezza, ecc.
Sistema biologico: organismo – organo – tessuto – cellula – organelli – molecole – atomi – …
L’astrazione e il calcolatore
Il calcolatore può essere compreso (analisi) e costruito (sintesi) come una gerarchia di macchine astratte (virtuali)
Ogni livello maschera (nasconde) i dettagli dei livelli sottostanti Utile per la descrizione: mi interessa capire il funzionamento del livello in esame, non dei sottostanti (ed essere in grado di progettarlo).
Architettura degli elaboratori
L’astrazione e il calcolatore
L’astrazione è utile anche in fase di costruzione (sintesi).
Ad es. costruire una ‘macchina powerpoint’ direttamente con transistor sarebbe di complessità proibitiva …
Soluzione:
1. Costruiamo una prima macchina (l’elaboratore) in grado di eseguire istruzioni elementari.
2. Utilizziamo queste istruzioni elementari per scrivere un programma (il Sistema Operativo) in grado di eseguire comandi più complessi
Il programmatore del S.O. non conosce i dettagli relativi alla tecnologia realizzativa del microprocessore
3. Scriviamo programmi che si basano sulle funzioni messe a disposizione dal S.O.
il programmatore di powerpoint non conosce i dettagli costruttivi del S.O.
In questo corso non arriveremo mai al livello del transistor, né tantomeno dei livelli sottostanti.
Architettura degli elaboratori
Istruzioni e operazioni
Un esecutore è definito in base a tre elementi:
l’insieme delle operazioni che è capace di compiere;
l’insieme delle istruzioni che capisce (sintassi);
quali operazioni associa ad ogni istruzione che riconosce (semantica).
Ad es. un elaboratore è in grado di eseguire un insieme di istruzioni Per ogni istruzione esegue diverse operazioni:
1. Preleva da memoria l’istruzione da eseguire 2. Esamina l’istruzione e capisce cosa deve fare
3. Esegue l’istruzione (cioè esegue le operazioni elementari corrispondenti al significato dell’istruzione).
Operazioni fisse (le stesse per ogni istruzione)
Operazioni diverse per ogni istruzione
Architettura degli elaboratori
Differenza tra istruzione e operazioni
Istruzione (comando): “Vammi a prendere un caffé”
Operazioni:
Mi alzo
Mi dirigo verso la porta Apro la porta
Raggiungo la macchina del caffé
…
Ci deve essere un elemento che interpreta il comando convertendolo nella serie opportuna di operazioni.
Linguaggio: definizione
Il linguaggio è l’insieme delle istruzioni (comandi) che un esecutore è in grado di comprendere ed eseguire.
NB: nel descrivere un linguaggio non è rilevante sapere come viene eseguita l’istruzione (cioè ad es. a quale sequenza di operazioni l’esecutore ricorre)
Architettura degli elaboratori
Il linguaggio macchina
Il linguaggio macchina è il linguaggio compreso dal processore
Ovviamente esistono tanti linguaggi macchina quanti sono i processori:
Zilog Z80, DEC Alpha, Intel 8080, 80386, Pentium IV, ecc.
Un’interessante eccezione: la compatibilità Caratteristiche del linguaggio macchina:
Binario: le istruzioni sono delle sequenze di 0 e 1
Di basso livello: ogni istruzione ha un effetto molto elementare. Ad es.:
Copia il contenuto di un registro in un altro registro
Trasferisci il contenuto di una data cella di memoria in un registro Somma i contenuti di due registri e metti il risultato in un terzo registro
…
Scrivere programmi complessi con istruzioni di questo genere è lungo, tedioso e passibile di errori anche banali.
Architettura degli elaboratori
Il dilemma
La macchina “semplice” costruita con i transistor mi fornisce un linguaggio inadeguato alla programmazione di programmi complessi e sofisticati.
Costruire direttamente con i transistor una macchina in grado di supportare la programmazione di alto livello è un’impresa di costo e complessità enormi.
Che fare?
Teniamo la nostra macchina di basso livello, ma ci “costruiamo sopra” una macchina di più alto livello (cioè più potente e facile da programmare)
Architettura degli elaboratori
Esecutori e linguaggi
Il calcolatore “capisce” le istruzioni che fanno parte del linguaggio macchina (che indichiamo con L0).
L’obiettivo è definire una macchina che capisca un linguaggio L1 più potente e facile da utilizzare rispetto al linguaggio macchina L0:
definire l’insieme delle istruzioni che fanno parte di L1;
utilizzare le istruzioni di L0 come operazioni di L1;
definire quali operazioni vengono associate a quali istruzioni.
Definizione di una machina di più alto livello
La macchina M0capisce il linguaggio L0, che comprende le istruzioni I0, I1, I2 L0= {I0, I1, I2}
M0è data e non ci interessa come funziona internamente.
Definiamo una macchina M1che capisce un linguaggio L1, che comprende le istruzioni J0, J1, J2, J3
L1= {J0, J1, J2, J3}
M1 è tipicamente una macchina di più alto livello rispetto a M0, cioè le sue istruzioni sono più potenti e facili da usare.
Tutte le istruzioni di L1 saranno definite in termini di istruzioni di L0. Cioè ogni istruzione Jkcorrisponde a una sequenza di istruzioni della macchina M0ad es.
J0= I0; I1; I1; I2. J1= I1; I2. J2= I2 ; I0; I1. J3= I2 ; I2; I0
Sulla carta la definizione è immediata, ma come si
realizza in pratica?
Architettura degli elaboratori
M
1Come realizzare M
1?
Una soluzione consiste nell’incorporare M0in M1.
Ogni volta che si deve eseguire una istruzione di L1, si richiede a M0di eseguire le corrispondenti istruzioni L0.
Esempio: per eseguire J2si richiederà a di eseguire la sequenza di istruzioni corrispondente, cioè I2; I0; I1
M
0J2 I2
I0 I1
Problema: chi decide che J2
si trasforma nella sequenza I2 I0I1?
Deve essere tutto automatico!
Architettura degli elaboratori
M
1Come passare da L1 a L0
Traduzione (o compilazione)
Un apposito programma (compilatore) traduce il programma PL1, scritto in linguaggio L1, in un programma PL0, scritto in linguaggio L0;
il nuovo programma PL0viene quindi eseguito.
M
0Traduttore
--- ---
J2
--- --- ---
I2 I0 I1 ---
Programma scritto in L1
Programma equivalente scritto in L0
Architettura degli elaboratori
Come passare da L1 a L0
Interpretazione
Un apposito programma (interprete) esamina il programma PL1, scritto in linguaggio L1, e, istruzione per istruzione, lo traduce nel linguaggio L0 e lo esegue.
M
1M
0J2 I2
I0 I1
Interprete
Interpretazione
Il controllo è sempre nelle mani dell’interprete Dati dell’interprete
Programma PL1scritto nel linguaggio L1 Dati del programma PL1
☺ Versatile e comodo in fase di debugging
• Se si identifica un errore si può cambiare il codice e proseguire senza dover ripartire da zero
Prestazioni ridotte
• Ogni istruzione viene tradotta ogni volta che viene eseguita Di solito è scritto in L0 e fa parte integrante della macchina M1.
Architettura degli elaboratori
Compilazione
Il compilatore mantiene il controllo solo nella prima fase (traduzione da PL1a PL0).
Una volta fatta la traduzione non serve più (finché non si cambia il programma).
Dati del compilatore:
programma PL1scritto nel linguaggio L1 (input);
programma PL0scritto nel linguaggio L0 (output).
☺ Buone prestazioni:
• si esegue PL0scritto in linguaggio L0;
• durante la traduzione si può ottimizzare il codice.
In caso di modifica del codice (e.g. debugging) è necessario ricompilare il programma modificato.
Architettura degli elaboratori
Costruzione di un compilatore
Problema: come scrivere il primo complilatore da L1 a L0 ? Scriverlo direttamente in L0? di solito, difficile
Si può scriverlo in L1, e poi tradurlo a mano in L0.
Alternativa: in un linguaggio Lx, disponendo già di un comp da Lx a L0
Al giorno d’oggi:
Design e implementazione di compilatori (da un linguaggio dato):
disciplina matura
Esistono molti strumenti software per semplificare il task.
è facile definire nuovi linguaggi ad-hoc, ad alto livello, pensati per gestire contesti specifici, e dotarsi di compilatori per tali linguaggi (o interpreti – in questo caso si parla spesso di «linguaggi di scripting») Nota: i buoni compilatori ottimizzano il codice che producono
La scrittura di compilatori esula dagli obiettivi di questo corso
Architettura degli elaboratori
Macchina virtuale M1
Il calcolatore reale (macchina M0) riconosce programmi scritti nel linguaggio L0
realizzare una macchina reale capace di comprendere il linguaggio L1 sarebbe troppo costoso e/o poco efficiente
La compilazione o l’interpretazione permettono di realizzare una macchina virtuale M1 capace di comprendere il linguaggio L1.
Problema:
per rendere comoda ed efficiente la traduzione, la distanza tra L1 e L0 (e quindi tra M1 e M0) non può essere elevata;
non è detto che M1 sia la soluzione desiderata (potrebbe essere ancora troppo distante dal livello “umano”).
Macchina virtuale M2
È possibile ripetere lo stesso procedimento ipotizzando che M1 sia il punto di partenza (invece di M0) per definire una macchina virtuale M2 capace di eseguire programmi scritti in un linguaggio L2.
Per la traduzione dei programmi scritti nel linguaggio L2 esistono due possibilità:
tradurli in L1 per eseguirli con la macchina virtuale M1;
tradurli direttamente in L0 in modo che possano essere eseguiti dalla macchina reale M0.
Iterando si possono definire ulteriori macchine virtuali M3, M4, ... MN fino a raggiungere il livello di “usabilità” desiderato.
Architettura degli elaboratori
Macchina a più livelli
M0 (L0)
Programmi eseguitidirettamente dal calcolatore (macchina reale)
Livello 0
M1 (L1)
Programmi tradotti in L0 in modo che possano essere eseguiti da M0
Livello 1
M2 (L2)
Programmi tradotti in L1 o in L0 in modo che possano essere eseguiti da M1 o da M0 Livello 2
Mn (Ln) ....
Programmi tradotti in uno dei linguaggio di livello inferiore in modo che possano essere eseguiti da una delle macchine di livello inferiore Livello n
Architettura degli elaboratori
Astrazione per realizzare l’indipendenza dalla macchina
Avendo costruito una macchina Mn che “capisce” il linguaggio Ln, dobbiamo disporre della capacità di tradurre Ln in Ln-1.
Possono esistere più macchine virtuali che mettono a disposizione dei linguaggi in grado di fungere da Ln-1.
Esempio: stesso S.O. su HW diversi, stessa applicazione su S.O. diversi, ecc.
La figura precedente ammette ramificazioni!
Architettura degli elaboratori
Relazione tra una macchina e il relativo linguaggio macchina
La macchina definisce il linguaggio.
Una macchina (reale o virtuale) permette di definire il linguaggio macchinaad essa associato come l’insieme di tutte le istruzioni che la macchina stessa è in grado di eseguire.
Il linguaggio definisce la macchina.
Un linguaggio permette di definire la macchina (reale o virtuale) ad esso associata come l’esecutore capace di comprendere tutti i programmi scritti in quel linguaggio.
Calcolatore a n livelli
Per scrivere i programmi per il livello n non è necessario conoscere come viene effettuata la traduzione e quindi l’esecuzione.
I programmi possono essere
eseguiti direttamente dalla macchina reale;
tradotti direttamente nel linguaggio L0;
interpretati da un interprete che viene a sua volta interpretato da un altro interprete ...;
...
La conoscenza dei livelli intermedi è importante per chi voglia capire come funziona un calcolatore (analisi);
come si progetta una macchina virtuale (sintesi).
Riassunto dei concetti visti (so far)
Analisi ⇐VS⇒Sintesi
(Riduzionismo ⇐VS⇒ Olismo) Livelli di Astrazione (gerarchia di) Architettura di Von Neumann
(dati+ programmiin memoria) Linguaggio
Sintassi ⇐VS⇒ Semantica
Istruzioni (o comandi) ⇐VS⇒Operazioni
Macchina (astratta) ↔ Linguaggio (di quella Macchina Astratta) Macchina (fisica) ↔ Linguaggio Macchina
Linguaggio ↔ Insieme delle Istruzioni («Instruction Set») Gerarchia di linguaggi
Alto livello ⇐VS⇒ Basso livello Compilazione ⇐VS⇒ Interpretazione
Architettura degli elaboratori