Salta ai contenuti

Guida al Setup dell'Ambiente

Per iniziare a scrivere, compilare e debbuggare programmi in C, sono necessari tre componenti fondamentali:

  1. Un compilatore: traduce il codice sorgente C in linguaggio macchina eseguibile (gcc o alternativamente clang).
  2. Un debugger: consente di analizzare l’esecuzione del programma passo-passo ed ispezionare la memoria RAM. Utilizzeremo lldb, lo standard moderno universale e pienamente supportato anche su architetture Apple Silicon.
  3. Un editor di codice: per scrivere ed organizzare i sorgenti. Utilizzeremo lo stesso ambiente su tutte le piattaforme: Visual Studio Code (VS Code) con un profilo pre-configurato.

Su tutte le piattaforme utilizzeremo ambienti e toolchain equivalenti:

  • Su Windows: useremo gcc / clang ed lldb all’interno del sottosistema Linux WSL (Windows Subsystem for Linux).
  • Su macOS: useremo clang ed lldb, inclusi nei Command Line Tools di Apple (pienamente compatibili con la sintassi gcc).
  • Su Linux: useremo gcc / clang ed lldb, gli strumenti nativi della distribuzione.

1. Installazione della Toolchain (Compilatore e Debugger)

Sezione intitolata “1. Installazione della Toolchain (Compilatore e Debugger)”

L’installazione varia in base al sistema operativo. Segui la sezione specifica per il tuo computer.

Per avere un ambiente di sviluppo POSIX/Linux allineato ai laboratori didattici, su Windows utilizzeremo WSL (Windows Subsystem for Linux) con distribuzione Ubuntu.

  1. Cerca PowerShell o Prompt dei comandi nel menu Start di Windows, fai click destro e seleziona Esegui come amministratore.
  2. Digita il seguente comando e premi Invio:
    Terminal window
    wsl --install -d Ubuntu
  3. Al termine dell’installazione, riavvia il computer.
  4. Dopo il riavvio, si aprirà automaticamente la finestra di terminale Ubuntu. Attendi l’inizializzazione e crea il tuo username e password per il sistema Linux.

Nel terminale di Ubuntu, esegui il seguente comando per aggiornare il gestore dei pacchetti ed installare gcc, clang ed lldb:

Terminal window
sudo apt update
sudo apt install build-essential clang lldb -y

Verifica la presenza degli strumenti digitando:

Terminal window
gcc --version
clang --version
lldb --version

Su macOS utilizzeremo i compilatori e debugger nativi Apple Clang ed LLDB forniti tramite i Command Line Tools.

Passo 1: Avviare l’installazione dei Command Line Tools

Sezione intitolata “Passo 1: Avviare l’installazione dei Command Line Tools”

Apri il Terminale (cercandolo tramite Spotlight con Cmd + Spazio) e digita:

Terminal window
xcode-select --install

Clicca su Installa nella finestra che appare ed accetta i termini di licenza.

Richiesta di installazione command line tools

Attendi il completamento del download. Al termine, verifica la versione installata digitando nel Terminale:

Terminal window
clang --version
lldb --version

La maggior parte delle distribuzioni Linux consente l’installazione rapida della toolchain completa tramite il gestore di pacchetti.

Apri il terminale e digita:

Terminal window
sudo apt update
sudo apt install build-essential clang lldb -y

Verifica la versione dei tools con:

Terminal window
clang --version
lldb --version

2. Installazione e Configurazione di Visual Studio Code

Sezione intitolata “2. Installazione e Configurazione di Visual Studio Code”

Scarica ed installa l’editor dal sito ufficiale: code.visualstudio.com.

Passo 2: Importazione del Profilo del Corso (Prog1-OZ)

Sezione intitolata “Passo 2: Importazione del Profilo del Corso (Prog1-OZ)”

Profilo Obbligatorio per Esercitazioni ed Esami

Abbiamo preparato un profilo pre-configurato pronto per essere importato. Questo profilo isola l’ambiente del corso, disabilita l’autocompletamento invasivo (per abituarti a scrivere la sintassi) e installa automaticamente l’estensione per il debugger (CodeLLDB).

  1. Scarica il file del profilo da questo link: Prog1-OZ.code-profile.
  2. Apri VS Code.
  3. Fai clic sull’icona dell’ingranaggio in basso a sinistra (Impostazioni) e seleziona Profiles -> Import Profile….
  4. Seleziona il file Prog1-OZ.code-profile appena scaricato e clicca su Create Profile.
  5. Riconoscerai il profilo attivo dall’icona del libro (Book) in basso a sinistra.

3. Test di Compilazione ed Esecuzione da Terminale

Sezione intitolata “3. Test di Compilazione ed Esecuzione da Terminale”

Per comprendere il funzionamento reale dei compilatori, non utilizzeremo pulsanti magici o estensioni automatiche. Compileremo direttamente dal terminale integrato.

Crea un file chiamato hello.c ed inserisci il seguente codice:

#include <stdio.h>
int main(void) {
printf("Benvenuti a Programmazione 1!\n");
return 0;
}

In alternativa, potete usare Clang:

Terminal window
clang -Wall hello.c -o hello

L’opzione -o hello indica al compilatore di generare un file eseguibile chiamato hello.

Nel terminale, avvia il programma eseguibile digitando:

Terminal window
./hello

A schermo apparirà il messaggio di benvenuto corretto!


Quando il tuo programma presenta bachi o crash di memoria (come i famosi Segmentation Fault), il debugger lldb ti permette di fermare il tempo ed ispezionare le variabili.

Per consentire a lldb di leggere i nomi delle variabili e le righe di codice, occorre compilare aggiungendo il flag -g (mantenendo sempre attivo anche -Wall):

Terminal window
clang -g -Wall hello.c -o hello

Avvia il debugger passando l’eseguibile:

Terminal window
lldb ./hello

All’interno della shell di lldb (indicata dal prompt (lldb)), puoi usare i seguenti comandi essenziali:

ComandoScorciatoiaDescrizione
breakpoint set --name mainb mainImposta un punto di interruzione all’inizio della funzione main.
breakpoint set --line 6b 6Imposta un punto di interruzione alla riga 6 del sorgente.
runrAvvia l’esecuzione del programma fino al primo breakpoint.
nextnEsegue la riga di codice corrente e passa alla successiva (step over).
stepsEntra all’interno della funzione chiamata nella riga corrente (step in).
frame variablevStampa il valore di tutte le variabili locali nella funzione corrente.
print mia_varp mia_varStampa il valore specifico della variabile mia_var.
continuecRiprende l’esecuzione normale fino al prossimo breakpoint o alla fine.
quitqEsci dal debugger lldb.

5. Integrazione del Debugger in VS Code (Estensione CodeLLDB)

Sezione intitolata “5. Integrazione del Debugger in VS Code (Estensione CodeLLDB)”

Sebbene sia possibile fare tutto da riga di comando (consigliato per capire i meccanismi), Visual Studio Code permette di utilizzare un’interfaccia grafica per il debug. Per farlo in modo affidabile (specialmente su macOS e WSL), utilizzeremo l’estensione CodeLLDB.

Se hai importato il profilo Prog1-OZ, CodeLLDB è già installato. Per verificarlo, o per installarlo a mano:

  1. Vai nella barra delle estensioni a sinistra (Ctrl+Shift+X o Cmd+Shift+X).
  2. Cerca CodeLLDB (pubblicata da Vadim Chugunov) e, se non è già presente, clicca su Install.
  3. Se sei su Windows all’interno di WSL, assicurati di installare l’estensione all’interno della sessione di WSL (dovrebbe comparire il pulsante Install in WSL).

Il debug e la compilazione grafica in VS Code vanno configurati progetto per progetto (ossia per ciascuna cartella aperta). Questo è normale e necessario, poiché progetti diversi potrebbero richiedere comandi di compilazione o parametri di debugging specifici.

La configurazione consiste nel creare una cartella speciale chiamata .vscode all’interno della cartella del progetto corrente, contenente due file JSON:

  1. tasks.json: definisce come compilare il programma prima di avviarlo.
  2. launch.json: definisce come avviare il debugger collegandolo all’eseguibile compilato.

Crea questo file e incolla il seguente contenuto:

{
"version": "2.0.0",
"tasks": [
{
"label": "Prog1 O-Z Simple Build",
"type": "shell",
"command": "/usr/bin/clang",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",
"problemMatcher": ["$gcc"]
}
]
}

Crea questo file e incolla il seguente contenuto:

{
"version": "0.2.0",
"configurations": [
{
"name": "Prog1 O-Z Debugging Profile",
"type": "lldb",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"cwd": "${fileDirname}",
"preLaunchTask": "Prog1 O-Z Simple Build"
}
]
}

Nota: Non è fondamentale studiare a memoria i parametri di questi file JSON; il loro scopo è semplicemente compilare il file C attualmente aperto (con l’opzione -g attiva) e avviare la sessione di debug grafico.

  1. Assicurati di aver aperto la cartella principale del progetto (es. lab1-demo) in VS Code.
  2. Apri il file .c su cui stai lavorando (es. hello.c o orbite.c).
  3. Posiziona il cursore a sinistra del numero di riga in cui vuoi interrompere l’esecuzione e fai clic per impostare un cerchio rosso (Breakpoint).
  4. Premi F5 sulla tastiera o vai nel menu a sinistra (icona Run and Debug) e fai clic sul pulsante verde Play vicino a Prog1 O-Z Debugging Profile.
  5. VS Code compilerà automaticamente il file C e aprirà una barra dei controlli in alto per permetterti di avanzare passo-passo (Step Over F10, Step In F11, Continue F5), mentre a sinistra potrai visualizzare il valore delle variabili locali in tempo reale.