#1 – Introduzione ai Linguaggi di Programmazione


Linguaggi di Programmazione

Molti di voi avranno già sentito, magari diverse volte, il termine “linguaggio di programmazione”.

Come suggerisce la parola, si tratta di un linguaggio, scritto, che è espressione di precise regole. È un modo che abbiamo creato per comunicare con il computer e spiegargli cosa deve fare, e per questo motivo ovviamente è caratterizzato in modo molto più rigido di un linguaggio come lo intendiamo noi, adatto alla comunicazione umana. Anche il più piccolo errore di scrittura (che chiameremo errore di sintassi), non è tollerabile perché potrebbe portare a perdere il controllo sulle operazioni che va ad eseguire il nostro codice. Vedremo tuttavia che non ci sarà permesso generare programmi con errori di sintassi, in quanto ci saranno segnalati.

Ogni linguaggio di programmazione identifica un modo diverso di rivolgersi alla “macchina” e spiegargli cosa deve fare. Un lettore curioso potrebbe chiedersi come mai, allora, ne esistono tanti, e non uno solo.

In realtà scopriremo che per ogni tipologia di macchina, ne esiste uno solo che si nasconde dietro tutti. Per il momento, ci limitiamo ad osservare che ogni linguaggio di programmazione ha una potenza e una capacità espressiva diversa dagli altri.

Ci sono linguaggi di programmazione di basso livello e di alto livello. Al diminuire del livello, aumenta la difficoltà nello spiegare alla macchina come fare operazioni complesse, ma allo stesso tempo aumenta il controllo che abbiamo sulle risorse della macchina. Ciò significa che possiamo eseguire le stesse operazioni utilizzando ad esempio meno memoria, o fare operazioni che in un linguaggio “più alto” non sono possibili.

Risorse Arduino

Arduino possiede:

  • Un microcontrollore, ovvero un circuito integrato che esegue il nostro codice (il cervello di Arduino)
  • Pin di I/O analogici e digitali, attraverso i quali il microcontrollore può interfacciarsi con il mondo esterno
  • Tre tipologie di memoria. Una “Flash“, come quelle delle chiavette USB, dove viene salvato il nostro codice, una “SRAM“, dove il codice durante la sua esecuzione “lavora”, e una “EEPROM“, dove possiamo salvare informazioni che non verrano perse a seguito di uno spegnimento della scheda.

Linguaggio di programmazione su Arduino

Con Arduino, andremo ad imparare e utilizzare le basi di un linguaggio di programmazione basato su C/C++. Si tratta di due dei linguaggi di programmazione più famosi, con cui sono scritti tutti i principali sistemi operativi (Windows, Linux, …), proprio perché, specialmente C, permettono una ottima gestione di basso livello delle risorse. E con Arduino, come è sensato aspettarsi, le risorse sono molto più limitate rispetto a quelle di un normale computer.

D’ora in avanti, utilizzeremo nei nostri codici solo il linguaggio di programmazione di Arduino, anche se molte delle considerazioni che faremo possono essere facilmente estese alla maggioranza dei linguaggi.

Come funziona un “codice”?

Un codice è un semplice file di testo scritto seguendo le regole di un linguaggio di programmazione. Per capire “come scrivere cosa”, dobbiamo prima capire come quello che scriveremo verrà letto ed eseguito dal microcontrollore.

Immaginiamo un codice come un elenco di istruzioni (ad esempio i passaggi di una ricetta), scritte con il fine di ottenere uno specifico obiettivo (dopo averle eseguite).

Ogni istruzione, può essere:

  • Semplice, ovvero fare una delle operazioni elementari concesse nel nostro linguaggio. Ad esempio, sono semplici le operazioni di confronto (<,>,=,%), lettura e scrittura in SRAM, …
  • Composta, ovvero una “sottoricetta”. Ad esempio, se stiamo preparando una pasta al pesto, la ricetta conterrà (almeno) due sottoricette (prepara la pasta, prepara il pesto), ognuna con una sequenza di passi elementari per raggiungere il loro obiettivo.

Le variabili: cosa sono e come usarle

Ogni operazione, anche elementare, ha bisogno di operare su uno o più dati. Immaginiamo quindi le variabili come “contenitori” per i nostri dati. Queste scatole per dati devono avere una “etichetta” che dia informazioni chiare sul contenuto.

Le informazioni sull’etichetta, come vedremo nel dettaglio prossimamente, sono di due tipi. Anticipiamo già che la prima sarà legata al contenuto. Tra le tipologie di contenuti ammessi, troviamo (i principali):

  • Char, ovvero variabili che possono contenere solo un singolo carattere (‘a’, ‘b’, …)
  • Char[ ], ovvero un “array” (sequenza) di caratteri, chiamato stringa (lo vedremo nel dettaglio in un articolo successivo)
  • Int, ovvero numeri senza virgola compresi tra -32768 e 32767
  • Unsigned int, ovvero numeri senza virgola compresi tra 0 e 65535
  • Long, ovvero numeri senza virgola compresi tra  -2147483648 e 2147483647
  • Float, numeri con la virgola da 3.4028235E+38 a -3.4028235E+38
  • Bool, variabili che valgono 1 oppure 0

Potrebbero sorgere spontanee le seguenti domande:

  • Perché dovrei utilizzare una variabile di tipo char per memorizzare un carattere, invece di una char[]?
  • Perché non utilizzare sempre float, dato che i numeri senza virgola sono solo un “caso particolare” di quelli con la virgola?

Per capire meglio il motivo che si nasconde ad una così grande quantità di tipologie di variabili, andiamo al prossimo capitolo.