Un primo programma in Linguaggio C

Iniziamo il nostro studio del linguaggio C scrivendo un semplice programma.

In questa lezione scriveremo, analizzeremo e compileremo un semplice programma in linguaggio C che stampa a schermo il messaggio Ciao, Mondo!.

Un primo semplice programma

La tradizione dei manuali di informatica vuole che il primo programma scritto in un nuovo linguaggio sia un programma che stampi a video la scritta "Hello, World!" (Ciao, Mondo!). Questa tradizione fu iniziata proprio da Brian Kernighan e Dennis Ritchie, i creatori del linguaggio C, quando scrissero il primo manuale: "The C Programming Language".

Continuiamo questa tradizione, e realizziamo un programma che stampa a schermo il messaggio Ciao, Mondo! ogniqualvolta viene eseguito:

1
2
3
4
5
6
#include <stdio.h>

int main() {
    printf("Ciao, Mondo!\n");
    return 0;
}

A differenza di altri linguaggi di programmazione, il C non necessita di molto codice boilerplate. Con questo termine si intende tutto quel codice che deve essere scritto per inizializzare un programma, ma che non è direttamente legato alla logica del programma stesso. In questo caso, il codice necessario per stampare a schermo il messaggio è davvero minimo.

Proviamo ad osservare, senza entrare troppo nel dettaglio, le righe di cui è composto il programma.

La prima riga, #include <stdio.h>, è necessaria per includere la libreria standard di input/output del C. Nell'ambito dei linguaggi di programmazione, una libreria è un insieme di funzioni che possono essere utilizzate all'interno di un programma. L'idea è che una libreria contenga quelle funzioni che evitino di dover scrivere codice da zero per compiti comuni. In questo caso, la libreria stdio.h contiene le funzioni per la gestione dell'input e dell'output da tastiera.

Successivamente, il programma entra nel main, ossia il corpo principale del programma. Il main racchiude il corpo del programma tra due parentesi graffe {}.

Al suo interno, troviamo due istruzioni:

  • printf("Ciao, Mondo!\n"); è un'istruzione che stampa a schermo il messaggio Ciao, Mondo! seguito da un a capo. printf sta proprio per print function, funzione di stampa;
  • return 0; è un'istruzione che termina il programma restituendo il valore 0. Questo valore è un codice di uscita che indica al sistema operativo che il programma è terminato correttamente.

Anche se a prima vista può sembrare complesso, nel corso di questa guida studieremo nel dettaglio il funzionamento delle singole parti.

Compilazione e Collegamento

Vediamo, ora, come poter compilare ed eseguire il programma appena visto.

Il primo passo consiste nello scrivere il codice sorgente, ossia nello scrivere un file di testo che contiene le istruzioni del programma.

Per far questo, possiamo usare un qualsiasi editor di testo e creare un file che può chiamarsi, ad esempio, ciao.c. Il nome del file è a discrezione dell'utente e possiamo scegliere quello che vogliamo. Tuttavia, l'estensione .c è importante, poiché indica al compilatore che il file contiene codice sorgente in linguaggio C e molti compilatori richiedono che essa sia obbligatoria.

Definizione

File Sorgente in Linguaggio C

Un file sorgente in linguaggio C è un file di testo che contiene le istruzioni del programma. Il file sorgente ha di solito estensione .c e deve essere compilato per poter essere eseguito.

nome_file.c

Adesso che abbiamo un file chiamato ciao.c, dobbiamo convertirlo in una forma che il processore sia in grado di comprendere ed eseguire. Infatti, il codice sorgente è scritto in linguaggio C, che è un linguaggio intellegibile da un essere umano, ma non da un computer.

Un computer, invece, è in grado di eseguire solo codice macchina, ossia una sequenza di istruzioni binarie.

La conversione da codice sorgente a codice macchina per un file C, di solito, coinvolge tre passaggi:

  • Preprocessing: in questa fase, il file sorgente viene passato ad un preprocessore che si occupa di eseguire tutti quei comandi che cominciano con un cancelletto, #. Il preprocessore, che studieremo nelle prossime lezioni, è molto simile ad un editor di testo, in quanto sostituisce porzioni di codice e ne modifica altre;

  • Compilazione: il file preprocessato viene passato al compilatore, che si occupa di tradurre il codice sorgente in codice macchina, chiamato anche codice oggetto. Tuttavia, il programma non è ancora del tutto pronto per essere eseguito;

  • Collegamento o Linking: nella fase finale, un ultimo programma, chiamato linker, si occupa di combinare il codice oggetto generato al passo precedente con del codice aggiuntivo necessario a produrre un programma eseguibile. Questo codice aggiuntivo include tutte quelle funzioni di libreria (come la funzione printf) che vengono usate dal programma.

Fortunatamente, tutti questi passaggi sono automatizzati. Quindi, a parte casi particolari, non è necessario preoccuparsi di eseguire manualmente ciascuno di essi. Nella maggior parte dei casi, infatti, il preprocessore è integrato nel compilatore e il linker viene chiamato in automatico dal compilatore.

I comandi per la compilazione variano da compilatore a compilatore. Per il momento, a titolo di esempio, proviamo a vedere come compilare il programma con gcc che rappresenta il compilatore di default su molti sistemi Unix e Linux.

Supponiamo di avere il nostro programma ciao.c e di volerlo compilare. Apriamo un terminale e scriviamo il seguente comando:

gcc ciao.c -o ciao

Questo comando dice al compilatore gcc di compilare il file ciao.c e di produrre un file eseguibile chiamato ciao. L'opzione -o sta proprio per output e permette di specificare il nome del file eseguibile.

Se il comando è eseguito correttamente, dovremmo vedere comparire un file chiamato ciao nella cartella in cui ci troviamo. Questo file è l'eseguibile del nostro programma. Se vogliamo eseguirlo, possiamo scrivere il seguente comando:

./ciao

Ottenendo, così, l'output Ciao, Mondo!.

Definizione

Compilare un file sorgente C con il compilatore GCC

Per compilare un file sorgente in linguaggio C con il compilatore gcc, è possibile utilizzare il seguente comando:

gcc nome_file.c -o nome_eseguibile

Dove:

  • nome_file.c è il nome del file sorgente in linguaggio C;
  • nome_eseguibile è il nome del file eseguibile che verrà prodotto.

Ambienti Integrati di Sviluppo

Finora, abbiamo assunto che il codice sorgente del file C sia stato scritto con un comune editor di testo, come può essere nano, vim o notepad.

Esiste un'alternativa, ossia quella di utilizzare dei cosiddetti Ambienti Integrati di Sviluppo o IDE (Integrated Development Environment). Un IDE è un software che integra al suo interno un editor di testo, un compilatore, un debugger e altre funzionalità utili per lo sviluppo di software.

I componenti di un IDE sono progettati per lavorare insieme in modo sinergico. Ad esempio, quando il compilatore trova un errore nel codice, l'IDE evidenzia la riga corrispondente e fornisce suggerimenti per correggerlo.

Esempi di IDE famosi sono:

  • Visual Studio: un IDE sviluppato da Microsoft per la programmazione in C, C++, C#, Visual Basic e altri linguaggi;
  • Eclipse: un IDE open-source sviluppato in Java e utilizzato per la programmazione in diversi linguaggi, tra cui Java, C, C++, Python e altri;
  • Code::Blocks: un IDE open-source sviluppato in C++ e utilizzato per la programmazione in C, C++ e Fortran.
  • Clion: un IDE sviluppato da JetBrains per la programmazione in C, C++, Python e altri linguaggi.

Ovviamente, la scelta di un IDE è molto personale e dipende dalle esigenze del programmatore. Alcuni preferiscono IDE più leggeri e minimalisti, come Code::Blocks, mentre altri preferiscono IDE più complessi e ricchi di funzionalità, come Visual Studio. Inoltre, esistono molte differenze tra di essi, per cui esaminarli nel dettaglio in questa guida non sarebbe molto utile.

In Sintesi

In questa lezione introduttiva, abbiamo visto come scrivere un primo semplice programma in linguaggio C che stampa a schermo un messaggio.

In particolare, abbiamo studiato che un programma C deve essere scritto come semplice testo in un file sorgente, un file con estensione .c. Per scrivere un file di questo tipo è possibile utilizzare un qualsiasi editor di testo, come nano, vim o notepad. Oppure è possibile utilizzare un Ambiente Integrato di Sviluppo o IDE.

Infine, abbiamo visto che un programma C deve essere compilato per poter eseguito. Ossia, deve essere trasformato in un file eseguibile o programma eseguibile che il processore è in grado di comprendere. Per far questo bisogna usare il compilatore che traduce il codice sorgente in codice macchina.

Adesso che abbiamo chiari questi concetti, possiamo passare alla lezione successiva in cui analizzeremo nel dettaglio l'anatomia generale di un programma scritto in C.