Più un linguaggio di programmazione è ad alto livello è più esso permette la gestione di variabili molto capienti che esulano dall’architettura della macchina. A volte, infatti, un microcontrollore (MCU), dotato di registri utente a 8 bit, programmato in Assembler o in linguaggio macchina, gestisce solamente variabili di quella grandezza. La potenza di un linguaggio performante, invece, riesce a superare questo limite, consentendo l’utilizzo di variabili numeriche ben più grandi.
Alla data della scrittura del presente articolo, la MikroElektronika ha rilasciato la versione 7.1.0 del mikroBasic. Vediamo quali tipologie di dati numerici riesce a sopportare e qual è la loro occupazione in RAM, nella tabella sottostante:
Tipo | Dimensione | Intervallo |
---|---|---|
bit | 1-bit | 0 ÷ 1 |
sbit | 1-bit | 0 ÷ 1 |
byte, char | 8-bit | 0 255 |
short | 8-bit | -128 .. 127 |
word | 16-bit | 0 .. 65535 |
integer | 16-bit | -32768 .. 32767 |
longword | 32-bit | 0 .. 4294967295 |
longint | 32-bit | –2147483648 .. 2147483647 |
float, double | 32-bit | ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 |
Come si vede, quasi tutte le esigenze del programmatore sono coperte e sono previste variabili con o senza segno. Superando i limiti della MCU, possiamo dire che ad esempio, la variabile di tipo longword, utilizza una costruzione di tipo software, indipendente dall’architettura del microcontrollore utilizzato. Questo si traduce, ovviamente, in una lievitazione del codice eseguibile e di una relativa lentezza nella sua esecuzione. Ma lo scopo finale è brillantemente raggiunto, con pochi sacrifici dal punto di vista della programmazione.
La memoria delle MCU non è altrettanto vasta di quella dei PC. Per questo motivo, il programmatore deve cercare di risparmiare al massimo lo spazio occupato dai dati, un po’ come quando, agli inizi dell’era informatica, le risorse elettroniche erano ridotte ai minimi termini. Osserviamo adesso il seguente listato:
program MyProject
dim x as longword
dim y as longword
dim i as longword
main:
x=3
y=7
i=x+y
end.
Le operazioni aritmetiche svolte dal programma sono ridotte al minimo (solo una somma), ed è del tutto inutile riservare tanto spazio in memoria, e disturbare delle grosse locazioni. Meglio utilizzare il più adatto tipo byte. La figura sottostante mostra l’occupazione in RAM delle tre variabili, prima di tipo longword e poi di tipo byte.
Come si nota, cambiando semplicemente la tipologia della variabile utilizzata si riduce enormemente l’occupazione, con conseguente velocità e ottimizzazione nell’esecuzione. Ovviamente se il programmatore prevede che, nel corso della vita del suo firmware, un certo valore raggiunga limiti prestabiliti, magari di elevata consistenza, deve utilizzare, gioco forza, il massimo contenitore, anche se la reale capienza è utilizzata poche volte.
Anche la codifica in Assembler risulta differente, come si può evincere dalla figura sottostante.
Una attenta pianificazione delle variabili fa sempre la differenza ed essa costituisce, a tutti gli effetti, una delle più critiche fasi della programmazione.