• Non ci sono risultati.

Astrazione e Macchine Virtualiparte 1: in generaleArchitetturadi Von Neumann

N/A
N/A
Protected

Academic year: 2021

Condividi "Astrazione e Macchine Virtualiparte 1: in generaleArchitetturadi Von Neumann"

Copied!
13
0
0

Testo completo

(1)

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

(2)

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).

(3)

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

(4)

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)

(5)

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)

(6)

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?

(7)

Architettura degli elaboratori

M

1

Come 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

0

J2 I2

I0 I1

Problema: chi decide che J2

si trasforma nella sequenza I2 I0I1?

Deve essere tutto automatico!

Architettura degli elaboratori

M

1

Come 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

0

Traduttore

--- ---

J2

--- --- ---

I2 I0 I1 ---

Programma scritto in L1

Programma equivalente scritto in L0

(8)

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

1

M

0

J2 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.

(9)

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

(10)

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.

(11)

Architettura degli elaboratori

Macchina a più livelli

M0 (L0)

Programmi eseguiti

direttamente 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!

(12)

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).

(13)

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

Riferimenti

Documenti correlati

Linguaggio macchina Le operazioni disponibili sono quelle direttamente fornite dall'hardware; ogni operazione è codificata da una sequenza di bit; ogni dato è indicato

Una volta descritti i tipi di requisiti richiesti dalle applicazioni di realt`a virtuale, ed i dispositivi di nuova generazione che possono essere utilizzati per il ritorno

Traduttore: genera il programma oggetto mediante la traduzione del programma sorgente da linguaggio simbolico a linguaggio macchina. compilatore: la traduzione è effettuata una

Traduttore: genera il programma oggetto mediante la traduzione del programma sorgente da linguaggio simbolico a linguaggio macchina. compilatore: la traduzione è effettuata una

Traduttore: genera il programma oggetto mediante la traduzione del programma sorgente da linguaggio simbolico a linguaggio macchina. compilatore: la traduzione è effettuata una

L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione.. Essa è fornita per scopi meramente didattici e non per essere utilizzata in

Si osservi che il sistema floating-point `e solo una delle scelte possibili, in quanto una volta si utilizzava un sistema a virgola fissa, ovvero con un numero fissato di cifre

Il condotto del latte della macchina da caffè deve essere pulito una volta alla settimana.. Un avviso sul display indica il