Lezione 02 – Parole chiave

Il linguaggio C prevede alcuni identificatori a cui viene riservato un significato speciale. Tali identificatori vengono definiti parole chiave (keywords) e non possono essere utilizzate per altri scopi, diversi da quelli per cui sono stati pensati. Infatti le parole chiave hanno un significato preciso e individuano singoli token in C. Lo standard ANSI C (cioè la prima standardizzazione del C realizzata dall’ANSI nel 1989 e nota anche come C89) ha definito il seguente insieme di parole chiave:

     auto            double          int             struct
     break           else            long            switch
     case            enum            register        typedef
     char            extern          return          union
     const           float           short           unsigned
     continue        for             signed          void
     default         goto            sizeof          volatile
     do              if              static          while

Lo standard C99 ha aggiunto altre cinque parole chiave:

     inline     restrict     _Bool     _Complex     _Imaginary

Come si vede dall’elenco, rispetto ad altri linguaggi ad alto livello, il C possiede un numero ridotto di parole chiave; il fatto di fare molto con pochi simboli speciali e parole chiave è una caratteristica del C.

Vedremo nel corso delle successive lezioni come devono essere utilizzati questi identificatori speciali e quale significato attribuire a loro.

IDE – Integrated Development Environment

O detto all’italiana Ambiente di Sviluppo Integrato, cioè lo strumento ormai quasi indispensabile per programmare. Dico quasi perché i più temerari ancora programmano mediante linea di comando (o se preferite prompt dei comandi). Forse dedicherò anch’io una breve lezione a tale argomento, ma qui mi limito ad elencare alcuni degli ambienti di sviluppo che si possono utilizzare per scrivere programmi in linguaggio C.

Ricordo, per quelli che ancora non lo sanno, che un Ambiente di Sviluppo Integrato è un software che supporta i programmatori nello sviluppo e debugging del codice sorgente di un programma. Un IDE è di solito dotato di un editor avanzato, un compilatore, un linker ed un debugger che aiutano lo sviluppatore dalla fase di stesura del codice fino alla esecuzione del programma.

Considerando solo quelli gratuiti, i più noti sono, in ordine alfabetico:

  • Code::Blocks (multipiattaforma) Disponibile al seguente indirizzo, https://www.codeblocks.org/, offre la possibilità di programmare in C/C++ e Fortran. È stato progettato per essere molto estensibile e completamente configurabile.
  • CodeLite (multipiattaforma) È specializzato in C, C++, Rust, Python, PHP e JavaScript. Si trova al seguente indirizzo https://codelite.org/.
  • Dev-C++ (solo per Windows) È un ambiente semplice da utilizzare e il preferito dal sottoscritto. Poiché si trovano diverse versioni di tale IDE, ne parleremo in modo più approfondito tra poco.
  • Eclipse (multipiattaforma) Può essere utilizzato per la produzione di software di vario genere: dal linguaggio Java al linguaggio C++ (CDT, “C/C++ Development Tools”) e tramite vari plug-in permette di gestire XML, JavaScript, PHP e persino di progettare graficamente una GUI per un’applicazione Java. Disponibile alla pagina https://eclipseide.org/.
  • Pelles C È un kit di sviluppo completo per desktop Windows, disponibile alla pagina http://www.smorgasbordet.com/pellesc/.

Ce ne sono sicuramente molti altri, ma diventerebbe troppo dispersivo elencarli tutti. Questi che ho citato bastano e avanzano per iniziare ad imparare la programmazione in C. E proprio per chi è alle prime armi consiglio di utilizzare Dev-C++, che viene spesso utilizzato nei corsi universitari di informatica dove si insegnano il C e/o il C++. Ma prima di segnalarvi il link corretto da cui scaricarlo è doveroso dedicare qualche minuto a tale ambiente di sviluppo.

Dev-C++ è un ambiente di sviluppo integrato (IDE) gratuito e completo, distribuito sotto la GNU General Public License, per la programmazione in C e C++ in ambiente Windows. È scritto in Delphi ed è stato originariamente sviluppato da Colin Laplace e dalla sua azienda, la Bloodshed Software, e rilasciato per la prima volta nel 1998. Viene fornito in bundle con il compilatore MinGW o TDM-GCC a 64 bit, ma può essere utilizzato anche in combinazione con Cygwin o qualsiasi altro compilatore basato su GCC.

L’ultima versione curata da Colin Laplace, la 4.9.9.2, risale al lontano 2005 e potete trovarla al seguente indirizzo: https://www.bloodshed.net/. Da allora sono stati portati avanti tre fork di Dev-C++:

  • wxDev-C++ è un IDE che si basa su Dev-C++ con alcune funzionalità aggiuntive, come il supporto per più compilatori e un designer RAD per le applicazioni wxWidgets (cioè un toolkit di widget e una libreria di strumenti per la creazione di interfacce grafiche, GUI). L’ultima versione è la 7.4.2, pubblicata nel giugno del 2012 e scaricabile da https://sourceforge.net/projects/wxdsgn/;
  • Dev-C++ 5.11 (https://orwelldevcpp.blogspot.com/), noto anche come Orwell Dev-C++, versione rilasciata il 27 Aprile 2015, che corregge molti bug della versione di Colin Laplace e aggiunge alcune funzionalità;
  • Embarcadero Dev-C++ (https://www.embarcadero.com/free-tools/dev-cpp), sponsorizzato da Embarcadero (la software house proprietaria dell’ambiente di sviluppo Delphi): un fork nuovo e migliorato di Bloodshed Dev-C++ e Orwell Dev-C++, aggiornato alla versione 9.2.0 di TDM-GCC.

La mia scelta personale è ricaduta sulla versione Orwell che soddisafa, per ora, tutte le mie esigenze di programmazione. Se volete evitare di passare dal blog di Orwell, il link diretto da cui scaricarlo è il seguente:

https://sourceforge.net/projects/orwelldevcpp/files/latest/download

Non mi resta che augurare buona programmazione a tutti voi 🙂

Lezione 01 – Basi lessicali del C

Prima di poter scrivere un programma C significativo occorre imparare le regole per costruire le frasi e le parole o elementi lessicali del linguaggio. In questa prima lezione affronteremo questo argomento e mostreremo l’analisi lessicale di un semplicissimo programma introduttivo.

Alla base di ogni linguaggio di programmazione ci sono due concetti fondamentali che vengono indicati con i seguenti termini: sintassi e semantica. Con sintassi si indica l’insieme delle regole formali che specificano le modalità per costruire frasi corrette nel linguaggio stesso. Con semantica si indica l’insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel linguaggio.

La sintassi del linguaggio C è relativamente semplice, ma per diventare esperti programmatori è necessaria molta pratica dato che il linguaggio C è caratterizzato da un insieme di regole piuttosto rigide. Inoltre il C è un linguaggio di programmazione compilato, cioè il codice sorgente, per essere trasformato in un programma eseguibile dal sistema operativo, deve essere processato da un compilatore, che al tempo stesso verifica la correttezza del codice C. In sostanza, un programma C è una sequenza di caratteri che il compilatore raggruppa in token, che possono essere pensati come oggetti o elementi lessicali del vocabolario di base del linguaggio.

Innanzitutto per scrivere un programma C basta un semplice editor di testi ed i caratteri consentiti in un listato C sono solo i seguenti:

lettere maiuscole: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
lettere minuscole: a b c d e f g h i j k l m n o p q r s t u v w x y z
cifre: 0 1 2 3 4 5 6 7 8 9
caratteri speciali: ! ” # % & ‘ ( ) * + , – . / : ; < = > ? [ \ ] ^ _ { | } ~
caratteri non stampabili:   spazio, ritorno a capo, tab, ecc.

appartenenti tutti alla tabella ASCII standard.

In secondo luogo, occorre verificare la correttezza del listato attraverso l’uso del compilatore, che esegue una serie di operazioni tali da fornire, in assenza di errori, il codice oggetto da cui ricavare poi l’eseguibile. Nella fase di analisi lessicale il compilatore suddivide un programma C in una serie di sei tipi di token: identificatori, parole chiave, costanti, stringhe letterali, operatori e altri separatori.

Identificatori

Un identificatore è una sequenza di combinazioni di lettere, cifre e del carattere underscore _ (trattino di sottolineatura). Sono validi sia i caratteri maiuscoli che quelli minuscoli e vengono distinti tra loro (si dice che C è case sensitive, cioè identificatori come num1, Num1 e NUM1 sono identificatori distinti ).

Un’importante restrizione sugli identificatori è che devono iniziare con un carattere o un underscore e non con una cifra. Alcuni esempi di identificatori validi sono:

   main      posizione1      velocita_iniziale     primoPunto

mentre non sono validi gli identificatori:

   velocità           /* le lettere accentate non sono permesse */ 
   2dadi              /* non può iniziare con una cifra */ 
   velocita-iniziale  /* non confondere - con _ */ 
   numero#uno         /* il carattere speciale # non è permesso 

Si notino i caratteri /* e */ che vengono usati per scrivere dei commenti: tutto ciò che si trova compreso tra la coppia di caratteri /* e */ verrà ignorato dal compilatore (questa combinazione di caratteri viene usata per indicare l’inizio e la fine di un commento). I programmatori di solito inseriscono dei commenti per documentare i programmi e migliorarne la leggibilità. I commenti quindi sono una caratteristica essenziale per una buona programmazione.

Primo programma

Il più semplice programma introduttivo che possiamo scrivere in C si presenta nella seguente forma:

#include <stdio.h>
int main()
{
   printf("Ho scritto il mio primo programma.\n");
   return 0;
}

Per quanto sia semplice questo programma, vengono mostrate importanti caratteristiche del linguaggio C. La prima cosa che possiamo mettere in evidenza è che un qualsiasi programma C deve contenere il seguente blocco, noto come funzione principale:

int main()
{
   
}

formato dall’identificatore main() e dalle due parentesi graffe (per ogni parentesi graffa aperta deve essercene una chiusa) che determinano il corpo della funzione. Il compilatore è in grado di capire che si tratta di una funzione grazie alla presenza della coppia di parentesi tonde (tratteremo le funzioni in una successiva lezione). Inoltre il primo termine, int, identifica il tipo di funzione (int sta per intero e rappresenta uno dei tipi di dato fondamentali – anche questi li tratteremo in una lezione successiva).

All’interno del blocco delimitato dalle parentesi graffe andranno poste le varie istruzioni che costituiranno il corpo del programma e che devono terminare ciascuna con un punto e virgola ; che viene usato come terminatore di istruzione. In questo caso compaiono due sole istruzioni:

  • una istruzione di output , costituita dalla funzione printf(),
  • l’istruzione return, che rappresenta uno dei modi usati per uscire da una funzione (il valore 0 indica che il programma è terminato con successo).

L’istruzione printf() ordina al computer di visualizzare sullo schermo la stringa di caratteri indicata tra virgolette. Si osservi che i due caratteri finali della stringa, cioè \n, non vengono visualizzati sullo schermo, ma rappresentano in C un carattere speciale che consente di andare a capo, cioè saltare ad una nuova linea (newline in inglese). Il carattere backslash (barra rovesciata), \ , è detto carattere di escape (fuga) e viene usato per sopprimere o modificare il significato del carattere seguente.

La funzione printf() fa parte della cosiddetta Libreria Standard del C e consente di inviare sul monitor del computer delle stringhe, cioè delle sequenze finite di caratteri alfanumerici (dedicheremo a tale funzione un’apposita corposa lezione). Per consentire l’uso di tale funzione e farla riconoscere dal compilatore occorre includere nel programma la libreria standard di input/output, stdio.h, mediante l’istruzione:

#include <stdio.h>

che rappresenta una direttiva per il preprocessore. Il preprocessore è una struttura di controllo, invocata prima del compilatore, in grado di realizzare varie trasformazioni in un programma C ed elabora tutte le righe che iniziano con il carattere # (cancelletto). Affronteremo meglio l’argomento in una apposita lezione ad esso dedicata.

Per ora questa lezione termina qui, benché ci siano ancora parecchie cose da dire sul lessico del C. Ma lo faremo nelle prossime lezioni.

Perché il C

La programmazione è diventata al giorno d’oggi un’attività che permea l’intero mondo produttivo: non esiste praticamente nessun ambito lavorativo che non dipenda in qualche misura da qualche applicazione o da qualche sistema informativo o da qualche dispositivo elettronico che esegue qualche calcolo. E per tale motivo vengono utilizzati decine di linguaggi, dai più semplici ai più disparati, per realizzare le centinaia di applicazioni che ogni giorno si affacciano sul mondo.

Benché si possano contare diverse centinaia di linguaggi di programmazione (tenendo conto sia dei linguaggi ad alto livello che a basso livello) molti dei linguaggi più utilizzati attualmente (basta dare un’occhiata all’indice TIOBE per farsene un’idea) hanno in comune una cosa: derivano, chi più chi meno, da un linguaggio sviluppato più di cinquant’anni fa, il C (qui potete trovare un elenco dei linguaggi di programmazione della famiglia C).

Quindi si può facilmente intuire il motivo principale che mi ha spinto a creare questo blog: condividere le mie conoscenze su quello che potremmo definire il padre dei linguaggi di programmazione, cercando al tempo stesso di rendere semplice l’attività di apprendimento di questo linguaggio, che rischia di passare alla storia come uno dei linguaggi di programmazione più difficili da imparare, ma dal mio punto di vista questa affermazione è piuttosto soggettiva.

Basta semplicemente osservare che la maggior parte dei sistemi operativi è scritta in C (dai sistemi desktop a quelli per dispositivi mobile) o pensare alla massiccia diffusione dei dispositivi embedded (per lo più programmati in C) per capire l’importanza di questo linguaggio.

Apprendere il C consente di capire le basi della programmazione, per poi comprendere meglio gli altri linguaggi con sintassi simile al C, tenendo conto anche del fatto che iniziando con il C tutto il resto è in discesa.

Non mi resta che augurare a tutti i visitatori: buona lettura e non esitate a porre domande … prima o poi risponderò 🙂