INFORMATICA TEORIA
LE ISTRUZIONI
Per eseguire un’istruzione il processore deve estrarla dalla RAM e memorizzarla al proprio interno, in un
registro, che procede alla sua interpretazione. Ogni istruzione è costituita da un certo numero di bit, il cui
significato è il seguente:
- I primi bit consistono nell’opcode (codice operativo) che indica l’istruzione da eseguire, esso è
univoco per ogni istruzione;
- I restanti bit indicano il numero variabile di operandi.
Per ogni istruzione il processore esegue due fasi:
1. Fase di fetch: è la fase in cui l’istruzione viene prelevata dalla RAM, memorizzata in un registro del
processore e interpretata attraverso la decodifica del suo opcode; pertanto, questa fase consiste nel
capire di che tipo di istruzione si tratta ed è uguale per tutte le istruzioni;
2. Fase di execute: è la fase in cui viene eseguita l’istruzione precedentemente interpretata; questa fase
varia in base all’istruzione da eseguire.
Ad oggi i processori sono datati della PU (prefetching unite) che si occupa del prefetching delle istruzioni e
che consiste nell’eseguire la fase fetch prima che termini la fase execute dell’istruzione precedente. Quindi
mentre il processore è impegnato nella fase execute la PU si occupa della fase fetch delle istruzioni successive,
in questo modo quando il processore terminerà la fase execute dell’i-esima istruzione potrà dedicarsi alla
fase execute dell’istruzione successiva.
Le istruzioni, insieme alle costanti e alle variabili formano un algoritmo e rappresentano gli step da eseguire
della strategia. Le istruzioni possono essere:
- Istruzioni di inizio programma;
- Istruzioni di assegnazione (A = 0), esse hanno lo scopo di assegnare ad una variabile (posta a sinistra
del simbolo =) un valore determinato dall’espressione posta a sinistra dell’= (tale espressione può
essere un’altra variabile una costante o un’espressione algebrica;
- Istruzioni di input/output (es. inserimento di una variabile da parte dell’utente oppure visualizza
“ciao”;
- Istruzioni condizionali, esse consentono al processore di operare delle scelte sulla base della
veridicità o meno di una condizione;
- Istruzioni iterative, esse consentono al processore di eseguire più volte il “corpo del ciclo” in base al
verificarsi o meno di una condizione (es. “visualizza errore” if A=0);
- Istruzioni di fine programma.
LA TRADUZIONE DEI PROGRAMMI
Il programmatore formalizza le istruzioni scrivendole in un linguaggio simbolico detto linguaggio di
programmazione. Esistono due tipi di linguaggi di programmazione:
- Di alto livello - HLL (HIGHT LEVEL LANGUAGE): esso è compatibile con qualsiasi processore (quindi è
portabile);
- Di basso livello - LLL (LOW LEE LANGUAGE): esso è compatibile con un solo processore (quindi non è
portabile) un esempio è il linguaggio assembly (assembler è il traduttore);
I programmi per essere eseguiti devono essere tradotti dal linguaggio di programmazione al linguaggio
macchina. Il programma scritto dal programmatore e che deve essere tradotto prende il nome di codice (o
programma) sorgente. La traduzione, fatta dal traduttore (esso può tradurre un solo linguaggio di
programmazione), può essere svolta attraverso:
- La compilazione, in questo caso il traduttore prende il nome di compilatore; la compilazione del
codice sorgente da origine al programma eseguibile (es. primo.exe) che può essere generato da uno
o più codici sorgenti compilati; i programmi compilati sono mono piattaforma, eseguibili quindi su
una sola piattaforma (sistema operativo); la compilazione si divide in 2 fasi:
Nella prima fase il compilatore traduce il codice sorgente in linguaggio macchina generando
il programma oggetto (OBJ), questo programma non è eseguibile in quanto contiene sia
istruzioni che funzioni;
Nella seconda fase il programma oggetto viene dato al linker che unisce l’obj con le librerie
(DLL – dinamic library link) generando il programma eseguibile.
Esempio: COMPILA PRIMO.C → PRIMO.OBJ (OGGETTO)
LIKER FAI PRIMO.OBJ + LIBRERIA 1 + LIBRERIA 2 → PRIMO.EXE (ESEGUIBILE)
- l’interpretazione, in questo caso il traduttore prende il nome di interprete; in questo caso il
programma sorgente viene tradotto durante l’esecuzione (come nel caso della pagina web, il cui
interprete è il browser), pertanto è multipiattaforma (può essere eseguito su qualsiasi piattaforma).
ERRORI DEL SOFTWARE
- SINTATTICO: è un errore inerente alla sintattica del software (es. mancanza di…), questo errore
può essere presente solo nei programmi interpretati ed è un errore che non blocca l’esecuzione del
programma.
- SEMANTICO: è un errore inerente alla semantica del programma e si presenta quando non v’è
coerenza tra il tipo di variabile e il campo utilizzato per la stessa; come per l’errore sintattico, può
essere presente solo nei programmi interpretati e non blocca l’esecuzione del programma.
- LOGICO: è un errore che si presenta quando non è rispettata la logica del programma; quindi,
l’istruzione non genera il risultato atteso ed esatto; questo errore non può essere rilevato dal
traduttore, quindi, può essere presente sia nei programmi compilati che interpretati e non ne blocca
l’esecuzione
- RUN TIME: è un errore che si manifesta durante l’esecuzione del programma quando si tenta di
eseguire un’operazione che non può essere portata a termine; pertanto, blocca l’esecuzione del
programma; come quello logico non può essere rilevato da traduttore, quindi, può essere presente
sia nei programmi compilati che nei programmi interpretati;
- DI LOOP: è un errore che non comporta l’interruzione del programma ma che fa si che una o più
istruzioni contenute nel corpo del ciclo vengano eseguite all’infinito; come per l’errore logico e di
run time non è evidenziato dal traduttore, quindi, può essere presente sia nei programmi compilati
che interpretati.
La correzione di un errore attraverso la manutenzione correttiva rappresenta un costo per chi ha
acquistato u software se l’errore è presente in una funzione non specificata nell’analisi dei requisiti.
CARATTERISTICHE DEL SOFTWARE
Il software è la parte intangibile del computer. Esistono 2 tipologie di software:
- software di base: il sistema operativo che è il gestore di tutte le risorse (hardware e software);
proprio per questo è orizzontale;
- software applicativo: i programmi e le app che servono per svolgere delle funzioni (es. per scrivere
un testo si utilizza word).
Nello specifico il software consiste nella formalizzazione di un algoritmo (strategia da seguire per
risolvere un problema) attraverso un linguaggio di programmazione. Esso è composto dai seguenti
elementi:
- il codice del programma;
- l’analisi dei requisiti, che consiste nell’elenco delle funzioni che il software può svolgere;
- programmi di configurazione per l’impostazione iniziale;
- documentazione per l’utente;
- sito web che permette di scaricare gli aggiornamenti.
La prestazione di un software consiste nel tempo che impiega per raggiungere un obiettivo (es.
visualizzare un risultato). I software hanno prestazioni differenti e ovviamente il software compilato
è più veloce di quello interpretato.
La qualità di un software è misurata dalle seguenti caratteristiche:
- correttezza: un software è corretto quando non ci sono errori nelle funzioni specificate nell’analisi
dei requisiti; questa qualità del software è assoluta;
- affidabilità: un software è affidabile nella misura in cui un utente può fare o meno affidamento
sulle sue funzionalità; questa qualità del software è relativa perché dipende dalle funzioni che
l’utente utilizza (es. se l’utente non utilizza le funzioni che contengono errori lo riterrà affidabile
anche se il software non è corretto), pertanto un software corretto è sicuramente affidabile mentre
un software affidabile non è detto che sia corretto.
- robustezza: un software è robusto quando contiene delle funzioni aggiuntive rispetto quelle
specificate nell’analisi dei requisiti;
- efficienza: un software è efficiente quando ha delle buone prestazioni, queste variano a seconda
del peso che lo stesso ha sulle risorse che utilizza;
- usabilità: un software è usabile quando è semplice da utilizzare e per esserlo deve seguire delle
best practice (standard);
- accessibilità: un software è accessibile quando può essere utilizzato anche dalle persone affette
da stabilità; l’usabilità del software è disciplinata dalla legge 4/2004 (es. le immagini devono
contenere l’equivalente testuale per i non vedenti;
- mantenibilità: un software è mantenibile quando per effettuare la manutenzione si impiegano
poche risorse (intese come tempo e danaro), la manutenzione può essere:
*correttiva, quando serve per correggere degli errori presenti nel software ed è a carico della
software house se l’errore fa parte di una funzione specificata nell’analisi dei requisiti;
*evolutiva, quando serve per implementare ulteriori funzioni ed è sempre a carico del cliente;
*adattiva, quando serva a adattare il software a nuove disposizioni di legge e il costo dipende dal
contratto stipulato.
IL PROCESSORE - IL COMPUTER (SISTEMA CENTRALE E PERIFERICO)
1. il processore o CPU (acronimo di Central Processing Unit) o microprocessore;
2. la memoria centrale o RAM (acronimo di Random Access Memory);
3. i dispositivi di I/O (acronimo di Input/Output) o periferiche;
4. le memorie di massa;
5. i programmi.
1, 2, 3, 4 compongono l’hardware del computer, mentre il 5 il software.
Il computer può essere visto come un sistema costituito dai seguenti sottosistemi:
- il sottosistema centrale, costituito da:
processore: è il componente del computer che esegue i programmi (insieme di istruzioni e funzioni); un
programma per essere eseguito deve risiedere in memoria centrale in cui trovano posto due diverse entità,
i programmi e i dati su cui gli stessi programmi agiscono; il processore è composto da tre unità:
- ALU - unità aritmetico-logica (arithmetic and logic unit), essa ha il compito di eseguire tutti i calcoli
aritmetici e i controlli logici del tipo “minore di”, “uguale a”, ecc. I dati su cui vengono svolti i calcoli devono
essere preventivamente memorizzati nella memoria centrale del calcolatore.
- CU - unità di controllo (control unit), essa controlla il funzionamento del sottosistema centrale
permettendo la sincronizzazione tra le varie unità e controllando lo stato di avanzamento dell’esecuzione
di un programma in modo tale da sapere sempre quale sarà la prossima istruzione da eseguire.
- MU - unità di memoria (memory unit) ha il compito di interagire con la memoria centrale per prelevare,
da quest’ultima, le istruzioni e i dati e scriverci i risultati delle operazioni effettuate. Tutti i processori sono
dotati di registri, piccoli circuiti di memorizzazione che hanno la funzione di memorizzare dati e/o istruzioni.
I registri sono, dunque, delle memorie velocissime e piccolissime interne al processore. Ogni processore ha
un numero prefissato di registri di dimensione opportuna e con specifica funzione. Il numero e la grandezza
dei registri varia da processore a processore e ne vincola in modo sensibile le potenzialità.
Nel processore inoltre è integrata la MEMORIA CACHE (detta anche memoria cuscinetto) che viene
utilizzata dallo stesso processore per memorizzarci i dati che utilizza più spesso. Essa è posta tra CPU e RAM
e permette di migliorare le prestazioni della CPU diminuendone la degradazione (causata dalla differenza
di velocità tra la RAM e il