Nella prima puntata del corso abbiamo fatto conoscenza con il Raspberry Pi, un computer a tutti gli effetti, dotato anche di porte di I/O. In questo articolo inizieremo a parlare del linguaggio C, a conoscere il compilatore GCC e a produrre i nostri primi programmi. Il tutto con uno spirito didattico, semplice e chiaro per tutti. Gli esempi rispetteranno un ordine di difficoltà sempre crescente, in modo da risultare del tutto indolore ai lettori.
Introduzione
Qualsiasi firmware o software, a prescindere dalla sua tipologia, richiede per la sua creazione una buona conoscenza di un linguaggio di programmazione. In questo articolo inizieremo a prendere confidenza con il compilatore presente nella distribuzione Raspian Jessie, il GCC, e a creare i nostri primi utili programmi. Non utilizzeremo ancora la porta GPIO e il software creato svolgerà solo mansioni di calcolo ed esecuzione, senza connessione alcuna alle porte di I/O.
Come si crea un programma
Il PC, incluso il nostro Raspberry Pi, "parla" esclusivamente una lingua composta da tanti "0" e "1", ossia il linguaggio binario. A meno che si intenda produrre il software direttamente in linguaggio macchina (esempio di programma: 110011101110100010101...), che risulterebbe tremendamente astruso, complicato e incomprensibile, occorre utilizzare altri mezzi. Quello sicuramente più utilizzato e più diffuso è il seguente:
- Si scrive il programma, come sequenza di istruzioni, diciamo il lingua inglese, sotto forma di listato sorgente;
- Si dà tale listato in pasto ad un compilatore che, dopo il controllo di validità, produce il programma eseguibile.
Vista così, in effetti, la procedura sembra abbastanza facile ma, come si vedrà in seguito, la creazione di un software costituisce una vera e propria arte.
Il listato sorgente
Il sorgente è generalmente un file di testo, visualizzabile e comprensibile, composto da parole chiave. Raccoglie tutte le istruzioni logiche per raggiungere lo scopo finale. E' una raccolta di piani e di strategie per trovare risultati o perseguire obiettivi. Di seguito proponiamo una sorta di software, rappresentato tramite uno pseudo-codice, il cui tema è il semaforo e l'automobile. I passi che deve rispettare l'automobilista sono i seguenti:
- All'incrocio osserva il semaforo.
- Se è spento, prosegui con molta prudenza.
- Se è rosso:
- Fermati e aspetta.
- Se è verde:
- Prosegui con prudenza.
- Se ci sono pedoni sulla strada:
- Fermati e falli passare.
- Se è giallo:
- Rallenta e ti fermi all'incrocio.
- Ritorna al punto 1 iniziale.
Tale metodo di risoluzione del problema è definito algoritmo. Il software deve essere scritto, ovviamente, con un opportuno linguaggio di programmazione. Il mondo informatico offre, letteralmente, migliaia e migliaia di soluzioni e alternative, semplici o complicati. Alcuni di essi sono dedicati alla matematica, altri all'intelligenza artificiale, e così via. In assoluto i linguaggi più utilizzati e conosciuti sono:
- Il linguaggio C;
- Il linguaggio Basic;
- Il linguaggio Pascal.
Man mano si vanno ad aggiungere alcuni linguaggi potenti, alternativi e semplici al tempo stesso. Per chi volesse conoscere l'elenco dei linguaggi, in questo link è presente una lista, nemmeno completa, dei più famosi.
Il linguaggio C
E' un linguaggio di programmazione estremamente potente e veloce. Lo supera, in velocità, solo il linguaggio macchina. Il suo utilizzo è molto semplice e un programma, a volte, sembra una sorta di discorso umano (alto livello). La sua struttura permette, però, di accedere direttamente alle componenti interne del PC, consentendo al programmatore di scrutarne e modificarne i comportamenti più intimi e nascosti (basso livello).
E' talmente potente che con esso vengono realizzati anche i Sistemi Operativi. La sua caratteristica più importante è la portabilità. Un codice sorgente scritto, ad esempio in Windows, può "girare" senza problemi anche su Linux. A questo risultato si è arrivati dopo anni di dispute [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3047 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Ottima impostazione per testo, contenuti e figure. Seguirò anche i prossimi articoli. Buon lavoro!
Molto molto interessante! Chiaro, preciso e molto comprensibile!
Molto interessante e didattico,
Solo un piccolo appunto. Perché creare una directory come root e compilare come root quando si può creare una cartella nella propria home e lanciare la compilazione da utente comune?
Nel caso dell’esempio “hello world” ci sono due errori di battitura (corretti nella figura). Lo segnalo nel caso qualcuno facesse copia ed incolla del codice e non riuscisse a compilare. Al posto di main c’è scritto nain e subito dopo al posto della parentesi tonda chiusa c’è una graffa chiusa.
Grazie per la segnalazione. Correggeremo il refuso.
Refuso corretto.
Grazie della segnalazione 🙂
Il nain è stato corretto, ma la tonda di chiusura è sempre sbagliata 😉
Ora OK
c’e’ anche un altro errore, le opzioni di compilazione vanno dopo la chiamata gcc, non prima
“gcc -Wall esempio02.c”
Credo che, specialmente all’inizio del corso dove l’utenza puo’ essere di principianti, sia molto importante stare attenti a queste cose che possono far scoraggiare chi non e’ pratico.
Si utilizza anche in quel caso, non è un errore. Fai un test.
Ho provato, perlomeno sul gcc della beaglebone non compila se si mette -Wall gcc
Vuole per forza gcc -Wall
In realta’ mi ero confuso con la posizione del nome del file, scusa per il commento e credo che hai ragione. Grazie per la segnalazione. Correggeremo il refuso.
Credo che il fatto di mettere il -Wall prima o dopo (il nome del file) sia una questione di comodità. Lo standard definisce la regola come giustamente l’utente Testato ci ha segnalato, metterlo dopo è solo per semplicità, almeno penso. In ogni caso meglio riferirsi sempre alla regola di default 🙂
Si, è un refuso, scusate…. certo che il parametro va messo dopo il comando… a volte il copia e incolla è pericoloso…. 🙂
Grazie Giovanni. A volte si trova anche dopo il nome del file (gcc xxxx.c -Wall), ma la regola dice gcc -Wall xxxx.c. Sarebbe “bello” capire se c’è differenza…
Solo una piccola domanda. Perché creare una directory e compilare come utente root, quando si può creare il sorgente nella propria home e compilarlo come utente senza privilegi?
Vedremo in seguito che per accedere alle porte di I/O del Raspberry occorrerà possedere i diritti di root.
Ciao.
Attenzioni alla parentesi “int main(} {”
Continuerò a seguirvi
Molto interessante come articolo !
Articolo interessante! Ma non trovo sulla pagina il link per scaricare il PDF dell’articolo.
Salve Epifas1,
l’articolo sarà inserito sul prossimo EOS-Book, in uscita il primo lunedì del mese. Potrai quindi averlo nei formati PDF, ePub e mobi.
Grande Articolo, molto interessante, spero ce ne saranno molti così in futuro.
Attenzione anche al seguente errore molto pericoloso per la salute :
Se il semaforo é giallo non fermatevi all’incrocio ma prima 🙂
Ma “fermatevi all’incrocio” non significa in mezzo alla strada…poi volendo potresti avere tempo anche di attraversarlo velocemente 🙂
c’è un link con l’elenco di tutti gli articoli in ordine cronologico?
Grazie
Puoi usare le TAG a fine articolo:
http://it.emcelettronica.com/tag/corso-c