# Cosa significa programmare
## Cosa significa programmare

La parola programmare ha un significato molto diverso da quelli che pensano alcuni che si credono programmatori. Programmare non significa scaricare da internet un programma che ti cambia l'aspetto grafico del pc o incrementa le prestazioni. Quando programmi, il programma te lo fai tu e solo tu, non usi programmi degli altri (eccetto ovviamente compilatore, linker, ecc.).
L’espressione programmare ha un significato diverso e più ampio rispetto a quello riconducibile all’attività specifica propria di chi fa di mestiere l’analista e il programmatore.
Questo significato più ampio appartiene a tantissime persone che ogni giorno nella propria vita programmano anche se magari non ne sono consapevoli: queste persone sono anche programmatori e analisti, ma sono anche tantissime persone comuni che se dici loro “ma lo sai che tu spesso e volentieri programmi” ti rispondono “no guarda di quella roba lì non ci capisco niente”.
Immagina Cristina a cui il marito Giuseppe dice di avere invitato a cena Roberto e Luisa per la sera seguente: Cristina penserà subito che quel bietolone del marito avrebbe dovuto avvisarla prima dopodiché comincerà a costruire la risposta alla domanda “cosa do da cenare a Luisa e Roberto?”
Luisa è vegetariana per cui ama verdura e frutta, Roberto non può assumere cibi con il glutine ed ama la pasta, e poi c’è Giuseppe che non sopporta il pesce: quindi occorre una cena con niente carne, pesce nemmeno e niente alimenti con il glutine.
Cristina immagina un menu organizzato come prima cosa da un antipasto costituito da un pinzimonio ricco di svariate verdure crude da intingere nell’olio extravergine variamente aromatizzato, poi da una "pastasciuttona" preparata con maccheroni senza glutine e un delicato sugo di pomodoro fresco e basilico, quindi da una insalata caprese ricca di mozzarella di bufala, fettine di pomodoro, olive nere e verdi pugliesi e taggiasche, capperi siciliani: una sequenza perfetta cui manca solo il tocco di un vinello bianco senza solfiti.
Ma non è un magnifico algoritmo!
Beh è vero, qualche differenza c’è ancora con un programma elaborato da un programmatore, l’algoritmo non va tradotto nel linguaggio del pc perché Cristina stessa prepara il tutto: ma spiegare ad un’altra persona le varie ricette pensate sia una cosa semplice?

## Programmi necessari
### Compilatore

Un compilatore è il programma base per compilare. Questo scorre il codice sorgente e lo traduce nel corrispondente binario per l'architettura su cui questo dovrà essere eseguito.
Spesso la compilazione non è una traduzione "letterale" ma quanto scritto dal programmatore è verificato e dove possibile ottimizzato.
Il primo controllo eseguito dal compilatore è quello sintattico. Ovvero come ogni linguaggio anche quello di programmazione ha le sue precise regole. Il controllo sintattico non fa altro che verificare se queste regole sono state rispettate e restituisce un errore se così non fosse. Un secondo controllo che il compilatore fa è quello semantico, ovvero controlla che le istruzioni siano coerenti tra loro. Ad esempio se un'operazione richiede due numeri interi e gliene viene dato solo uno il compilatore si fermerà generando un errore. Alcuni compilatori sono in grado di trovare anche errori logici, ad esempio un ciclo infinito di istruzioni che non termina mai. Ai compilatori inoltre è affidato l'arduo compito di ottimizzare il codice binario risultante, a volte anche sopperendo ad una programmazione non proprio attenta. Spesso questo avviene eliminando istruzioni inutili, ignorando codice che non potrà mai essere eseguito o altro ancora. Ma soprattutto l'ottimizzazione avviene sfruttando al massimo le opportunità offerte dall'architettura di destinazione. Il compilatore quindi può essere determinante per la velocità finale di un programma. Pur non potendo sostituire l'uso di tecniche di programmazione efficaci, l'impatto del compilatore sulle prestazioni può essere sensibile. Tuttavia una compilazione troppo spinta che sfrutti euristiche ancora non ben testate può comportare la creazione di un codice binario errato, che andrà in errore anche se non per colpa del programmatore.
Non necessariamente il compilatore crea un binario che può essere eseguito da solo. Capita molto spesso infatti che siano compilate delle librerie di codice e non un programma vero e proprio. Tali librerie non sono altro che un insieme di funzioni, anche molto generiche, che sono poi riutilizzate da altri programmi. Il sorgente di una libreria viene quindi compilato in una maniera particolare per cui il risultato è un file binario che dovrà poi essere collegato al programma vero e proprio che ne vorrà utilizzare le funzionalità. Quest'ultimo procedimento viene eseguito all'avvio del programma dal Linker.

### Linker

Il linker è il programma che si occupa di collegare l'eseguibile alle librerie da questo usate. Quest'operazione può essere eseguita in due tempi diversi, in fase di compilazione oppure all'avvio del programma. Nel primo caso si parlerà di link statico, nel secondo di link dinamico.

#### Link statico

Il link statico delle librerie avviene direttamente in fase di compilazione. Linker più semplici inglobano nell'eseguibile finale l'intera libreria, mentre quelli più avanzati solo la parte di codice realmente usata, evitando quindi inutile spreco di spazio e riducendo i tempi di avvio del programma e la quantità di memoria principale usata.
Il vantaggio del link statico sta nella facilità di distribuzione dell'eseguibile. Dal momento che tutte le funzioni usate sono già incluse in esso è sufficiente distribuire il solo eseguibile, senza preoccuparsi di eventuali dipendenze o conflitti tra librerie. Tuttavia vi sono molti aspetti tecnici che lo rendono poco preferibile. Questo concetto si capirà meglio affrontando il link dinamico.

#### Link dinamico

Il link dinamico viene eseguito dal linker al momento del caricamento del programma in memoria. In questo caso l'eseguibile è compilato in modo tale da contenere richiami a librerie esterne che il linker dovrà trovare e collegare prima di poter eseguire il programma. Se sul sistema in cui si tenta di eseguire il programma manca una di queste librerie verrà generato un errore. Un errore può essere generato anche nel caso in cui la libreria installata non contenga la funzione richiesta. Questo potrebbe avvenire se non è della versione attesa. Se precedente, infatti, la funzione usata potrebbe non essere ancora stata implementata, mentre se è una versione successiva la funzione usata potrebbe essere stata rimossa. Com'è comprensibile l'uso del link dinamico può comportare non pochi problemi di distribuzione del programma proprio per via delle dipendenze con le varie librerie o i conflitti che si possono generare. Anche le librerie, infatti, possono fare riferimento ad altre librerie, generando così una catena di dipendenze anche molto lunga. Si tratta, tuttavia, di problemi quasi sempre superabili con un'attenta configurazione del sistema. Pur con questi inconvenienti il link dinamico è usato molto spesso perché offre moltissimi vantaggi, tali da compensare i disagi sopra esposti. Questi sono:
* Condivisione delle librerie. Se una libreria è usata da molti programmi il link dinamico permette di installare sul sistema la libreria una sola volta. Non solo, può essere caricata nella memoria principale un'unica volta. Ipotizzando che dieci programmi usino una libreria grande 10 MB il link dinamico fa si che questa sia caricata una sola volta e che quindi occupi solo 10 MB di ram. Diversamente, se la libreria fosse compilata in maniera statica, lo stesso codice sarebbe ripetuto dieci volte nella memoria, occupando 100 MB.
* Minore dimensione dell'eseguibile. Mancando il codice incluso nelle librerie il file eseguibile è più piccolo. Questo comporta un risparmio di spazio a volte consistente, favorendone la distribuzione.
* Migliora la mantenibilità. Se una libreria è stata aggiornata è sufficiente sostituire solo quella per far si che tutti i programmi che l'usano si giovino delle modifiche. Diversamente il link statico obbligherebbe a ricompilare ed aggiornare tutti i programmi. Se la libreria è molto usata questo può richiedere un'operazione molto laboriosa. A titolo d'esempio si può ricordare la scoperta in passato, quasi contemporanea, di un bug all'interno di due librerie molto usate per la visualizzazione di immagini che comportavano seri problemi di sicurezza. La prima, usata su di un sistema in cui i programmi sono compilati in maniera statica, impose l'aggiornamento di numerosi programmi, dal browser e la posta elettronica ai programmi di videoscrittura e di foglio elettronico. La seconda, usata su un sistema in cui i programmi sono tipicamente compilati in maniera dinamica, fu sufficiente modificare la libreria di pochi kb per risolvere definitivamente ed in maniera sicura il problema. Nel primo caso, infatti, l'unico modo che gli utenti avevano per essere sicuri era quello di non usare i programmi incriminati fino a che non fosse disponibile la versione aggiornata. Ma trattandosi di una funzionalità così diffusa era anche difficile per un utente rendersi conto di quali programmi fossero o meno a rischio.

### IDE

L'IDE non è necessario in tutti i linguaggi, ma è sempre consigliato averne uno. Esso aiuta la scrittura del codice, ad esempio colorando le parole in modo diverso, sottolineandole o mettendole in grassetto. È buona norma averne uno, ma esso non deve avere troppe funzionalità, altrimenti "sporcherebbe" il codice, rallentando l'esecuzione del programma