Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate
Architettura degli elaboratori
Astrazione e Macchine Virtuali parte 1: in generale
Il concetto di astrazione
Astrazione = ignorare (nascondere) dettagli (anche rilevanti) per semplificare il problema
Utile (anzi necessario) per affrontare sistemi complessi per la loro analisie loro sintesi
Approccio riduzionista
tipico di 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 – …
Architettura di Von Neumann
Architettura degli elaboratori
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.
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 operazione
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
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 è praticamente impossibile
lungo, tedioso e passibile di errori anche banali.
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!
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.
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
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 VSSintesi
(Riduzionismo VS Olismo) Livelli di Astrazione (gerarchia di) Architettura di Von Neumann
(dati+ programmiin memoria) Linguaggio
Sintassi VS Semantica
Istruzioni (o comandi) VSOperazioni
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
Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate
Architettura degli elaboratori
Astrazione e Macchine Virtuali
parte 2: in un tipico calcolatore
Architettura degli elaboratori
I livelli nei moderni calcolatori
6. … Livello delle applicazioni specifiche 5. Livello dei linguaggi applicativi
4. Livello del linguaggio assemblatore 3. Livello del sistema operativo
2. Livello dell’Instruction Set (ISA) 1. Livello della microarchitettura 0. Livello logico
-1. ... Livello dei dispositivi ...
-2. ... (fisica dello stato solido) ...
Livello dei dispositivi
Transistor che formano i circuiti elettronici di cui è composto un calcolatore.
Raggiunge un livello di dettaglio che viene in genere trascurato nella progettazione dei calcolatori.
A un livello ancor più basso ci si occupa della fisica dello stato solido (es silicio drogato, come semiconduttore)
Architettura degli elaboratori
Livello 0: la logica digitale
La macchina è formata da porte logiche.
Ogni porta riceve in ingresso dei segnali binari (cioè segnali che possono essere 0 o 1) e calcola una semplice funzione (AND, OR, ...).
Alcune porte, collegate opportunamente, possono formare una memoria di un bit (bistabile).
Combinando N memorie di un bit si può formare un registro capace di memorizzare un numero binario (non più grande di 2N-1).
Combinando le porte si realizzano i circuiti che eseguono task come fare operazioni aritmetiche fra numeri
leggere dalla memoria etc
Livello 1: la microarchitettura
Livello 1 Microarchitettura
Livello 0 Logica digitale
Esecuzione
diretta
(Hardware)
Architettura degli elaboratori
Livello 1: la microarchitettura
Elaborazione – Data Path
registri general purpose come memoria locale;
Arithmetic Logic Unit (ALU) capace di eseguire semplici operazioni aritmetico-logiche;
Elementi di connessione tra registri e ALU.
Controllo
registri dedicati al controllo (PC, IR, ...);
Unità di controllo – Control Unit
che può microprogrammata o cablata.
Control Unit:
cablata o microprogrammata?
Control Unit Microprogrammata
il funzionamento del Data Path viene controllato da un programma chiamato microprogramma;
si tratta di un interprete delle istruzioni di livello 2;
era la soluzione più diffusa in passato, tanto che il termine µ- programmazione era a volte sinonimo di µ-architettura.
Control Unit Cablata
il funzionamento del Data Path viene controllato direttamente tramite dispositivi hardware;
la sequenza di operazioni associate alle istruzioni di livello 2 non viene generata da un interprete ma viene gestita direttamente via hardware.
Architettura degli elaboratori
Livello 2: Instruction Set Architecture
Livello 2 Instruction Set
Livello 1 Microarchitettura
Livello 0 Logica digitale
Interpretazione
(microprogramma)
esecuzione diretta o (hardware)
Livello 2: Instruction Set Architecture
Insieme delle istruzioni che possono essere comprese dalla µ-architettura (la µ-architettura agisce da interprete dell’Instruction Set).
È il livello cui si fa riferimento quando si descrive il “linguaggio macchina” di un calcolatore.
la sintassidi ciascuna di queste istruzioni è costituita da sequenze di 0 e 1 (codifica binaria)
Architettura degli elaboratori
Livello 3: il sistema operativo
Livello 3 Sistema operativo
Livello 1 Microarchitettura Livello 0 Logica digitale
Livello 2 Instruction Set
Interpretazione parzialeLivello 3: il sistema operativo
Il linguaggio di questo livello:
comprende molte istruzioni che si trovano già al livello 2;
comprende anche un insieme di istruzioni aggiuntive;
ha una diversa organizzazione della memoria;
esegue più programmi contemporaneamente.
La traduzione è ibrida
Le nuove funzionalità sono eseguite da un interprete che viene definito “Sistema operativo”.
Le istruzioni identiche a quelle del livello 2 vengono eseguite direttamente dalla microarchitettura.
Architettura degli elaboratori
Livelli bassi (1, 2, 3) vs livelli alti (4, 5)
I livelli bassi supportano il funzionamento dei compilatori e degli interpreti utilizzati ai livelli alti:
Livelli bassi programmazione di sistema Livelli alti programmazione di applicazioni Per migliorare le prestazioni:
i livelli 2 e 3 vengono sempre interpretati;
i livelli 4 e 5 vengono spesso compilati.
Per questioni di efficienza e di “usabilità”:
i linguaggi dei livelli 2 e 3 sono in codifica binaria;
i linguaggi dei livelli 4 e 5 sono testuali (simbolici) cioè composti da parole hanno un senso per l’uomo.
Livello 4: il linguaggio assemblatore
Livello 4 Linguaggio assemblatore
Livello 1 Microarchitettura Livello 0 Logica digitale Livello 2 Instruction Set Livello 3 Sistema operativo
Traduzione (assemblatore)
Architettura degli elaboratori
Livello 4: il linguaggio assemblatore
Rappresentazione simbolica di uno dei livelli sottostanti.
I linguaggi binari dei livelli “bassi” sono difficili da usare per un programmatore (... errori di “trascrizione” ...).
A ogni istruzione del linguaggio assemblatore corrisponde una istruzione del linguaggio macchina.
I programmi in linguaggio assemblatore vengono tradotti in un linguaggio di livello inferiore e poi eseguiti. Il programma che esegue la traduzione si chiama assemblatore.
Livello 5: i linguaggi applicativi
Livello 5 Linguaggi applicativi
Livello 1 Microarchitettura Livello 0 Logica digitale Livello 2 Instruction Set Livello 3 Sistema operativo
Livello 4 Linguaggio assemblatore Traduzione
(compilatore)
Architettura degli elaboratori
Livello 5: i linguaggi applicativi
Linguaggi di alto livello come C, C++, Java, Ada, LISP, Prolog, ...
Sono utilizzati per la realizzazione di programmi applicativi.
Il più delle volte la traduzione è affidata a un compilatore, mentre in alcuni casi si usa un interprete (e.g. Java)
I linguaggi ad alto livello non fanno parte degli scopi di questo corso.
Livello 6: le applicazioni
Livello 6 Applicazioni specifiche
Livello 1 Microarchitettura Livello 0 Logica digitale Livello 2 Instruction Set Livello 3 Sistema operativo Livello 4 Linguaggio assemblatore
Design e
sviluppo
Livello 5 Linguaggi applicativi
Architettura degli elaboratori
Livello 6 e oltre: applicazioni specifiche
Es:
adobe photoshop, microsoft word, microsoft powerpoint, libreoffice calc, google chorme, final cut pro,
blender, unity, etc, etc, etc
Spesso attraverso molti livelli intermedi:
librerie, SDK, drivers…
(niente di questo fa parte degli scopi di questo corso)
I livelli: uno schema riassuntivo
Livello 0 Logica digitale
Livello 2 Instruction Set
Interpretazione (microprogramma) o esecuzione diretta(hardware)
Livello 5 Linguaggi Applicativi
Traduzione (compilatore)
Livello 3 Sistema operativo
Interpretazione parziale (sistema operativo)
Livello 4 Linguaggio Assemblatore
Traduzione (assemblatore)
Livello 1 Microarchitettura
Esecuzione diretta (Hardware)
Architettura degli elaboratori
I livelli: sommario
I calcolatori sono progettati come una serie di livelli ognuno dei quali si basa sul livello precedente.
Ogni livello rappresenta una diversa astrazione con strutture dati e funzionalità diverse.
L’insieme di tipi di dati, operazioni e caratteristiche di ogni livello prende il nome di ARCHITETTURA.
La descrizione dell’architettura di un livello presenta l’insieme delle
caratteristiche visibili all’utente di quel livello (e.g. ad un programmatore di applicazioni interessa sapere quanta è la memoria disponibile)
I livelli: alcuni Principi generali
Livelli alti:
linguaggi potenti ed espressivi linguaggi più «vicini all’uomo»
sintassi delle istruzioni: intuitiva macchine virtuali
più cross platform (cross.browser, cross OS, …) Livelli bassi:
linguaggi dai comandi semplici linguaggi più «a misura di macchina»
pochi tipi di istruzione base
sintassi delle istruzioni: spesso non intuitiva (non è fatta per noi umani) semantica delle istruzioni: molto semplice
(quindi serviranno più istruzioni per fare le stesse cose) Livello più basso: esecutore hardware (macchina fisica)
Architettura degli elaboratori
Nota: Hardware vs. Software
Hardware: oggetti tangibili che compongono un calcolatore (circuiti elettronici, memoria, dispositivi di I/O, ...).
Software: programmi, indipendentemente dal supporto su cui sono memorizzati (HD, RAM, CD, ...).
Hardware e software sono logicamente equivalenti
qualsiasi operazione effettuata dal software può essere inglobata nell’hardware (“hardware = software pietrificato”);
qualsiasi istruzione eseguita dall’hardware può essere simulata dal software;
la decisione di realizzare una funzione in hardware o in software dipende da parametri quali il costo, la velocità, l’affidabilità, la frequenza di variazione, ...
perche’ ho voluto vedere un gatto che salta in una scatola e si ribalta Un processore x64 sta sfrecciando a miloni di cicli al secondo per eseguire il kerneL XNU, che gira freneticamente su tutti I livelli di astrazione specificati da Posix per creare il Darwin system su cui poggia os X, che a sua volta si spinge al limite per eseguire firefox e il suo renderer gecko, che crea un oggetto flAsh che visualizza dozzine di fotogrammi video al secondo
Nelle parole di un famoso web-comic…
https://xkcd.com/676/
sono dio