# Codice sorgente

In informatica, il codice sorgente (spesso detto sorgente o codice o listato) è il testo di un algoritmo di un programma scritto in un determinato linguaggio di programmazione, compreso all'interno di un file sorgente, che definisce il flusso di esecuzione del programma stesso, ovvero la sua codifica software.
Il codice sorgente, scritto in un linguaggio di programmazione leggibile dagli esseri umani, fornisce indicazioni ai computer affinché questi possano tradurle (compilarle) in linguaggio macchina, costituendo così la base di siti web e programmi. Il processo di compilazione include i link alle librerie di sistema.
Per estensione, l'espressione "codice sorgente" viene utilizzata anche per riferirsi a testo scritto in linguaggi informatici non di programmazione, come i linguaggi di markup (ad esempio HTML o XML) o i linguaggi di interrogazione, come Structured Query Language (SQL)

## Obiettivo

Il codice sorgente deve essere opportunamente elaborato per arrivare a un programma eseguibile dal processore, ponendosi dunque come punto di partenza ("sorgente") dell'intero processo che porta all'esecuzione del programma stesso da parte dell'hardware della macchina, e che può includere altre fasi come precompilazione, compilazione, interpretazione, caricamento e linking (a seconda del tipo di linguaggio di programmazione utilizzato) per concludersi con l'installazione.

## Struttura

Tipicamente un codice sorgente si compone di dichiarazioni di variabili (locali e/o globali), eventuale inizializzazione di queste tramite assegnamento, costanti, istruzioni e funzioni che agiscono sulle variabili, strutture di controllo del flusso di esecuzione, secondo un certo paradigma di programmazione. Particolare rilevanza teorica al riguardo assume il teorema di Böhm-Jacopini che afferma che qualunque algoritmo può essere implementato utilizzando tre sole strutture, la sequenza, la selezione ed il ciclo (iterazione), da applicare ricorsivamente alla composizione di istruzioni elementari.
In linea teorica, un buono stile di programmazione prevede la stesura del codice sorgente cercando un compromesso tra la leggibilità del codice, a vantaggio della manutenibilità, e l'efficienza computazionale in termini di tempo di esecuzione e consumo di risorse (memoria e processore). Secondo la best practice si cercherà dunque di eliminare o evitare il più possibile codice ridondante e codice morto.

## Scrittura

La scrittura del codice sorgente presuppone la risoluzione (a monte o di pari passo) del problema iniziale da risolvere e automatizzare sotto forma di algoritmo risolutivo (eventualmente ricorrendo ad un diagramma di flusso o ad uno pseudolinguaggio), di cui la fase di scrittura del codice rappresenta la fase implementativa (programmazione) ad opera di un programmatore tramite un editor di testo (spesso compreso all'interno di un ambiente di sviluppo integrato) rispettando lessico e sintassi del particolare linguaggio di programmazione scelto/utilizzato.
Il programmatore esperto salta spesso la fase di sviluppo in termini di algoritmo e passa direttamente alla fase successiva, pensando direttamente la soluzione algoritmica del problema dato in termini di linguaggio di codifica ovvero linguaggio di programmazione o in pseudocodice.
Inoltre molti linguaggi per semplificare e velocizzare la stesura del codice mettono a disposizione una serie di librerie software che consentono di richiamare codice già scritto (riuso di codice) sotto forma di funzioni utili e ricorrenti raggruppate in cosiddette API (application programming interface) che vengono fornite al programmatore anche sotto forma di documentazione. In fase di compilazione il cosiddetto linker "collega" il programma scritto con le librerie richiamate. Spesso per la scrittura del codice si fa uso di un software development kit (SDK) e più spesso di un IDE a cui è possible agganciare la piattaforma software per lo sviluppo compresa nell'SDK.
Tipicamente la scrittura del codice è una parte dell'intera fase di sviluppo (progettazione, realizzazione e testing) del software, gestita in tutti i suoi aspetti tramite conoscenze dell'ingegneria del software da una squadra di sviluppatori. Precede la scrittura del codice l'analisi dei requisiti e la strutturazione del software in moduli, mentre la segue la fase di debugging ovvero l'individuazione e risoluzione degli eventuali bug del codice stesso (ad es. tramite debugger) secondo le regole della sintassi e della semantica del linguaggio e l'effettiva rispondenza alle specifiche iniziali richieste (testing).
Nell'ambito dello sviluppo software il codice sorgente di un programma e la sua complessità è valutato in termini di linee di codice prodotte o da produrre, mentre i tempi di realizzazione in anni-uomo nell'ipotesi puramente indicativa-comparativa di un singolo sviluppatore.

## Norme

Nella scrittura del codice, per migliorare la leggibilità e intelligibilità del codice sorgente a favore di chi non ha scritto il codice e favorire l'eventuale debugging, è buona prassi come regole di stile:
* evidenziare parti di codice, tramite grassetto o a colori, operazione tipicamente effettuata di default dall'editor di testo del codice sorgente;
* indentazione del codice mettendo in risalto con opportuni livelli di tabulazione (rientro) le varie parti del codice stesso;
* inserire commenti ovvero righe di testo che non fanno parte del codice in sé (cioè dell'algoritmo risolutivo codificato in linguaggio di programmazione), ma che ne commentano il significato/funzionalità almeno nei suoi passi fondamentali. La corretta sintassi per l'inserimento dei commenti (marcatore del commento) varia tipicamente da linguaggio di programmazione ad un altro con possibilità di inserimento di commento su una o più righe.

## Errori

Alla fine della stesura del codice il programmatore opera una prima fase di test valutando se l'output del programma è quello atteso compilando/interpretando ed eseguendo il codice. Durante lo sviluppo e l'esecuzione di un codice sorgente possono verificarsi i cosiddetti "errori di programmazione" che si possono distinguere essenzialmente in tre principali categorie: errori di sintassi, errori di logica ed errori di run-time.

## Licenze

Nel caso di software proprietario, il codice sorgente non è normalmente fornito all'utente dallo sviluppatore come lo è sempre il codice eseguibile per programmi compilati o il bytecode nel caso di programmi interpretati/semiinterpretati, mentre invece è disponibile nel caso di software open source e software libero.