Lezioni: introduzione generale

Da Gambas-it.org - Wikipedia.

Gli elementi fondamentali e basilari di un calcolatore sono un microprocessore, per elaborare i dati, e la memoria, per immagazzinare i dati elaborati o da elaborare da parte del microprocessore.


La Memoria

La Memoria è il supporto che consente di conservare dati, informazioni nel tempo.

Dal punto di vista logico la memoria è una sorta di vettore di elementi individuati univocamente da un indice progressivo che ne rappresenta l'indirizzo. Tali elementi possono essere rappresentati plasticamente da celle di una griglia più grande, che è la memoria medesima.


Codificazione dei dati in memoria: i dati elementari come stati di tensione elettrica

I dati in memoria vengono salvati attraverso stati di tensione elettrica, così distinti:

  • tensione alta: Vhigh = 5v o 3,3v
  • tensione bassa: Vlow = 0v

In tal senso gli stati di tensione elettrica, appena visti, possono essere considerati i dati di informazione più basilari ed elementari nella tecnologia digitale informatica. Pertanto i dati vengono codificati sempre mediante "sequenze" di valori di tensione Vhigh o Vlow.
Esempio:

   5v    5v 5v       5v
__⌈¯¯⌊__⌈¯¯¯¯¯⌊_____⌈¯¯⌊
0v    0v       0v 0v

Rappresentazione degli stati di tensione elettrica nel sistema binario

Affinché sia umanamente più comprensibile soprattutto in fase di operazioni aritmetiche, tali valori di tensione vengono per convenzione rappresentati dalle due cifre binarie 0 e 1.

Ogni stato di tensione Vhigh o Vlow è chiamato bit. Pertanto la CPU e la memoria lavorano tramite sequenze di bit aventi stato 1 oppure 0.

Affinché la CPU possa effettuare le operazioni in aritmetica binaria, che è capace di compiere, deve ricevere gruppi di sequenze di bit, che per essa abbiano significato. Ogni gruppo di stati di tensione, bit, avente per la CPU un significato operativo (ad esempio un comando), è formato da 8 bit. La CPU infatti esegue solo istruzioni: ogni sequenza di bit (stati di tensione Vhigh o Vlow), che giunge alla CPU in qualità di istruzione, produce nel microprocessore una elaborazione di tali dati e conseguenzialmente delle azioni, che hanno effetti esterni alla CPU medesima.

Ugualmente anche ogni cella (indirizzo) di memoria potrà contenere, memorizzato, solo e sempre un insieme di 8 bit.

Ogni gruppo di 8 bit è chiamato Byte.

Riprendendo l'esempio, sopra esposto, di una sequenza di valori di tensioni elettriche, possiamo così rappresentarla in binario (sequenza di bit aventi stato 0 oppure stato 1):

  8 bit
01011001
 1 Byte

Il bit più a destra è ritenuto il bit meno significativo dell'ottetto, mentre il bit più a sinistra è considerato il bit più significativo.

Dalla rappresentazione binaria alla rappresentazione numerica

Per rendere ancor più comprensibile e semplificare la rappresentazione dei valori di tensione (per ora convertiti in rappresentazione binaria con bit posti a 0 o 1 a seconda della tensione elettrica rappresentata), si è convenzionalmente attribuito un numero a ciascun bit in ragione della sua posizione all'interno del Byte:

128 64 32 16 8 4 2 1

sommando tali valori dei bit si ottiene 255. Inoltre, va sottolineato che sulla base delle diverse combinazioni dello stato binario (0 e 1) che ogni bit può assumere, il Byte può assumere 256 valori diversi, come una sorta di gradiente partendo dallo 0 (ossia tutti i bit con stato a 0) sino a 255 (tutti i bit con stato a 1). Quindi lo stato dei bit di ogni byte può essere rappresentato attraverso un numero intero dato dalla somma dei numeri rappresentati da ogni bit avente stato posto a 1.
Esempio:

| 0 | 1| 0| 1|0|0|0|1|
|128|64|32|16|8|4|2|1|
      ⭭     ⭭       ⭭
      64 + 16   +   1  =  81

Il Byte (insieme di 8 bit), come sopra rappresentato in binario, può dunque essere ancor più agevolmente e brevemente rappresentato, anche ai fini dell'effettuazione di una eventuale operazione aritmetica, dal valore intero 81.
Ciò significa che, se affermiamo che un certo Byte ha valore 81 in rappresentazione numerica decimale, lo stato interno dei suoi bit è quello rappresentato nel precedente esempio, ossia: 01010001. Conseguentemente si disporrà così l'invio di una sequenza di valori di tensione elettrica: 0v-5v-0v-5v-0v-0v-0v-5v.

In vero convenzionalmente, per rappresentare un valore assunto da un Byte, si è preferito usare il sistema esadecimale, il quale può rappresentare numeri molto grandi mediante una quantità di cifre inferiore a quella richiesta dalla rappresentazione numerica decimale.


Dati monobyte e dati multibyte

I numeri, con cui il processore centrale è in grado di eseguire operazioni aritmetiche, sono rappresentati ovviamente da Byte di dati. Nei paragrafi precedenti abbiamo visto come - per semplificazione - ogni bit assume un valore numerico in base alla sua posizione nel byte, e abbiamo preso in considerazione un solo Byte, che però potrà - come sappiamo - rappresentare soltanto i numeri compresi nell'ambitus da 0 a 255 (per un totale di 256 numeri rappresentabili).
Se però dobbiamo effettuare calcoli con numeri superiori al numero 255, come si farà ? In questo caso si utilizzerà un Byte ulteriore, che si accoderà a sinistra del Byte avente i valori più bassi (ciòè da 0 a 255), e assumerà i valori esponenziali di 2 successivi al valore 128:

32768 16384 8192 4096 2048 1024 512 256

Pertanto il Byte, che rappresenta attraverso i sui bit i numeri più elevati, sarà definito più significativo, mentre il Byte, rappresentante i valori più bassi, sarà definito meno significativo.

Come è facilmente comprensibile, l'uso di due Byte, nelle diverse combinazioni degli stati binari che possono assumere i loro 8 + 8 bit, sono capaci di rappresentare numeri che compresi nell'ambitus da 0 a 32767 (per un totale di 32768 numeri rappresentabili)

Quando un valore può essere rappresentato esclusivamente da una quantità di Byte superiore a uno, possiamo parlare di valori multibyte, e per conseguenza di dati multibyte.

Rappresentazione dei numeri in memoria, numero di Byte utilizzati e consumo della memoria

Come è comprensibile, non è indifferente la circostanza di dover utilizzare uno o più Byte per rappresentare un valore numerico. Infatti l'utilizzo di un Byte significa dover occupare in memoria una cella (indirizzo).

La quetione si comprende meglio se si immagina di dover memorizzare un valore numerico inferiore a 256. Come sappiamo basterà usare (ossia: occupare) una sola cella di memoria, ma - volendo nulla ci vieta di richiedere al sistema di occupare due o più celle per poi - agli effetti della rappresentazione del numero da memorizzare - utilizzarne solo una. Facciamo l'esempio con l'occupazione di due Byte di memoria per memorizzare un numero rappresentabile semplicemente con un solo Byte:

 ⸐⸏⸏⸏⸏⸏⸏⸏⸏⸏⸑
 00000000  100101010
Byte più sig. Byte meno sig.

E' ampiamente evidente lo spreco di risorsa della memoria: a cosa può mai servire lì un secondo Byte (quello più segnificativo) con i bit posti tutti a 0 ? Si immagini la richiesta di occupazione/utilizzo di 4 Byte per un numero rappresentabile semplicemente con 1 Byte, quanto spreco di memoria comporterebbe !

Ordine dei Byte in memoria

Questi dati multibyte utilizzabili dal processore, per eseguire operazioni, ovviamente sono anche immagazzinabili in memoria, per poter essere eventualmente usati nel prosieguo del programma.
Si è già definito in precedenza il concetto di Byte più significativo e di Byte meno significativo, sarà possibile sia da parte del sistema che da parte del programmatore porre questi due Byte nel loro ordine naturale, ad esempio considerando il valore (in numerazione decimale) 123456 (in esadecimale: &h01E240 dovendosi usare ben tre Byte, per poter essere adeguatamente rappresentato):

01 E2 40  (come vedete, più agevolmente rappresentabile in numerazione esadecimale)

laddove il primo Byte, quello colorato in rosso, è il Byte più significativo (conferisce al numero i valori più elevati dei bit costituenti l'intero numero), mentre quello colorato in blu è il Byte meno significativo.

In tal caso, poiché appunto alla sinistra dell'intero velore, rappresentato dai tre Byte in numerazione esadecimale, è posto il Byte più significativo, l'ordine di memorizzazione è chiamato: " Big-Endian ".
Al contrario una memorizzazione con i Byte invertiti:

40 E2 40

La ordine in cui i singoli Byte di un dato multibyte sono memorizzati è chiamata " Endianess ".

Ai fini della gestibilità e della velocità di elaborazione l'ordine dei Byte è indifferente per la CPU.


Allocazione automatica a dimensione fissa e allocazione arbitraria a dimensione mobile della memoria

Si è già fatto cenno alla circostanza per cui la memoria può essere considerata visivamente come una sorta di griglia, composta di tante unità di memorizzazione, le celle di questa griglia, ognuna delle quali individuata da un "indirizzo" di memoria, e capace di ospitare, memorizzare un solo Byte (quindi solo 8 bit). Pertanto, se si deve memorizzare un valore, rappresentabile necessariamente da 2 Byte, bisognerà occupare (utilizzare) in sequenza 2 celle (indirizzi) di memoria. In tal caso si dice che saranno occupati 2 Byte di memoria.

Il sistema non scriverà i dati da memorizzare in qualsiasi cella (indirizzo) di memoria, poiché si richierebbe di sovrascrivere dati, precedentemente memorizzati, molto importanti. Esso si accerterà che tali celle (indirizzi) siano disponibili ad accogliere i dati da scrivere, quindi a memorizzare nuovi valori Byte.
Per garantire la persistenza del tempo dei dati memorizzati nelle celle di memoria, è necessario impedire - ovviemente - che essi possano essere sovrascritti successivamente da altri dati. Il sistema, dunque, "riserva", ovvero "alloca", in modalità sequenziale le celle (indirizzi) di memoria in quantità necessaria, oppure arbitrariamente ed esplicitamente imposta dal programma, per la scrittura dei Byte che rappresentano il valore numerico da memorizzare.

L'allocazione di una determinata quantità di celle (indirizzi o anche dette Byte) di memoria può essere in grandi linee suddivisa in due modalità:

  • allocazione automatica a dimensione fissa;
  • allocazione arbitraria a dimensione mobile.

Allocazione automatica a dimensione fissa: la Variabile

I linguaggi di programmazione sulla base delle caratteristiche e delle impostazioni harware e del sistema operativo, forniscono una tipologia di quantità "fisse" (non modificabile nel suo numero dal programmatore) e "prestabilite" di memoria allocata, nelle quali è possibile dunque scrivere ambiti di valori prastabiliti.
Tali quantità prestabilite e fisse di memoria allocabile sono altrimenti chiamate " Variabili ". [Nota 1]
Una Variabile rappresenta un'area, una porzione, ossia un numero di celle prestabilito e fisso, di memoria capace di immagazzinare un valore. Essa si riferisce e rappresenta l'indirizzo della prima cella di quell'area di memoria, ove possono essere memorizzati i Byte costituenti il valore da salvare. Una Variabile, dunque, è un indirizzo simbolico della memoria, e segnatamente nel caso di dati multiByte l'indirizzo della cella di memoria del Byte più a sinistra, ossia quello più significativo.
A livello di codice ogni Variabile è distinta dalle altre Variabili mediante il proprio Identificatore, che è in sostanza una sequenza alfanumerica che può contenere anche il simbolo del trattino in basso ( _ ).

Una Variabile automatica rappresenta l'indirizzo di memoria della cella di un'area di memoria riservata automaticamente dal sistema in base alla tipologia prevista. Tale Variabile su richiesta del codice del programma restituisce immediatamente il valore in essa contenuto, ossia memorizzato nell'area di memoria riservata alla quale la Variabile si riferisce, punta.

Tipologia in Gambas della quantità di memoria allocata automatica a dimensione fissa

La quantità prestabilita dal sistema e fissa delle celle (dunque la tipologia) di memoria scrivibile è la seguente: [Nota 2]



Note

[1] Sulle "Variabili" in Gambas vedere anche questa pagina della Wiki: Le Variabili.

[2] Sulla tipologia delle Variabili in Gambas vedere anche questa pagina web: Native datatypes



Pagina in costruzione !