Abbiamo accennato anche cosa sono i riferimenti (o puntatori): variabili che invece di contenere il dato contengono l’indirizzo in cui trovare il dato.
Abbiamo però visto anche che le variabili conoscono anche il tipo di dato a cui si riferiscono o che contengono. Essi si riferiscono infatti all’insieme a cui appartiene il dato. Esempi di tipi sono gli interi, i caratteri, i booleani (vero o falso) e i float (numeri con virgola mobile).
Questo è l’ultimo argomento forte riguardante la memoria e lo affronteremo subito.
Bisogna far subito presente che in origine i tipi non esistono. I tipi sono strutture create dai linguaggi e come tali scompaiono a linguaggio macchina. Come abbiamo visto due lezioni fa, sono utilizzati principalmente per istruire il compilatore sulla dimensione del dato.
I linguaggi Assembly sono un ottimo esempio di linguaggi non tipizzati. In questo tipo di linguaggi infatti l’interpretazione del tipo di dato è lasciata al programmatore. L’assembly infatti macina solo gruppi di zero e di uno indipendentemente da cosa rappresentino.
Il resto dei linguaggi esistente fa parte dei linguaggi tipizzati. In questa categoria di linguaggi ad ogni variabile viene associato una annotazione di tipo. Esistono due aspetti con cui queste annotazioni vengono gestite ed ogni aspetto genera due sotto-categorie.
Il primo aspetto riguarda il controllo dei tipi (o type checking) ovvero il procedimento che permette di verificare se i vincoli imposti dai tipi sono soddisfatti. Questo controllo viene effettuato in fase di compilazione (static check) oppure in fase di esecuzione (dynamic check).
Da questo aspetto i linguaggi si dividono in strong typing (o fortemente tipizzati) e soft typing (o debolmente tipizzati).
I linguaggi strong typing sono caratterizzati da rigidi controlli sui tipi come:
- Static Check (per i linguaggi compilati);
- impossibilità di eseguire conversioni di tipo implicite;
- type safety, ovvero sicurezza riguardo ai tipi con controlli anche in fase di esecuzione.
I linguaggi soft typing invece contravvengono a queste tre regole e, al caso limite, si riducono a linguaggi non tipizzati.
Il secondo aspetto riguarda invece la vita della variabile. In poche parole riguarda la possibilità di una variabile di cambiare o meno tipo durante la sua esistenza.
Si dividono quindi in linguaggi a tipizzazione statica e linguaggi a tipizzazione dinamica.
Nei primi una variabile non può cambiare il suo tipo per nessun motivo. Esempi di questi linguaggi sono C/C++ e Java.
Nei secondi invece una variabile può, nel corso dell’esecuzione del programma, variare il tipo a cui appartiene. Linguaggi a tipizzazione dinamica sono fra i tanti Python, Fortran e Visual Basic.
Nella prossima lezione abbandoneremo la memoria e sfruttando le informazioni acquisita (in particolare il concetto di stack) parleremo nel dettaglio di funzioni e in particolare di iterazione e ricorsione.