"TECNICO SUPERIORE PER L'AUTOMAZIONE E IL PACKAGING" - ITS Maker
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
FONDAZIONE ISTITUTO TECNICO SUPERIORE MECCANICA, MECCATRONICA, MOTORISTICA E PACKAGING Sede di BOLOGNA “TECNICO SUPERIORE PER L’AUTOMAZIONE E IL PACKAGING” Rif.PA. 2017-7215/RER Biennio 2017/2019 Progetto 1 Edizione 1 Modulo: Basi di programmazione – Basi di informatica UF03 A cura di: Matteo Sartini In collaborazione con:
Che Cos’è L’informatica? ..?? Informatica (fusione delle parole informazione e automatica) è l’insieme delle discipline che studiano gli strumenti per l’elaborazione automatica dell’informazione e i metodi per un loro uso corretto ed efficace. L’informatica è la scienza della rappresentazione e dell’elaborazione dell’informazione: • L’accento sull’ “informazione” fornisce una spiegazione del perché l’informatica sia ormai parte integrante di molte attività umane: laddove deve essere gestita dell’informazione, l’informatica è un valido strumento di supporto; • Il termine “scienza” sottolinea il fatto che, nell’informatica, l’elaborazione dell’informazione avviene in maniera sistematica e rigorosa, e pertanto può essere automatizzata. L’informatica non è la scienza dei calcolatori elettronici: il calcolatore è lo strumento che la rende “operativa”.
L’elaboratore (computer, calcolatore) è un’apparecchiatura digitale, elettronica ed automatica capace di effettuare trasformazioni sui dati: • Digitale: perché i dati sono rappresentati mediante un alfabeto finito, costituito da cifre, digit, che ne permette il trattamento mediante regole matematiche • Elettronica: perché è realizzata tramite tecnologie di tipo elettronico • Automatica: perché è capace di eseguire una successione di operazioni senza interventi esterni. “La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.” (Isaac Asimov)
Il concetto di memoria La capacità dell’elaboratore di eseguire successioni di operazioni in modo automatico è determinata dalla presenza di un dispositivo di memoria: • Nella memoria sono registrati i dati e... • ...le operazioni da eseguire su di essi (nell’ordine secondo cui devono essere eseguite): il programma è la “ricetta” usata dall’elaboratore per svolgere il proprio compito Il programma viene interpretato dall’unità di controllo; tale architettura viene definita MODELLO DI VON NEUMAN
In sintesi possiamo affermare che: • Programma: è la sequenza di operazioni atte a predisporre l’elaboratore alla soluzione di una determinata classe di problemi. Il programma è la descrizione di un algoritmo in una forma comprensibile all’elaboratore • Algoritmo: è la sequenza finita di istruzioni attraverso le quali un operatore umano è capace di risolvere ogni problema di una data classe; non è direttamente eseguibile dall’elaboratore
L’elaboratore è una macchina universale: cambiando il programma residente in memoria è in grado di risolvere problemi di natura diversa (una classe di problemi per ogni programma). Pertanto l’Informatica è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, efficienza, elaborazione. E’ possibile svolgere concettualmente una attività di tipo informatico senza l’ausilio del calcolatore, per esempio nel progettare ed applicare regole precise per svolgere operazioni aritmetiche con carta e penna; l’elaboratore, tuttavia, è uno strumento di calcolo potente che permette la gestione di quantità di informazioni altrimenti intrattabili.
LA MEMORIA IN INFORMATICA: Nell’architettura di Von Neuman, che rappresenta l’astrazione dei calcolatori usualmente impiegati, abbiamo visto come la memoria sia impiegata per registrare i dati e le operazioni su di esse; in particolare possiamo considerare la memoria come un dispositivo di input e output dei dati e delle istruzioni del programma. Componenti architettura Von Neuman: • Memoria centrale • CPU - unità di elaborazione • Interfaccia verso periferiche • BUS
Sulla memoria di un computer, fondamentalmente possono essere effettuate le seguenti operazioni: • Inizializzazione. E’ il trattamento che subisce la memoria prima dell’uso. • Scrittura. E’ l’operazione di memorizzazione delle informazioni. • Lettura. E’ l’operazione di recupero delle informazioni memorizzate. Per parlare indifferentemente di lettura o di scrittura, si usa il termine accesso. Per esempio, per indicare che una memoria è veloce sia in lettura che in scrittura, si dice che ha un basso tempo di accesso. L'operazione di cancellazione dei dati in realtà non esiste in quanto più propriamente si può parlare di sovrascrittura dei dati. Nelle memorie di supporto alla CPU (registri, cache, RAM, ROM, ecc.) il tempo di accesso deve essere necessariamente basso per consentire alla memoria di lavorare alla velocità del processore ed evitare di rallentare la velocità di elaborazione. Il tempo di accesso è, invece, più alto ( minore velocità di accesso ) nelle memorie di massa ( disco fisso, memory card, memorie flash, floppy disk, dvd-rom, cd-rom, ecc. ).
MEMORIA PRIMARIA. La memoria primaria, chiamata anche memoria centrale o memoria principale, contiene dati ed istruzioni prelevati dalla memoria di massa in attesa che questi siano a loro volta prelevati ed elaborati dal microprocessore, lavorando dunque in maniera strettamente accoppiata con esso ed essendo dunque assimilabile ad una memoria di transito o appoggio. Molto spesso si tratta di memoria RAM e memoria cache e nelle moderne architetture dei processori è spesso incorporata nella scheda CPU o direttamente nel chip del processore stesso. È una parte importante del computer in quanto dalle sue dimensioni in termini di capacità di immagazzinamento dipende dunque la quantità massima di dati che possono essere prelevati e dunque elaborati dal processore. Qualora la memoria primaria venga esaurita molti sistemi di elaborazione moderni sono in grado di implementare il cosiddetto meccanismo della memoria virtuale come estensione provvisoria della memoria primaria.
Cosa è una memoria? Per realizzare una memoria principale vengono normalmente utilizzate tecnologie a semiconduttore (cioè vengono utilizzati circuiti integrati a base di silicio). Tale memoria è costituita da numerosissime celle di memoria capaci di assumere due stati stabili alternativi (zero o uno) attraverso i quali è possibile memorizzare la quantità minima di informazione (1 bit). Le operazioni che possono essere effettuate su questo componente sono due: lettura (load) e scrittura (store). Poiché nella realtà quotidiana le scelte possibili in vari casi sono molte più di due, un bit non è più sufficiente a rappresentarle e pertanto si è pensato di unire più celle di memoria in registri di memoria. In particolare, la dimensione del registro più diffusa è quella da 8 bit. L'unione di 8 bit forma infatti 1 byte di memoria, il primo multiplo del bit, il quale può rappresentare fino a 256 possibili combinazioni diverse (28). In un registro di memoria le operazioni di lettura/scrittura avvengono contemporaneamente su tutte le celle facenti parte del registro. In memorie con registri da 1 byte, quindi, vengono lette 8 celle alla volta. Ogni registro di memoria è denotato da un indirizzo.
Operazioni sulle memorie L’OPERAZIONE DI LETTURA Nell'operazione di lettura sulla memoria principale la CPU assume una posizione master rispetto alla memoria che è lo slave. I due componenti sono collegati tra loro dal bus di sistema. Il processo consiste essenzialmente nella seguente sequenza di operazioni: • La CPU trasferisce l'indirizzo del dato da leggere dal Program Counter (PC) al Memory Address Register (MAR); • Il MAR invia tale indirizzo alla memoria tramite la linea degli indirizzi del bus di sistema parallelamente al segnale che specifica il tipo di operazione che si sta effettuando (in questo caso, lettura); • La memoria preleva il dato contenuto nell'indirizzo specificato dalla CPU e lo invia, tramite la linea dei dati (presente anch'essa sul BUS di sistema), al Memory Data Register (MDR) della CPU. MAR, PC e MDR sono registri speciali dell'unità centrale della macchina.
Operazioni sulle memorie L’OPERAZIONE DI SCRITTURA La scrittura consiste principalmente nelle seguenti operazioni: • trasferimento dalla CPU al MAR l'indirizzo che si intende scrivere e contemporaneamente all'MDR il valore che si intende scrivere; • trasferimento del valore dell'MBR (Memory Byte Register) alla cella di memoria il cui indirizzo è presente nel MAR. La memoria centrale è organizzata come una tabella di celle, ciascuna delle quali è denotata da un indirizzo (celle che contengono una sequenza di bit; ogni bit può rappresentare l'informazione 0 oppure 1 tramite un diverso stato elettrico). Ogni cella ha una dimensione prefissata e gli indirizzi delle celle variano tra 0 e n, dove n è una potenza di 2. Bisogna distinguere tra vari tipi di memorie primarie, a seconda della funzione svolta e delle loro caratteristiche peculiari. Di seguito vengono elencate quelle più importanti. C'è da notare che a causa della dispersione della carica del condensatore, di capacità estremamente piccola, vi è bisogno di un rinfresco continuo dell'informazione. A questo compito è dedicato un canale del circuito di DMA (Direct Memory Access) che ad intervalli regolari (153 ms) deve necessariamente rinfrescare l'intera memoria del sistema per evitare la perdita irrimediabile dei dati e quindi il collasso di funzionamento del computer.
RAM Acronimo per "random access memory", ovvero "memoria ad accesso casuale", è la memoria in cui vengono caricati i dati che devono essere utilizzati dal calcolatore per elaborare. La RAM può essere volatile (si cancella spontaneamente ed ha bisogno di essere aggiornata), statica o tamponata (mantiene l'alimentazione anche a macchina spenta). Il processore identifica le celle della RAM tramite indirizzi preassegnati che ne specificano la posizione: la memoria si presenta, quindi, come un enorme vettore (stringa ordinata di elementi detti byte, ciascuno individuabile con un indirizzo). Il termine "random" evidenzia che non ci sono differenze ad accedere alle varie celle della memoria. Le caratteristiche della RAM vengono ereditate anche da tutte le altre memorie ad accesso casuale (individuabili facilmente dal fatto che contengono RAM alla fine). Sostanzialmente le memorie RAM si suddividono in DRAM (dinamiche), SRAM (statiche) che vengono utilizzate per la memoria cache
CACHE RAM Memoria associativa integrata nel processore che ha la caratteristica di essere molto veloce; dato l'elevato costo, viene utilizzata esclusivamente per contenere i dati e le istruzioni utilizzati più di frequente (in modo da migliorare notevolmente le prestazioni del processore). La fase di trasferimento da memoria di sistema a memoria cache viene attuata da un apposito circuito che prende il nome di MMU (Memory Management Unit). La MMU svolge anche il compito di gestione virtuale della memoria.
ROM Acronimo per "read only memory", ovvero "memoria in sola lettura (o solamente leggibile)", è una memoria permanente (cioè ha un contenuto fisso che non può essere cancellato ed inoltre non è volatile), presente sulla scheda madre, che contiene le istruzioni che la CPU deve caricare per consentire l'avvio del sistema e le routine di base che prendono il nome di BIOS (Basic I/O System).
EPROM Acronimo per "erasable programmable read only memory", ovvero "ROM cancellabile e programmabile", che è una memoria in sola lettura, ma ha la particolarità di poter essere cancellata in particolari condizioni. Le EPROM si cancellano tramite l'esposizione ai raggi UV, mentre le EEPROM "electrically erasable programmable read only memory" si cancellano tramite un impulso elettrico.
MRAM Acronimo per "magnetoresistive ram", ovvero "RAM magnetoresistiva", è una memoria ad accesso casuale di "nuova generazione", che utilizza le proprietà del magnetismo, al posto di una serie di impulsi elettrici, per conservare le informazioni.
MEMORIA SECONDRIA La memoria secondaria, chiamata anche memoria ausiliaria o memoria di massa, è un'unità che si aggiunge alla memoria primaria (o centrale) dell'elaboratore per accrescerne le capacità di memorizzazione. Consiste in una classe di dispositivi che non sono posti a diretto contatto con il processore. Di conseguenza i dati in essi contenuti non vengono persi una volta spento il processore stesso.
Algebra di Boole – Cenni Storici - In matematica e logica matematica l'algebra di Boole è il ramo dell'algebra in cui le variabili (contenitore di dati situato in una porzione di memoria) possono assumere solamente i valori vero e falso (valori di verità), generalmente denotati come 1 e 0 rispettivamente. Le operazioni fondamentali non sono addizione e sottrazione ma gli operatori logici: la congiunzione o prodotto logico indicata con ∧ oppure AND ; la disgiunzione o somma logica indicata con ∨ oppure OR; la negazione o complementazione indicata con ▬ oppure NOT.
Con tale formalismo si possono descrivere le relazioni logiche in modo simile a quanto fa l'algebra ordinaria con le relazioni numeriche: la combinazione di AND, OR e NOT permette di sviluppare qualsiasi funzione booleana e i tre operatori logici formano pertanto un insieme funzionalmente completo. Riassumendo: • Contempla due costanti 0 e 1 (falso e vero) che corrispondono a due stati che si escludono a vicenda; • Possono descrivere lo stato di apertura o chiusura di un generico contatto o di un circuito a più contatti; • Sui valori booleani si definiscono le operazioni AND, OR, NOT. Nella valutazione delle espressioni booleane esiste una relazione di precedenza fra gli operatori NOT, AND e OR, nell’ordine in cui sono stati elencati. Gli operatori dell’algebra boolena possono essere rappresentati in vari modi: • Spesso son descritti semplicemente come AND, OR e NOT; • Nella descrizione dei circuiti appaiono sotto forma di porte logiche; • In matematica si usano + per OR e x per AND, mentre si rappresenta il NOT con una barra posta sopra l’espressione negata.
Il valore della somma logica (OR) è pari a 1 se almeno uno degli operandi è uguale a 1.
Il valore del prodotto logico (AND) è pari a 1 se tutti gli operandi sono ugual1 a 1.
Il valore della negazione (NOT) inverte il valore della costante su cui opera.
VARIABILI BINARIE: Una variabile binaria indipendente può assumere uno dei due valori 0 e 1. Date n variabili binarie indipendenti, la loro somma logica (OR) è :
Date n variabili binarie indipendenti, il loro prodotto logico (AND) è : La negazione di una variabile x è : L’elemento x = NOT(x x) viene detto complemento di x ; il complemento è unico.
L’algebra di Boole è dotata di proprietà matematiche elencate di seguito. Per gli operatori AND e OR valgono: OR AND ASSOCIATIVA : x1+x x2+x x3 = x1+(x x2+x x1) x1xx x2xx x3 = x1x(x x2xx x1) DISTRIBUTIVA : x1+(x x2xx x3) = (x x1+x x2)x(x x1+x x3) x1x(x x2+x x3) = (x x1xx x2)+(x x1xx x3) IDEMPOTENZA : x+x x=x xxx x=x MINIMO E MASSIMO : x+1 = 1 xx0 = 0 Per l’operatore NOT valgono: COMPLEMENTO : x+x x=1 xxx x=0 x =x x
SISTEMI DI NUMERAZIONE POSIZIONALI. Un sistema di numerazione posizionale è definito da una successione di moltiplicatori (b1, b2, b3,….) che corrispondono al rapporto tra il valore che una cifra assume in una data posizione e quello che assume nella posizione successiva. In formula si può scrivere (limitandosi per semplicità a un numero di quattro cifre): c4 c3 c2 c1 = c4 x (b3 x b2 x b1) + c3 x (b2 x b1) + c2 x b1 + c1 Quando i moltiplicatori sono tutti uguali questa formula si riduce a: c4 c3 c2 c1 = c4 x b3 + c3 x b2 + c2 x b + c1 Il numero b si dice base del sistema di numerazione. Il sistema più comunemente usato oggi al modo è quello in base 10 : SISTEMA NUMERICO DECIMALE. 3456 = 3 x 103 + 4 x 102 + 5 x 101 + 6 x 100 = 3000 + 400 + 50 + 6
I sistemi di numerazione posizionali necessitano della cifra zero per segnare i posti "vuoti". Ad esempio il numero 505 (5 centinaia, 0 decine, 5 unità) va scritto con uno zero nella posizione delle decine: se non si mettesse lo zero, sarebbe il numero 55 (5 decine, 5 unità) . Nei sistemi non posizionali invece non si usa lo zero perché l'uso di simboli diversi per unità, decine, centinaia eccetera lo rende non necessario: in numeri romani 505 si scrive DV e non si può confondere con 55 che si scrive LV. Nel campo dell'informatica, con l'avvento dei calcolatori digitali, si usano spesso sistemi di numerazione posizionale in basi che sono potenze di 2: b=2: sistema numerico binario b=8: sistema numerico ottale b=16: sistema numerico esadecimale
INTERVALLO DI RAPPRESENTAZIONE I metodi per rappresentare i numeri sono molteplici, diversi e basati su concetti differenti. Per rappresentare un numero si usa una sequenza di cifre definita numerale. Il numerale che rappresenta un certo numero lo usiamo concretamente per comunicare quel numero o eseguirci dei calcoli. Il numero 12 (numerale) può essere rappresentato: • 12 usando il sistema decimale (posizionale); • XII usando le cifre romane (additivo); • 1010 usando il sistema binario (posizionale a cifre binarie 0 e 1 e numerale di quattro cifre); Con n cifre in base B vengono rappresentati tutti i numeri interi positivi da 0 a Bn-1 (Bn numeri distinti). ESEMPIO 1: BASE 10 ; 2 CIFRE ESEMPIO 2: BASE 2 ; 2 CIFRE
IL SISTEMA BINARIO Il sistema numerico binario è un sistema numerico posizionale in base 2. Esso utilizza solo due simboli, di solito indicati con 0 e 1 (* bit), invece delle dieci cifre utilizzate dal sistema numerico decimale. Ciascuno dei numeri espressi nel sistema numerico binario è definito "numero binario". In informatica il sistema binario è utilizzato per la rappresentazione interna dell'informazione dalla quasi totalità degli elaboratori elettronici, in quanto le caratteristiche fisiche dei circuiti digitali rendono molto conveniente la gestione di due soli valori, rappresentati fisicamente da due diversi livelli di tensione elettrica. Tali valori assumono convenzionalmente il significato numerico di 0 e 1 o quelli di vero e falso della logica booleana * dall'inglese binary digit
Un byte è un insieme di 8 bit, (numerale a 8 cifre) b7b6b5b4b3b2b1b0 Con un byte si rappresentano i numeri interi fra 0 e 28−1 = 255 00000000 00000001 00000010 00000011 …………… 28 = 256 valori distinti 11111110 11111111 È l’elemento base (byte) con cui si rappresentano i dati nei calcolatori. Si utilizzano sempre dimensioni multiple (di potenze del 2) del byte : 2 byte (16 bit), 4 byte (32 bit), 8 byte (64 bit), 16 byte (128 bit), ecc.
CONVERTIRE NUMERI DA SISTEMA DECIMALE A SISTEMA BINARIO (numero intero): Si divide ripetutamente il numero intero decimale per 2 fino ad ottenere un quoziente nullo; le cifre del numero binario sono i resti delle divisioni. La cifra più significativa è l’ultimo resto. ESEMPIO: Convertire in binario il numero (88)10 88 : 2 = 44 resto 0 44 : 2 = 22 resto 0 22 : 2 = 11 resto 0 11 : 2 = 5 resto 1 5 : 2 = 2 resto 1 2 : 2 = 1 resto 0 1 : 2 = 0 resto 1 1011000 (88)10 = (1011000)2
CONVERTIRE NUMERI DA SISTEMA DECIMALE A SISTEMA BINARIO (numero razionale): Si moltiplica ripetutamente il numero frazionario decimale per 2 fino ad ottenere una parte decimale nulla o, dato che la condizione potrebbe non verificarsi mai, per un numero prefissato di volte; le cifre del numero binario sono le parti intere dei prodotti successivi. La cifra più significativa è il risultato della prima moltiplicazione. ESEMPIO: Convertire in binario il numero (0,21875)10 0,21875 x 2 = 0,437 resto 0 0,4375 x 2 = 5 resto 0 0,875 x 2 = 0,875 resto 1 0,75 x 2 = 1,75 resto 1 0,5 x 2 = 1,50 resto 1 1 0,00111 (0,21875)10 = (0,00111)2
CONVERTIRE NUMERI DA SISTEMA BINARIO A SISTEMA DECIMALE: Oltre all’espansione esplicita in potenze del 2 (forma polinomia) si può operare raddoppiando il bit più significativo e lo si aggiunge al secondo bit; si raddoppia la somma e si aggiunge al terzo bit e così via fino al bit meno significativo. ESEMPIO: Convertire in decimale il numero (1011000)2 (1011000)2 = 1x26 + 0x25 + 1x24 + 1x23 + 0x22 + 0x01 + 0x00 = 64 + 0 + 16 + 8 + 0 + 0 = (88)10 1 x 2 = 2 somma 0 2 x 2 = 4 somma 1 5 x 2 = 10 somma 1 11 x 2 = 22 somma 0 22 x 2 = 44 somma 0 44 x 2 = 88 somma 0 (1011000)2 = (88)10
SISTEMA ESADECIMALE: Il sistema numerico esadecimale (spesso abbreviato come esa o hex) è un sistema numerico posizionale in base 16, cioè che utilizza 16 simboli invece dei 10 del sistema numerico decimale tradizionale. Per l'esadecimale si usano in genere simboli da 0 a 9 per le prime dieci cifre, e poi le lettere da A a F per le successive sei cifre, per un totale di 16 simboli. DECIMALE ESADECIMALE BINARIO 0 0 0000 1 1 0001 2 2 0010 3 3 0011 4 4 0100 5 5 0101 6 6 0110 7 7 0111 8 8 1000 9 9 1001 10 A 1010 11 B 1011 12 C 1100 13 D 1101 14 E 1110 15 F 1111
Il sistema esadecimale è molto usato in informatica, per la sua relazione diretta tra una cifra esadecimale e quattro cifre binarie. È spesso usato come intermediario, oppure come sistema numerico a sé stante. Per esempio, è possibile esprimere un byte con esattamente due cifre esadecimali (invece che con tre decimali). È interessante, infatti, notare come ogni cifra esadecimale corrisponda a un nibble, cioè a un numero binario di quattro cifre. ESEMPIO: Convertire in decimale ed in binario il numero (3A2F)16 (3A2F)16 = 3x163 + 0x25 + 10x162 + 2x161 + 15x160 = 3x4096 + 10x256 + 2x16 + 15 x 1 = (14985)10 (3A2F)2 = (0011 1010 0010 1111)2 DA NOTARE: • 160 = 1 (la base elevata a 0 è sempre uguale a 1); • La conversione da sistema hex a sistema bin e viceversa può essere svolta per sostituzione di gruppi di cifre invece che con algoritmi di divisione; • È possibile esprimere il byte (8 bit) con due cifre esadecimali (invece che con tre decimali); • Per denotare un numero esadecimale esistono diversi metodi, dipendenti fondamentalmente dai linguaggi di programmazione: 16#3A2F – 0x3A2F - $3A2F3 - &h3A2F – 3A2F16 . (255)10 = (1111 1111)2 = (FF)16
RAPPRESENTAZIONE DEI DATI E ARITMETICA DEGLI ELABORATORI. I Numeri Interi Positivi sono rappresentati all’interno dell’elaboratore utilizzando un multiplo del byte (generalmente 8 byte); qualora l’intero dovesse essere rappresentato con un numero di cifre minore, vengono aggiunti zeri nelle cifre più significative (1210 viene rappresentato in byte come 00001100). Per rappresentare numeri con segno occorre utilizzare un bit per definire il segno del numero: si possono usare tre tecniche di codifica: Modulo e segno; Complemento a 2; Complemento a 1.
MODULO E SEGNO: Il bit più significativo rappresenta il segno: 0 per i numeri positivi e 1 per i numeri negativi. Da notare che esiste uno zero positivo (00….0) e uno zero negativo (10….0). Se si utilizzano n bit si rappresentano tutti i numeri compresi fra –(2 n-1 -1) e 2n-1 -1. Con 4 bit si rappresenta –(2 4-1 -1) e 24-1 -1 -(8-1) e (8-1) -7 e 7 . +0 0 000 -0 1 000 +1 0 001 -1 1 001 +2 0 010 -2 1 010 +3 0 011 -3 1 011 +4 0 100 -4 1 100 +5 0 101 -5 1 101 +6 0 110 -6 1 110 +7 0 111 -7 1 111
COMPLEMENTO A DUE: Il bit più significativo del numero ha peso negativo o positivo; da questo deriva che tutti i numeri che cominciano con un "1" sono numeri binari negativi, mentre tutti i numeri che cominciano con uno "0" sono numeri binari positivi. Se si utilizzano n bit si rappresentano tutti i numeri compresi fra –2n-1 e 2n-1 - 1. Con 4 bit si rappresenta –(2 4-1 ) e 24-1 -1 -(8) e (8-1) -8 e 7 . +0 0 000 -1 1 111 +1 0 001 -2 1 110 +2 0 010 -3 1 101 +3 0 011 -4 1 100 +4 0 100 -5 1 011 +5 0 101 -6 1 010 +6 0 110 -7 1 001 +7 0 111 -8 1 000 E’ il metodo più diffuso per la rappresentazione dei numeri con segno in informatica. Questo metodo consente di avere un'unica rappresentazione dello zero (quando tutti i bit sono zero, eliminando così la ridondanza dello zero che si verifica con la rappresentazione in modulo e segno).
OPERAZIONI CON I NUMERI BINARI. I numeri binari possono essere messi in relazione tramite operazioni aritmetiche, con regole simili a quelle del sistema decimale. Le quattro operazioni aritmetiche eseguibili sono: addizione, sottrazione, moltiplicazione e divisione. Per rendere possibili le operazioni aritmetiche e l'elaborazione dei segnali digitali è necessario esprimere i numeri binari tenendo conto del loro segno.
ADDIZIONE : L'addizione fra due o più numeri binari è analoga a quella riferita ai numeri decimali. La regola applicata in questo caso è la seguente: 0 + 0 = 0 + 0 + 1 = 1 + 1 0 = 1 1 1 = 0 Con riporto di 1 alla colonna verso sinistra Quando si ha un riporto si aggiunge 1 sulla colonna di sinistra (quella più significativa) e si procede rispettando la regola della somma.
SOTTRAZIONE : La sottrazione fra due o più numeri binari è analoga a quella riferita ai numeri decimali. La regola applicata in questo caso è la seguente: 0 - 0 = 0 0 - 1 = 1 Con prestito di 1 alla colonna di sinistra 1 - 0 = 1 1 - 1 = 0 Quando si ha un prestito si sottrae 1 dalla colonna di sinistra (quella più significativa) e si procede rispettando la regola della differenza. Se sulla colonna di sinistra non si può concedere il prestito perché la cifra è 0, esso si trascina alla colonna successiva verso sinistra finché non si restituisce il prestito.
MOLTIPLICAZIONE : La regola del prodotto binario segue esattamente quella della moltiplicazione di due numeri decimali. Infatti si ha: 0 x 0 = 0 x 0 x 1 = 0 x 1 0 = 0 1 1 = 1
DIVISIONE : L'operazione della divisione rispetta la regola: D=Qxd+R (dove D è il dividendo, d il divisore, Q è il quoziente ed R è il resto). Per eseguire una divisione si può procedere tramite il metodo tradizionale in cui si procede per sottrazioni successive tra il dividendo D e il divisore d fino a che il risultato diventi inferiore al divisore. Il risultato finale rappresenta il resto R mentre il numero di sottrazioni rappresenta il quoziente Q. 110111 101 101 1010 111 101 100
RAPPRESENTAZIONE DEI NUMERI. I computer possono utilizzare due sistemi per rappresentare i numeri reali (che, ricordiamo, sono i numeri interi e i numeri con decimali): virgola fissa e virgola mobile. La rappresentazione a virgola fissa è molto semplice: un certo numero di byte verrà utilizzato per rappresentare la parte intera (e il segno), sappiamo che dopo questo numero di byte ci sarà il punto decimale (la virgola), segue quindi un altro numero di byte per rappresentare la parte decimale. Possiamo esprimere una codifica in virgola fissa come I.D I numero intero che esprime la parte intera, D numero intero che esprime la parte decimale. Stabiliamo noi, a priori, di quanti byte possono essere le due parti. In questi termini si capisce perchè la “virgola è fissa” : si trova sempre nella stessa posizione.
Il termine numero in virgola mobile (in inglese floating point) indica il metodo di rappresentazione approssimata dei numeri reali e di elaborazione dei dati usati dai processori per compiere operazioni matematiche. In informatica viene usata solitamente in base 2 e in questo caso può essere considerata l'analogo binario della notazione scientifica in base 10. L'uso di operazioni aritmetiche in virgola mobile è oggi il metodo più diffuso per la gestione di numeri reali e della loro approssimazione razionale nella memoria dei computer. La rappresentazione in virgola mobile è la seguente (secondo la normativa IEEE 754): n = - 1s x M x 2 (E-127) In questa formula S è il Segno (che determina se il numero è negativo o positivo), M è la Mantissa, che esprime la parte decimale del numero, il 2 rappresenta la Base ed infine tutto il valore (E-127) è l’Esponente (il valore -127 si chiama Bias e serve per esprimere valori negativi, vedete che quando E vale meno del bias, l’esponente è negativo ⇒ viene fuori un numero minore di 1)
La struttura di un numero in virgola mobile, secondo lo standard IEEE viene rappresentata su parole di 32, 64 o 128 bit divisi in tre parti: • un bit di segno S; • un campo di esponente E; • un campo di mantissa M Gli n bit di una stringa sono indicizzati in modo decrescente con numeri interi da 0 a n-1. In un numero in questo standard, l'importanza del bit decresce col suo indice 1 8 23 Lunghezza in bit Rappresentazione di un numero in una stringa di 32 bit 31 30 22 0 Indice dei bit 1 11 52 Lunghezza in bit Rappresentazione di un numero in una stringa di 64 bit 63 62 51 0 Indice dei bit 1 15 112 Lunghezza in bit Rappresentazione di un numero in una stringa di 128 bit 127 126 111 0 Indice dei bit
La rappresentazione a 32 bit è detta precisione singola, quella a 64 bit è detta precisione doppia mentre quella a 128 bit viene chiamata precisione quadrupla. Proviamo a codificare il numero – 118,5 nel sistema IEEE 754 in precisione singola (32 bit). Avremmo: Il primo passo è determinare il segno, l’esponente e la mantissa. Poiché è un numero negativo il primo bit è pari a 1, poi scriviamo il numero in forma binaria (118,5 = 1110110,1) spostando la virgola verso sinistra (1110110,1 = 1, 1101101 x 26). La mantissa è la parte destra della virgola riempita con zeri a destra fino a riempire i 23 bit. L’esponente è pari a 6, ma dobbiamo convertirlo in forma binaria ed adattarlo allo standard. Per la precisione singola dobbiamo aggiungere 127 e trasformarlo in forma binaria (127+6=133=10000101). Assembliamo il tutto 1 8 23 Lunghezza in bit - 118, 5 = 3 30 22 0 Indice dei bit 1
CONCETTI BASE DELLA PROGRAMMAZIONE La programmazione, in informatica, è l'insieme delle attività e tecniche che una o più persone specializzate, programmatori o sviluppatori (developer), svolgono per creare un programma, ossia un software da far eseguire ad un computer, scrivendo il relativo codice sorgente in un determinato linguaggio di programmazione. Con l'avvento dell'ingegneria del software l'attività di programmazione rappresenta solo la fase implementativa dell'intero ciclo di sviluppo del software con l'obiettivo ultimo di soddisfare le specifiche funzionali richieste dal committente secondo una predefinita analisi di strutturazione. Con fondamenti di programmazione si indicano le conoscenze basilari che un programmatore deve possedere per la programmazione in un qualunque linguaggio di programmazione.
Per la scrittura di righe di codice nei linguaggi di programmazione è sufficiente per un programmatore utilizzare un normale elaboratore testi, o un programma ad hoc detto editor spesso compreso all'interno di un ambiente di sviluppo integrato (IDE). Nel secondo caso il software individua automaticamente gli errori più banali (es. errori di sintassi) che un programmatore può commettere. I passi con cui si sviluppa un programma efficiente sono simili tra di loro per quasi tutti i contesti di programmazione (aziende, hobby, lavoro, ecc.). Le prime fasi sono strettamente legate alla logica di quello che si va a creare e del suo funzionamento, mentre le ultime sono orientate verso lo specifico linguaggio di programmazione che si intende utilizzare.
La prima operazione da svolgere per la creazione di un qualunque programma è definire nel modo più preciso ed accurato possibile quale problema intendiamo risolvere. Questo vale sia per una semplice funzione matematica che per un complesso database. L'input che il programma riceve è legato all'output che intendiamo restituire dopo l'elaborazione. Questa fase può presentare una grande complessità dovuta al lavoro astratto che impone al programmatore di immaginare il risultato finale e la sua formalizzazione.
È importante precisare che la lista di passi deve contenere istruzioni chiare, precise e non ambigue, ovvero il cui significato non dipenda dal contesto in cui lo si scrive, ma sia chiaramente identificabile. I programmi informatici risultano essere molto più articolati di un processo lineare come l'addizione di due numeri. Per dare al programma una struttura più complessa si utilizzano i seguenti strumenti: • Le diramazioni consistono nel fornire al codice delle funzioni che possono cambiare lo svolgimento dell'algoritmo a seconda del risultato della condizione espressa. • I cicli sono sequenze di istruzioni eseguite ripetutamente fin quando non viene soddisfatta una determinata condizione. Ogni ripetizione è detta iterazione.
Paradigma di programmazione. E’ uno stile fondamentale di programmazione, ovvero un insieme di strumenti concettuali forniti da un linguaggio di programmazione per la stesura del codice sorgente di un programma, definendo dunque il modo in cui il programmatore concepisce e percepisce il programma stesso. Diversi paradigmi si differenziano per i concetti e le astrazioni usate per rappresentare gli elementi di un programma (come ad esempio le funzioni, gli oggetti, le variabili, vincoli, ecc.) e per i procedimenti usati per l'esecuzione delle procedure di elaborazione dei dati (assegnazione, calcolo, iterazione, ecc).
I linguaggi di programmazione sono molti e si distinguono principalmente in due categorie: interpretati e compilati. I linguaggi interpretati più diffusi sono: •JavaScript, Java, Python, BASIC, script di shell, script in uso su Internet (Jscript, VBScript, Batch...); I linguaggi compilati più famosi sono: •C, C++ (linguaggio orientato agli oggetti derivato dal C), Pascal (solitamente usato a scopo didattico). Il codice di un programma interpretato viene salvato così com'è, e viene poi letto da un interprete, che è un programma che gira sul sistema operativo in uso. I linguaggi di programmazione compilati richiedono invece che il codice, una volta terminato, sia processato da un compilatore che, convertendolo in linguaggio macchina, ne permetta l'esecuzione da parte della CPU.
PRO E CONTRO. I linguaggi interpretati sono più lenti ma più facili da creare e girano su molti sistemi operativi, a patto di avere lo stesso interprete, e che il dialetto del linguaggio sia comune. Un programma interpretato, in esecuzione, richiede più memoria ed è meno veloce, a causa dell'overhead introdotto dall'interprete stesso. Durante l'esecuzione, l'interprete deve infatti analizzare le istruzioni a partire dal livello sintattico, identificare le azioni da eseguire (eventualmente trasformando i nomi simbolici delle variabili coinvolte nei corrispondenti indirizzi di memoria), ed eseguirle. I linguaggi compilati, molto spesso, hanno invece degli standard ISO, o comunque regole universali, le quali permettono di compilare un programma senza modifiche su più architetture hardware. Le istruzioni del codice compilato, già in linguaggio macchina, vengono caricate e istantaneamente eseguite dal processore.
BUG E DEBUGGING. Completato il programma è frequente la presenza di errori di programmazione derivanti da ragioni varie che possono evidenziarsi durante lo sviluppo e l'esecuzione di un codice. Questi errori possono essere essenzialmente in tre principali categorie: errori di sintassi, errori di logica ed errori di runtime. Tutti questi errori vanno necessariamente eliminati pena il malfunzionamento o il blocco dell'esecuzione del programma stesso.
ERRORI DI SINTASSI. Sono gli errori che si commettono nella fase di scrittura del programma nel linguaggio scelto. Sono In genere errori di ortografia nella scrittura del codice o nella sintassi delle istruzioni. Gli errori di sintassi impediscono la compilazione del programma da parte del compilatore che quindi tipicamente segnalerà la presenza dell'errore.
ERRORI DI LOGICA (SEMANTICA). Sono gli errori che si commettono nella fase di progettazione dell'algoritmo: possono essere causati da una mancata comprensione del problema da calcolare o dei vincoli che i dati in input devono rispettare, o ancora nella valutazione del test dell'algoritmo. Questi errori conducono tipicamente alla progettazione di un algoritmo che non fornisce l'output richiesto nell'ambito di una o più istanze del problema da risolvere. Sono difficili da individuare e spesso si deve ricorrere al debugging.
ERRORI DI RUNTIME Sono errori che possono verificarsi nella fase di esecuzione del programma, anche se l'algoritmo è corretto e il codice viene compilato correttamente. Spesso sono relativi all'utilizzo della memoria da parte del programma stesso, che tenta ad esempio di scrivere ad una locazione di memoria alla quale non ha accesso. Questi errori si verificano principalmente nell'utilizzo dei puntatori.
La verifica e la messa a punto del programma ha lo scopo di ricercare e correggere gli errori riscontrati. Si tratta di una fase molto lunga ed importante in cui il programmatore verifica la bontà del proprio lavoro. La correzione di un bug potrebbe essere causa di nuovi errori ed occorre quindi prestare la massima attenzione.
TIPI DI DATO Un tipo di dato è un nome che indica l'insieme di valori che una variabile, o il risultato di un'espressione, possono assumere e le operazioni che su tali valori si possono effettuare. Dire per esempio che la variabile X è di tipo "numero intero" significa affermare che X può assumere come valori solo numeri interi (appartenenti ad un certo intervallo) e che su tali valori sono ammesse solo certe operazioni (ad esempio le operazioni aritmetiche elementari). Ogni linguaggio di programmazione consente di usare, in modo più o meno esplicito, un certo numero di tipi di dati predefiniti di uso generale, e di solito fornisce strumenti per definire nuovi tipi sulla base delle necessità specifiche. Può anche accadere che sia utile o necessario "tradurre" una variabile di un certo tipo in una variabile di un altro tipo (l'operazione è detta type casting): alcuni linguaggi mettono a disposizione costrutti sintattici per questo scopo, ma in altri casi è necessario scrivere una funzione che associ i valori di un tipo a quelli dell'altro
Esempio tipi di dato
BOOLEANI (BOOL). Il tipo booleano ha due soli valori: true ("vero") e false ("falso"). Essi vengono utilizzati in modo speciale nelle espressioni condizionali per controllare il flusso di esecuzione e possono essere manipolati con gli operatori booleani AND, OR, NOT e così via. Anche se in teoria basterebbe un solo bit per memorizzare un valore booleano, per motivi di efficienza si usa in genere un'intera parola di memoria, come per i numeri interi "piccoli" (una parola di memoria a 8 bit, per esempio, può memorizzare numeri da 0 a 255, ma il tipo booleano utilizza solo i valori 0 e 1). A : bool ; B : bool ; C : bool := false; A := B AND NOT C;
NUMERI. I tipi di dati numerici includono i numeri interi e i numeri razionali in virgola mobile, che sono astrazioni dei corrispondenti insiemi di numeri della matematica. Quasi tutti i linguaggi includono tipi di dati numerici come tipi predefiniti e forniscono un certo numero di operatori aritmetici e di confronto su di essi. A differenza degli insiemi numerici della matematica, i tipi di dati numerici sono spesso limitati (includono cioè un massimo e un minimo numero rappresentabile), dovendo essere contenuti in una singola parola (word) di memoria. A : INT ; B : REAL ; C :LREAL; D :UINT; ecc. ecc.
CARATTERI E STRINGHE. Il tipo carattere contiene un carattere, generalmente ASCII, memorizzato in un byte. Tuttavia in questi anni si sta affermando il nuovo standard Unicode per i caratteri, che prevede 16 bit (che generalmente corrisponde a una parola di memoria) per la rappresentazione di un singolo carattere. Molti linguaggi tradizionali si sono adattati a questo standard emergente introducendo, in aggiunta al tipo "carattere a 8 bit", un nuovo tipo "carattere a 16 bit", talvolta detto wide char. Le stringhe sono sequenze di caratteri di lunghezza finita. I linguaggi possono fornire operazioni per la concatenazione di stringhe, la selezione di sottostringhe di una stringa data, ecc.
ENUMERAZIONI. Sono insiemi finiti di identificatori, generalmente specificati dal programmatore. Una variabile di tipo "Color" potrà in tal caso assumere solo i valori "RED", "GREEN" e "BLUE". Rispetto alle tecniche tradizionali per gestire analoghi generi di dati, che prevedevano semplicemente di adottare una convenzione numerica implicita (per esempio scrivo "1" per intendere "rosso", "2" per intendere "verde" e così via), i tipi enumerati forniscono una maggiore leggibilità e una migliore astrazione sui dati. enum color {RED, GREEN, BLUE};
ARRAY. Sono insiemi finiti di identificatori, generalmente specificati dal programmatore. Un array o vettore indica una struttura dati complessa, statica e omogenea. Gli array, presenti praticamente in tutti i linguaggi di programmazione, sono ispirati alla nozione matematica di vettore (quando monodimensionali) o di matrice (nel caso di array bidimensionali). L'array è in genere classificato come un costruttore di tipo: in altre parole, esso consente di definire nuovi tipi di dati a partire da tipi preesistenti, attraverso l'aggregazione di diversi oggetti tutti di uno stesso tipo. Ciascun oggetto componente è individuato attraverso un indice intero, nel caso monodimensionale, o attraverso D indici interi nel caso D- dimensionale. Si può immaginare un array come una sorta di contenitore, le cui caselle sono dette celle (o elementi) dell'array stesso. Ciascuna delle celle si comporta come una variabile tradizionale; tutte le celle sono variabili di uno stesso tipo preesistente, detto tipo base dell'array. Si parlerà perciò di tipi come "array di interi", "array di stringhe", "array di caratteri" e così via. Quello che si ottiene dichiarandolo è dunque un contenitore statico ed omogeneo di valori, variabili o oggetti. In alcuni linguaggi, la dimensione dell'array (ovvero il numero celle di cui esso è composto) viene considerato parte della definizione del tipo array. Ciascuna delle celle dell'array è identificata da un valore di indice. L'indice è generalmente numerico e i valori che gli indici possono assumere sono numeri interi contigui che partono da 0 o da 1 o, più raramente, da un valore arbitrario. Si potrà quindi parlare della cella di indice 0, di indice 1, e, in generale, di indice N, dove N è un intero compreso fra 0 (o 1) e il valore massimo per gli indici dell'array. Int Vettore[10]; /* definisce la variabile di nome Vettore come array di 10 elementi interi*/ Vettore [0] = 0; /*assegna il valore 0 alla cella di indice 0*/ Vettore [1] = 0; …….ecc OPPURE Vettore : Array[0..9] of INT; //definisce la variabile di nome Vettore come array di 10 elementi interi
CONCETTO DI VARIABILE. Una variabile è un contenitore di dati situato in una porzione di memoria (una o più locazioni di memoria) destinata a contenere valori, suscettibili di modifica nel corso dell'esecuzione di un programma. Una variabile è caratterizzata da un nome (inteso solitamente come una sequenza di caratteri e cifre). Nei linguaggi compilati, le variabili devono essere definite ovvero dichiarate in maniera tipizzata prima di essere adoperate. La dichiarazione consente di raggiungere due fondamentali obiettivi: da un lato, con la dichiarazione tipizzata si specifica il tipo della variabile, cosicché il compilatore è in grado di verificare eventuali errori semantici presenti all'interno di un programma sintatticamente corretto (ad esempio, non è consentito moltiplicare tra loro una variabile stringa ed una variabile intera). Dall'altro, viene valutata e definita la quantità di memoria destinata, in fase di esecuzione, a contenere i dati a cui la variabile si riferisce. Le operazioni basilari che possono essere compiute su una variabile sono la lettura del valore in essa contenuto e la scrittura di un nuovo valore, o assegnamento. Il primo assegnamento della variabile è detto inizializzazione. Molti linguaggi richiedono o preferiscono che la variabile una volta dichiarata venga anche inizializzata a un valore arbitrario.
CONCETTO DI COSTANTE. Una costante è un dato non modificabile situato in una porzione di memoria (una o più locazioni di memoria) destinata a contenere un valore, che non può essere appunto modificato nel corso dell'esecuzione di un programma. Una costante può essere caratterizzata da un nome (inteso solitamente come una sequenza di caratteri e cifre). Nei linguaggi tipizzati, ciascuna variabile è caratterizzata da un tipo di dato, che specifica come deve essere considerato il dato rappresentato, e possibilmente restringe i valori accettabili. Ad esempio, una variabile destinata a contenere il numero progressivo di un mese di una data, potrà assumere solo i valori interi da 1 a 12. L'insieme delle variabili esistenti a tempo di esecuzione è contenuto all'interno dell'ambiente
VISIBILITA’ DI UNA VARIABILE Il contesto in cui una variabile viene dichiarata all'interno di un programma determina la sua visibilità. Col termine variabili globali vengono generalmente indicate quelle variabili dichiarate al di fuori di un sottoblocco di programma e che sono visibili in uno o più sottoblocchi. Le variabili locali sono quelle definite all'interno di un sottoblocco, ad esempio all'interno di una funzione, e quindi visibili solo internamente al sottoblocco stesso.
Puoi anche leggere