Sei sulla pagina 1di 10

martedì 6 novembre 2018

FONDAMENTI DI INFORMATICA:
Un’informazione per essere elaborata deve essere "codificata" in una rappresentazione
"comprensibile" all’elaboratore. Risultano quindi fondamentali i concetti di codifica e
codice. La codifica è l'insieme di convenzioni/regole per trasformare un'informazione in
una sua rappresentazione e viceversa (decodifica). Un codice permette la
rappresentazione dell'informazione ed è definito dai seguenti elementi. I simboli, che
sono gli elementi atomici della rappresentazione. L’alfabeto, che rappresenta l'insieme
dei simboli possibili, con cardinalità del codice si indica il numero di elementi
dell’alfabeto. Le parole codice o stringhe, che rappresentano sequenze ammissibili di
simboli, per lunghezza delle stringhe si intende poi il numero di simboli dell'alfabeto da
cui ciascuna parola codice è composta. Il linguaggio, che definisce le regole per
costruire parole codici che abbiano significato per l'utilizzatore del codice.

INFORMAZIONE E RAPPRESENTAZIONE:
Il termine "informazione" deriva da informare. In termini molto semplici, si può dire che
l'informazione è qualcosa che viene comunicato in una qualsiasi forma scritta o orale.
Nella Teoria dell'informazione l'informazione viene associata al concetto di messaggio,
anche se esso ha il solo compito di rappresentarla e trasportarla. Affinché persone o
macchine possano utilizzare un'informazione hanno bisogno che essa sia
appropriatamente "rappresentata" in una forma ad essi comprensibile (la scrittura
rappresenta un esempio di rappresentazione di informazioni). Una rappresentazione può
essere poi analogica se varia in analogia con la grandezza reale da rappresentare o
discreta se si utilizza un insieme "finito" di rappresentazioni distinte che vengono messe
in relazione con gli elementi dell'universo rappresentato.

LA RAPPRESENTAZIONE DIGITALE:
Nei calcolatori viene utilizzata la rappresentazione binaria basata su un alfabeto
costituito da due soli simboli distinti, che assumono convenzionalmente la forma di ‘0’ e
‘1’. Tali due simboli sono le unità minime di rappresentazione e memorizzazione digitale
e vengono denominati bit da “BInary digiT” (cifra binaria).

La rappresentazione discreta a lunghezza fissa basata sul codice binario è nota anche
col nome di rappresentazione digitale. Un elaboratore si basa sull'alfabeto binario in
quanto i supporti di memorizzazione delle informazioni, i registri di memoria, vengono
realizzati con componenti elementari semplici detti flip-flop, che operano in due soli stati
possibili (es. presenza o assenza di tensione elettrica sul relativo circuito). La
rappresentazione digitale è anche più affidabile, in quanto disturbi provenienti
dall'ambiente o interferenze (rumore) indotte da altri componenti difficilmente possono
far variare lo stato di un componente che memorizza i bit: adottando due soli stati si può
scegliere una separazione tra le corrispondenti grandezze indicative dello zero e
dell’uno, per cui il rumore, pur sommandosi, non produce significative alterazioni.

1
martedì 6 novembre 2018

Poiché i calcolatori trattano informazioni costituite da molti bit/byte sono state introdotte
le unità di misura binarie riportate.

La Figura di seguito riporta dei numeri in binario su un byte: il bit più a destra è quello
meno significativo (posizione o peso 0, lsb da least significant bit) mentre quello più a
sinistra è quello più significativo (posizione o peso 7, msb da most significant bit).

2
martedì 6 novembre 2018

IL MODELLO VON NEUMANN

Processori e processori:
L’algoritmo è la descrizione di un lavoro da svolgere: se si vuole usare un computer
bisogna non solo progettare un algoritmo, ma anche provvedere a comunicarglielo in
modo che gli risulti comprensibile. L’esecuzione di un algoritmo da parte di un esecutore
si traduce in una successione di azioni che vengono effettuate nel tempo. Si definisce
processo il lavoro svolto eseguendo l’algoritmo, e processore il suo esecutore. Il
computer è un tipo speciale di processore che evolve in automatico, ha un’alta velocità
elaborativa ed è capace di eseguire processi differenti.

Il modello di Von Neumann rappresenta lo schema


di riferimento dei moderni computer: in esso sono
evidenziate le sue componenti fondamentali.

La Central Processing Unit (CPU) coordina


l’esecuzione delle operazioni fondamentali di un
calcolatore;

La memoria contiene l’algoritmo che descrive le


operazioni da eseguire e i dati su cui l’algoritmo
stesso opera;

I dispositivi di input/output sono le interfacce della


CPU nei confronti del mondo esterno: sono,
rispettivamente, l’unità che consente l’inserimento
di algoritmo e dati in memoria (ad es. tastiera), e
quella che presenta i risultati dell’attività della CPU

3
martedì 6 novembre 2018
(ad es. monitor).

Esse formano l’hardware del computer, ossia l'insieme di tutti i componenti elettronici,
elettrici e meccanici che costituiscono un calcolatore. Il modello di Von Neumann si basa
sul concetto di “programma memorizzato”: la macchina immagazzina nella propria
memoria i dati su cui lavorare e le istruzioni per il suo funzionamento. Le caratteristiche
di un tale sistema sono: uno schema di funzionamento semplice nelle sue linee generali;
la velocità (di norma misurata in MIPS, milioni di istruzioni per secondo) e l’affidabilità
nella esecuzione degli algoritmi; una adeguata capacità di memoria ed un costo
vantaggioso.

La memoria:
La memoria di un calcolatore può essere vista come un insieme di contenitori di
informazioni, locazioni o registri, di dimensioni finite e fissate a cui si può far riferimento
mediante la posizione occupata nell’insieme, detta indirizzo di memoria. La dimensione
di un registro si misura in bit. I tipi di memoria che conosciamo sono i seguenti: tipo
elettronico, tipo magnetico, tipo ottico. Le componenti fondamentali di una memoria sono
dispositivi capaci di assumere due soli stati di funzionamento. In ogni caso, il dispositivo
di lettura deve essere in grado di associare allo stato della componente un bit di
informazione: il valore 1 o il valore 0. Memorie con registri di otto bit sono dette a byte o
caratteri; con più di otto vengono invece dette a voce. Il funzionamento della memoria è
semplice: la CPU indica l'indirizzo della locazione di memoria interessata
dall’operazione, la memoria "decodifica" tale indirizzo abilitando solo il registro ad esso
corrispondente.

La selezione di un registro viene detta: 1) casuale quando il tempo di accesso non


dipende dalla posizione e memorie di questo tipo vengono dette RAM (Random Access
Memory); 2) sequenziale quando invece il tempo di accesso dipende dalla posizione
come avviene nei nastri magnetici. Alcune memorie vengono realizzate in modo che sia
possibile una sola scrittura di informazioni: tali memorie vengono dette a "sola lettura" o
ROM (Read Only Memory). Le memorie si distinguono in base alla capacità di
conservare le informazioni: si dicono volatili le memorie (ad es. elettroniche) che
perdono le informazioni in esse registrate quando il sistema viene spento; sono, di
contro, permanenti gli altri tipi di memorie (ad es. memorie di tipo magnetico, ottico e
tutti i tipi di ROM).

Lo schema iniziale di Von Neumann è stato modificato per affiancare alla memoria
centrale delle unità di memoria ausiliarie caratterizzate da una elevata capacità e
persistenza, dette memorie di massa (es. dischi, USB flash memory, nastri, CD/DVD,
etc.). Le informazioni in memoria centrale possono essere direttamente prelevate dalla

4
martedì 6 novembre 2018
CPU, mentre quelle in memoria di massa devono essere dapprima trasferite nella
memoria centrale e successivamente elaborate; le informazioni prodotte dalla CPU,
viceversa, devono essere depositate in memoria centrale per poi essere conservate
nelle memorie di massa.

La CPU:
La CPU (Central Processing Unit) contiene i dispositivi elettronici in grado di acquisire,
interpretare ed eseguire il programma contenuto nella memoria centrale operando la
trasformazione dei dati. Essa è composta da tre parti fondamentali: l’Unità di Controllo o
Control Unit (CU), l’Unità Logico Aritmetica (ALU) e un insieme di registri (Figura 4), detti
"interni", che variano da processore a processore in funzione della sua architettura (es.
ad accumulatore, a registri generali, ecc.). Perché l’intero sistema possa avere avvio, la
CU deve essere informata dell’indirizzo del registro di memoria che contiene la prima
istruzione da eseguire. A partire da questa operazione iniziale, detta di bootstrap, la CU
esegue ininterrottamente l’algoritmo detto ciclo del processore fino allo spegnimento del
sistema.

Le tre fasi dell'algoritmo o ciclo del processore vengono anche dette fasi di fetch
(prelievo dell’istruzione dalla memoria centrale), operand assembly (decodifica
dell’istruzione con preparazione degli operandi) ed execute (esecuzione ed eventuale

5
martedì 6 novembre 2018
memorizzazione del risultato). Se la fase di execute
prevede la memorizzazione del risultato
dell’elaborazione in memoria centrale, la
corrispondente sottofase di scrittura prende anche il
nome di write back.

Durante le sue elaborazioni la CU può depositare


informazioni nei suoi registri interni, in quanto sono
più facilmente individuabili ed hanno tempi di
accesso inferiori a quelli dei registri della memoria
centrale. Il numero e tipo di tali registri varia, come
già anticipato, a seconda dell’architettura della
CPU.Quelli che si trovano in molte CPU sono
l’Instruction Register (IR) o Registro Istruzione (RI), il
Program Counter (PC) o Prossima Istruzione (PI),
l’Accumulatore (ACC) ed il Condition Code (CC).

BUS:
La CPU comunica con la memoria e tutti i dispositivi di input ed output tramite dei canali
di comunicazione detti bus. I bus collegano due unità alla volta, abilitandone una alla
trasmissione e l’altra alla ricezione: il trasferimento di informazioni avviene sotto il
controllo della CPU. Un bus è fisicamente costituito da uno o più fili su cui possono
transitare uno o più bit contemporaneamente che si distinguono in:

1)Bus dati (data bus): Il data bus permette ai dati di fluire dalla CPU verso un dato
registro di memoria selezionato - per operazioni di store - e viceversa dalla memoria ai
registri interni - per quelle di load. La CU controlla anche il flusso di informazioni con il
mondo esterno, abilitando il transito delle informazioni dalla memoria verso le risorse di
output e viceversa da quelle di input. 2)Bus indirizzi (address bus): L’address bus serve
alla CU per comunicare l’indirizzo del dispositivo interessato da una operazione di lettura
o scrittura (anche i dispositivi di I/O sono infatti identificati da un indirizzo). 3)Bus
comandi o bus di controllo (command bus o control bus): Il control bus serve alla CU per
indicare ai dispositivi cosa essi devono fare: segnali del control bus sono quelli di read e
write mediante i quali la CU indica ai dispositivi se devono leggere un dato dal data bus
(read) o scriverlo su di esso (write).

6
martedì 6 novembre 2018

I MICROPROCESSORI:
Un processore centrale (CPU) si compone
logicamente di: 1)una unità di controllo
(CU) capace di interpretare le istruzioni ad
esso rivolte, di svolgere le azioni richieste
e di interagire con l’ambiente esterno
attraverso i dispositivi di I/O; 2) una unità
logico aritmetica (ALU) per l’esecuzione
delle operazioni di tipo aritmetico e logico
(somma, prodotto e negazione logici); 3)
un insieme di registri interni.

L’architettura di Von Neumann viene detta


di tipo SISD (Single Instruction stream/
Single Data stream) in quanto le istruzioni
di un programma vengono eseguite una
dopo l’altra serialmente, con l’unità di
controllo che interpreta le singole istruzioni
generando comandi per tutti gli altri
dispositivi, e con l’unità di elaborazione
che esegue le operazioni di tipo aritmetico o logico. La disponibilità di registri interni
come propri organi di memoria per compiti speciali, e/o per contenere informazioni
temporanee, consente di ridurre i tempi di esecuzione delle istruzioni non solo perché si
riducono gli accessi alla memoria centrale ma anche perché i trasferimenti interni al
processore sono più veloci. Il programma e i dati sono contenuti in memoria ed una
singola istruzione viene eseguita mediante le già analizzate fasi del ciclo del processore.

ILLUSTRAZIONE DI UN PROGRAMMA:
La definizione della struttura dell’istruzione e dello schema di allocazione dei programmi
in memoria permettono di dettagliare le fasi dell'algoritmo o ciclo del processore. La fase
fetch inizia con il prelievo dell’istruzione dalla memoria. Per farlo la CU comunica alla
memoria il valore del puntatore ad istruzione presente nel registro PI. La risposta della
memoria viene depositata nel registro IR così da consentire alla CU di: 1)interpretare il
codice operativo dell’istruzione da eseguire; 2)conoscere i puntatori ai dati di input ed
output; 3) ricevere il puntatore all’istruzione da eseguire successivamente.

La fase fetch si conclude con l’aggiornamento del registro PI con il valore del puntatore
all’istruzione successiva presente in IR. La fase di operand assembly serve alla CU per

7
martedì 6 novembre 2018
predisporre gli operandi che servono al codice operativo. Per farlo, la CU usa i puntatori
ai dati contenuti nel registro IR. La fase execute consiste nel mettere in essere le azioni
richieste con il codice operativo presente nel registro di IR. Nel caso vengano prodotti
risultati, ne verrà effettuata la memorizzazione negli indirizzi specificati dai puntatori ai
dati di output presenti nel registro IR. Al termine dell’esecuzione di una istruzione la CU
riprende il suo cammino, partendo dal contenuto del registro PI. Le istruzioni del
programma vengono eseguite una dopo l’altra, indipendentemente dalla loro
disposizione in memoria. Una volta avviato, il ciclo del processore non termina mai e
quindi ad ogni istruzione deve sempre seguirne un’altra da eseguire successivamente.
Questo spiega perché quando termina un’applicazione un elaboratore torna ad eseguire
i programmi del sistema operativo, ovvero del software di base che permette la gestione
delle risorse di un calcolatore consentendone l’utilizzo all’utente finale.

CALCOLABILITA’ E TRATTABILITA’:
Mentre la calcolabilità, come abbiamo detto, studia se esista o meno un algoritmo in
grado di risolvere un problema, la trattabilità tiene in conto del tempo impiegato da un
algoritmo a terminare. La trattabilità è un aspetto ovviamente importante da un punto di
vista, per così dire, più pratico e più concreto. Il concetto di trattabilità è legato a quello
di complessità computazionale con la quale si studiano i costi intrinseci alla soluzione
dei problemi. La complessità consente di individuare i problemi risolvibili che siano
trattabili da un elaboratore con costi di risoluzione che crescano in modo ragionevole al
crescere della dimensione del problema. Tali problemi vengono detti trattabili. Inoltre, va
normalmente a studiare il comportamento dell’algoritmo in dipendenza dell’ingresso.
Questo perché il tempo impiegato da un algoritmo può essere diverso a seconda di
come è distribuito l’ingresso medesimo. I casi che si vanno a prendere in considerazione
sono di norma tre: 1) è il cosiddetto caso migliore o best case, che è il caso in cui
l’algoritmo, in corrispondenza di un determinato input, ci impiega il minimo tempo
possibile per terminare. 2) il caso medio o avarage case, questo spesso viene utilizzato
attraverso delle analisi di tipo probabilistico. 3) il caso peggiore o worst case, di norma è
quello che si va a considerare, perché se noi sappiamo che dal punto della complessità
cosiddetta temporale, l’algoritmo nel caso peggiore è sostanzialmente trattabile, e

8
martedì 6 novembre 2018
quindi, di norma, quello che si va a fare è considerare la complessità, studiare e quindi
definire la complessità nel cosiddetto caso peggiore.

AFFRONTARE UN ALGORITMO:
Quando si affronta un problema è di fondamentale importanza, qualunque sia
l’esecutore (uomo o macchina), capire preliminarmente se il problema ammette soluzioni
e successivamente, nel caso ne ammetta, individuare un algoritmo quanto più trattabile
possibile, ed, infine, esprimere tale algoritmo in un linguaggio comprensibile
all'esecutore a cui è rivolto. In un algoritmo (vedi Figura 4) vengono usati naturalmente
costrutti che fissano l’ordine in cui le diverse azioni devono essere svolte. Il più semplice
tra essi è quello che stabilisce che le azioni devono essere svolte una dopo l’altra. Si
chiameranno tali costrutti col nome di costrutti di sequenza. Altri costrutti possono però
stravolgere l’ordine sequenziale. Ad esempio, altri costrutti possono stabilire che solo
alcune azioni devono essere svolte solo se si verificano determinate condizioni. Si
chiameranno tali costrutti con il nome di costrutti di selezione. Infine, un ultimo costrutto
che può essere usato impone che alcune azioni devono essere ripetute un numero di
volte prestabilito. Si chiameranno tali costrutti con il nome di costrutti iterativi. In tutti gli
algoritmi si possono individuare quindi due classi fondamentali di frasi: 1)quelle che
prescrivono l’esecuzione di determinate operazioni; 2)quelle che indicano all'esecutore
l’ordine in cui tali operazioni devono essere eseguite. Alle prime si darà il nome di
istruzioni, mentre alle seconde quello di schemi di controllo, o istruzioni di controllo o
anche strutture di controllo.

9
martedì 6 novembre 2018
Nella soluzione di un problema la difficoltà maggiore consiste, allora, nell’individuare un
algoritmo e nel dimensionarlo alle capacità dell’esecutore. Tra l’altro l’uso di un
linguaggio per scrivere e comunicare algoritmi è tanto più difficile quanto minori sono le
capacità dell'esecutore a cui è rivolto. Si possono allora classificare le istruzioni anche in
funzione dello stretto legame esistente tra istruzioni e capacità dell’esecutore definendo:
1) elementari quelle istruzioni che l’esecutore è in grado di comprendere ed eseguire; 2)
non elementari quelle non note all’esecutore. Ovviamente perché un'istruzione non
elementare possa essere eseguita dall'esecutore a cui è rivolta, essa deve essere
specificata in termini più semplici. Il procedimento che trasforma una istruzione non
elementare in un insieme di istruzioni elementari, prende il nome di raffinamento o
specificazione dell’istruzione non elementare. L’individuazione e la descrizione di un
algoritmo deve avvenire per passi: prima lo si esprime usando il linguaggio naturale e
poi si continua con un procedimento di raffinamenti che procede fino a che tutte le
istruzioni non elementari contenute nell'algoritmo sono definite in termini di istruzioni
appartenenti al “repertorio” dell'esecutore.

10