· Andrea Pollini · informatica · 5 min read
Il fascino e i pericoli del linguaggio C
Corso Per principianti e non solo per imparare il linguaggio di programmazione C
Il fascino e i pericoli del linguaggio C Il linguaggio C, come ammettono anche i suoi creatori Kernighan e Ritchie, è relativamente piccolo, ma possiede caratteristiche che lo rendono apprezzato da molti programmatori.
Vantaggi di un linguaggio essenziale:
Facilità di apprendimento: C ha un set di funzionalità ridotto, quindi richiede meno tempo per essere imparato. Codice snello: L’assenza di funzionalità superflue permette di scrivere codice più leggero e performante. Svantaggi di un linguaggio essenziale:
Maggiore impegno del programmatore: C richiede di scrivere più codice rispetto a linguaggi più evoluti per ottenere lo stesso risultato. Mancanza di funzionalità avanzate: C non offre funzionalità integrate per alcune operazioni, lasciando più libertà al programmatore ma richiedendo anche di implementare soluzioni personalizzate. Questo aspetto è visto positivamente da alcuni sviluppatori che apprezzano la possibilità di avere un maggiore controllo sul codice.
C: un ponte tra linguaggio macchina e linguaggi di alto livello
C viene spesso definito come un “linguaggio assembly di alto livello”. Alcuni considerano questa definizione dispregiativa, ma in realtà è una caratteristica voluta e significativa del linguaggio. Chi ha esperienza con il linguaggio assembly troverà C naturale e confortevole. Attenzione però a non concentrarsi troppo sui dettagli a livello di macchina, che potrebbero portare a programmi non portabili su sistemi diversi. Programmatori senza esperienza assembly: La mancanza di funzionalità di alto livello in C potrebbe risultare frustrante. È importante capire la filosofia dietro la progettazione di C: garantire che costrutti apparentemente semplici si traducano in codice macchina efficiente e leggibile. Scrivere codice C in modo chiaro e conciso porta di solito a programmi eseguibili snelli e performanti. Se il programma risultante non è efficiente, la causa è probabilmente da ricercare nel codice scritto, non nel compilatore. C è uno strumento, non una soluzione universale
Un linguaggio di programmazione è uno strumento, e nessuno strumento può svolgere qualsiasi compito da solo. C non possiede funzionalità integrate per tutte le operazioni di programmazione.
Librerie e dipendenze esterne
Come accennato, C lascia ampia libertà al programmatore su come implementare determinate operazioni. Attività comuni come la manipolazione di stringhe, l’allocazione di memoria e l’input/output (I/O) vengono effettuate tramite chiamate a funzioni di libreria. Altre operazioni, come la creazione o l’elencazione di directory, l’interazione con il mouse, la gestione di finestre e grafica a colori, non sono affatto definite dal linguaggio C. È possibile eseguire queste azioni da un programma C, ma si farà affidamento a funzionalità specifiche dell’ambiente di programmazione (compilatore, processore e sistema operativo) che non fanno parte dello standard C. Questo corso si concentrerà su programmazione C portabile, evitando quindi funzionalità non disponibili in tutti gli ambienti C.
Un linguaggio potente, ma rischioso
Un altro aspetto importante di C è la sua pericolosità. In generale, C non protegge il programmatore dagli errori. Se si scrive un codice che, a causa di una svista, produce risultati indesiderati, come la cancellazione di dati o l’eliminazione di file, e il compilatore può compilarlo, lo farà senza avvertimenti del tipo “Intendi davvero…?” o “Sei sicuro di voler…?”. C viene spesso paragonato a un coltello affilato: può svolgere un lavoro di precisione chirurgica su un compito complesso, ma può anche tagliare un dito con la stessa precisione. Sta al programmatore usarlo con cautela.
Questo aspetto di C è stato ampiamente criticato e usato per sostenere che C non sia un buon linguaggio per principianti. Gli appassionati di C lo apprezzano proprio per questo motivo: il linguaggio non cerca di proteggerli da loro stessi, permettendo di fare ciò che vogliono, anche se rischioso o complesso. I principianti, invece, possono trovare frustrante questo aspetto, vedendo il linguaggio come una trappola piena di insidie. Con attenzione e cura si possono evitare molte delle difficoltà. Questo corso vuole fornire un aiuto per individuare i punti critici, sia quelli ovvi che quelli meno evidenti.
Scrivere il primo programma in C
Per iniziare a programmare in C, è necessario un compilatore C. Il compilatore traduce il codice sorgente C in codice macchina eseguibile. Il compilatore più diffuso per C è GCC (GNU Compiler Collection), disponibile per la maggior parte dei sistemi operativi. Per installare GCC su Linux, è sufficiente eseguire il comando sudo apt install gcc
. Per Windows, è possibile utilizzare MinGW (Minimalist GNU for Windows) o Cygwin, ma se si desidera avere in modo rapido un compilatore funzionante e bene integrato con il sistema, anche Visual Studio rappresenta una alternativa più che ottima. Per macOS, è possibile installare GCC tramite Homebrew.
Una volta installato il compilatore, è possibile scrivere il primo programma in C. Ecco un esempio di programma “Hello, World!” in C:
Per compilare il programma, salvare il codice in un file con estensione .c
(ad esempio hello.c
) e utilizzare, nel caso in cui stiate utilizzando GCC come compilatore, il comando gcc hello.c -o hello
per generare l’eseguibile hello
. Per eseguire il programma, digitare ./hello
da riga di comando.
Per compilare il programma con Visual Studio, è sufficiente creare un nuovo progetto C e copiare il codice sorgente all’interno del file main.c
. Dopo aver compilato il progetto, è possibile eseguire il programma direttamente dall’IDE.
descrizione del codice
#include <stdio.h>
: questa riga include la libreria standard di input/output di C, che contiene funzioni comeprintf
escanf
.int main() { ... }
: questa è la funzione principale del programma. Tutti i programmi C devono avere una funzionemain
, che è il punto di ingresso del programma.printf("Hello, World!\n");
: questa riga stampa il messaggio “Hello, World!” sulla console. La sequenza di escape\n
indica un carattere di nuova riga.return 0;
: questa riga termina la funzionemain
e restituisce il valore0
al sistema operativo. Un valore diverso da zero indica un errore.