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.