C su Windows

Questo articolo non è finito, l'ho buttato qua mentre sto sperimentando col CSS

Installare un compilatore C su Windows può essere semplice quanto complesso, a seconda della procedura scelta. Ci sono due modi principali per farlo, uno più immediato e uno più flessibile. Si può decidere di installare l'IDE Visual Studio e lasciar fare tutto a lui, ma si sarà praticamente obbligati ad usare l'IDE per tutte le interazioni con gli strumenti di sviluppo C, oppure si può andare a installare gli strumenti di sviluppo manualmente senza l'IDE e andare a configurare il nostro editor di codice per fare uso degli strumenti scaricati.

Qui andrò a spiegare i dettagli della seconda procedura, dato che la prima è abbastanza semplice; basta cercare Visual Studio sul web, scaricare l'installer e seguire le istruzioni a schermo.

Potrei partire subito con la lista di cose da fare, ma preferisco prima spiegare un attimo cosa e soprattutto perché stiamo facendo le cose in questo modo. C e C++, a differenza di altri linguaggi, sono solo "standard", documenti che descrivono come C dovrebbe funzionare, ed esistono quindi diverse implementazioni di questi standard, di queste specifiche. Ogni implementazione è divisa in due componenti principali: il compilatore C, che prende il nostro codice sorgente e lo trasforma in codice macchina eseguibile, e la libreria standard C che contiene tutte le funzioni, appunto, "di libreria", come printf(), scanf(), e insomma tutte le funzioni che possiamo includere nel nostro codice con direttive come #include <stdlib.h> eccetera.

Dovrebbe essere ora un po' più chiaro cosa dobbiamo fare ora, ovvero installare un compilatore e una libreria standard. Su Windows esistono diversi compilatori C, ma solo una libreria standard. Questi fanno parte di "MSVC", che sta per "Microsoft Visual C", che come dice il nome sono parte della suite di Visual Studio. Per installarli è necessario scaricare i "Visual Studio Build Tools", che sono gli stessi strumenti installati con l'IDE ma senza l'IDE. I Build Tools sono sul sito di Visual Studio; basta cercarli sul web e andare in fondo alla pagina (che dovrebbe essere https://visualstudio.microsoft.com/downloads). Una volta scaricato, bisogna andare nella sezione "Singoli componenti" e selezionare il componente MSVC, Windows SDK, e C Runtime.

Screenshot del Visual Studio Installer
Componenti da selezionare dal Visual Studio Installer

A questo punto abbiamo già un ambiente di sviluppo C, benché molto minimale. Possiamo accedere al compilatore aprendo il "Prompt dei comandi di sviluppo nativo x64", e dando il comando cl. Per compilare un file si può dare cl nomefile.c, ed eseguire il .exe generato.

Con questo set up, però, aprendo un editor di codice come VSCode non ci saranno funzionalità "smart" come segnalazione di errori, warning, suggerimenti, eccetera. Anche qui, abbiamo due opzioni: la prima è specifica a VSCode, di qualità relativamente bassa, (e ho visto che è un po' buggata, ma non avendola usata molto personalmente non ne sono sicuro), mentre la seconda è utilizzabile da pressoché tutti gli editor di codice, è più usata, dà suggerimenti migliori, ma vanno fatti dei passaggi a mano. Ovviamente, sceglieremo la seconda opzione.

La seconda opzione consiste nell'usare clangd, un Language Server basato sul compilatore Clang, che parla il Language Server Protocol (LSP). In pratica è un programmino che parla con un qualsiasi editor di codice che supporta l'LSP e gli dice se e cosa non va bene del codice presente nell'editor. Clang invece è un ottimo compilatore basato sul progetto LLVM, ed è naturale che abbia suggerimenti molto utili.

Per scaricare clangd è sufficiente recarsi alla pagina GitHub di LLVM e scaricare l'ultima release stabile di LLVM-versione-win64.exe, disponibile al link https://github.com/llvm/llvm-project/releases/latest nella sezione "Assets". Nell'exe scaricato non è contenuto solo clangd, ma l'intera suite LLVM, tra cui un debugger, chiamato LLDB, e il compilatore Clang. Quest'ultimo può essere utilizzato in alternativa al compilatore di MSVC, cl; a me personalmente piace di più dato che fornisce warning più completi e produce codice generalmente più ottimizzato, ma a voi la scelta.

Bene, ora che abbiamo installato tutta la roba che ci serve, possiamo procedere con l'ultimo passaggio: configurare l'editor di codice per fare uso di quello che abbiamo installato. Essendo clangd un server LSP standard è possibile usare un qualsiasi editor di codice molto facilmente, ed io ho scelto VSCode. Per usare clangd su VSCode è sufficiente installare l'estensione "clangd" ed assicurarsi che l'estensione C/C++ di Microsoft non sia installata, in quanto andrebbe in conflitto con clangd. Finita l'installazione, il nostro editor dovrebbe essere in grado di sfruttare tutte le funzionalità intelligenti che potremmo desiderare, come salti a definizione di funzioni, documentazione appoggiando il puntatore su un simbolo, eccetera.

Nonostante LSP sia fantastico per quanto riguarda la scrittura di codice, non fornisce altre funzionalità che potremmo volere, come il debug in un click di un programma. Quest'area è meno standardizzata, per cui so dirvi solo come configurare il debugger su VSCode. Avete presente come quando vi ho fatto installare LLVM vi ho detto che avete installato anche il debugger LLDB? Ecco, faremo uso proprio di quello attraverso la bellissima estensione CodeLLDB. Per usarla, apriamo una qualsiasi cartella contenente un progetto C. Fatto ciò, dobbiamo dire a VSCode cosa fare quando schiacciamo il tasto debug (o F5). Questo viene fatto piazzando un file JSON nella cartella .vscode del progetto, contenente più o meno questo:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "expressions": "native",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceFolder}/mioprogetto.exe",
            "preLaunchTask": "compile",
            "args": [],
            "cwd": "${workspaceFolder}"
        }
    ]
}

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "compile",
            "type": "process",
            "command": "clang",
            "args": ["-o", "mioprogetto.exe", "mioprogetto.c"],
            "presentation": {
                "reveal": "silent",
                "focus": false
            }
        }
    ]
}