# Compilare un programma (superiori)
## Compilare i Programmi

Un programma è una serie di comandi, ovvero un algoritmo, che eseguiti dal computer permettono di risolvere un problema, che può essere virtuale, come calcolare i punti di una funzione, o reale, come dare energia a un attuatore per muovere il braccio di un robot. Il computer è in grado di eseguire comandi in linguaggio macchina compatibile con la CPU utilizzata: tali comandi sono lunghe sequenze binarie del tipo 0001 0010 1010 0110 (CPU didattica LC-3) che risultano facili da leggere per il computer ma ostiche per il programmatore poiché basta invertire per sbaglio anche un solo bit della sequenza per impartire un comando diverso da quello voluto.
Nel linguaggio C, di medio livello, i comandi sono del tipo if (a>5) b=34; una inglese semplificato con elementi di matematica, abbiamo bisogno di convertire i comandi espressi nel linguaggio di medio o alto livello nel linguaggio macchina del computer, questa traduzione è svolta da particolari programmi chiamati compilatori, nel nostro caso il Dev C++ che, seppur non aggiornato ufficialmente dal 2005, è usato ufficialmente nelle Olimpiadi dell'Informatica italiane.
Durante la fase di creazione di un programma eseguibile ( i file con estensione .EXE o .COM) ci sono due passaggi principalmente:
* tramite un TEXT EDITOR si scrive il programma in C e lo si salva come file codificato in ASCII ma invece di usare l'estensione dei file .TXT l'estensione del file per convenzione del linguaggio C e' .C , un text editor e' un programma per la scrittura del testo (come notepad), cosa vuol dire codificato in ASCII ? significa che le lettere che abbiamo digitato sulla tastiera sono state scritte ciascuna come un numero binario a 8 bit , ad esempio se abbiamo scritto la lettera A maiuscola questa e' diventata la sequenza binaria 01000001 ( che nel sistema decimale equivale al numero 65) , se si premeva B la codifica diventava 01000010 (numero 66) notate anche che la sequenza numerica che descrive le lettere dell'alfabeto e' crescente 65 66 etc come pure quella delle lettere minuscole 97 98 etc) , la tabella ascii stabilisce la corrispondenza fra le lettere e le codifiche binarie, spesso questa tabella viene ampliata scrivendo anche l'equivalente numero decimale o esadecimale della sequenzaq binaria
in questa tabella ASCII non compaiono le sequenze binarie ma solo i corrispondenti numeri decimali ottali e esadecimali, nota che se scrivi CIAO in pratica hai scritto 4 numeri 67 73 65 79 se ora aggiugi 32 ad ogni numero ottieni 99 105 97 111 cioe la parola ciao in sostanza per trasformare un testo tutto maiuscolo in minuscolo o viceversa basta aggiungere o togliere 32 alla codifica di ciascuna lettera un carattere (char) e' memorizzato come un numero intero che può assumere valori fra 0 e 255 cioe fra la sequenza binaria 00000000 e 11111111 un carattere nel c e' gestito internamente come un intero e solo in fase di decodifica di quella sequenza binaria che il numero 65 viene visualizato come 65 o come A *
* la compilazione converte le istruzioni in C in istruzioni macchina e le salva in un file con estensione .OBJ , questo non e' ancora il file eseguibile, i programmi sono spesso dati dall'unione del vostro file .OBJ con altri file .OBJ ( scritti o da voi o da altri programmatori che possono averli anche scritti inizialmente con linguaggi diversi dal C e poi compilati in .OBJ) esterni che avete scelto indirettamente specificando delle particolari librerie (scritte nelle prime righe del vostro file di testo e del tipo #include graphic.h ) , l'unione avviene mediante un programma chiamato linker che unisce tutti gli OBJ e li trasforma finalmente nel file .EXE
Mentre con un compilatore a riga di comando i due ordini di compilazione e link sono separati, nel Dev C++ per comodità sono richiamati in rapida successione tramite un unico tasto( nella configurazione del DevC++ potete trovare il comando di link impartico e aggiungere anche delle opzioni o specificare i file OBJ da aggiungere)*