Informatica 5 Scrivere e compilare programmi Scrivere programmi • Scrivere programmi significa esprimere un algoritmo in un linguaggio comprensibile al calcolatore, ossia utilizzando un linguaggio di programmazione (ad es.: C++) • Un programma in C++, prima di essere eseguito dal calcolatore, deve essere compilato, ossia elaborato da un compilatore Il compilatore • Il compilatore è anch’esso un programma in funzionamento nel calcolatore, ed ha lo scopo di tradurre programmi scritti in un linguaggio di programmazione in eseguibili, ossia programmi scritti nel linguaggio macchina • Le istruzioni scritte in linguaggio macchina possono essere lette, decodificate, ed eseguite direttamente dal processore .cpp e .exe • Il programma scritto in C++ prende si chiama anche codice sorgente, e il nome del file ha la tipica estesione .cpp (ad es.: prova.cpp) • Il codice sorgente viene compilato e, se tutto va bene, viene creato il corrispondente codice eseguibile, con estensione .exe (ad es.: prova.exe) • Il codice eseguibile è pronto per essere eseguito dal calcolatore codice sorgente … for (i=0;i<10;i++){ v[i]++; } … prova.cpp Compilatore C++ codice eseguibile … 000101010101011 101010101111010 … prova.exe La compilazione • Il processo di compilazione consiste di 3 tipi diversi di analisi • L’analisi lessicale controlla che siano usate parole corrette del linguaggio di programmazione (ad es.: for , if , ofr ) • L’analisi sintattica controlla che le istruzioni siano costruite in maniera corretta (ad es. for(i=0;i<10;i++) , (i=0; for) ) • L’analisi semantica analizza il significato delle istruzioni (ad es.: “x = x+5;” = “prendi x e aggiornalo sommando 5”) Limiti della compilazione • Il programmatore deve fare attenzione • Il successo delle suddette tre analisi non è garanzia del buon funzionamento del programma • Un programma scritto correttamente in C++ può non rispettare le specifiche perché il programmatore ha scritto un codice che differisce da quanto ha intenzione di realizzare Un esempio di programma #include <iostream> using namespace std; int main(){ cout << “Hello, world!\n”; “cout” è un comando di output che return 0; consta di un insieme di sottocomandi che devono essere eseguti dal } calcolatore perché si completi l’operazione di output. I comandi che costituiscono “cout” sono definiti nella libreria “iostream”, che deve essere inclusa nel programma affinché il compilatore comprenda il significato di “cout” Il linker • Il compilatore, per completare il suo compito, fa ricorso a un altro programma, chiamato linker • Il linker connette il main a tutte le librerie incluse al suo interno, in modo da creare un unico eseguibile in cui siano presenti le definizioni di tutti comandi utilizzati nel main Compilatori e interpreti • La distinzione tra compilatori e interpreti è la seguente • Un compilatore analizza l’intero codice sorgente e poi produce un eseguibile • Un interprete analizza, traduce e fa eseguire al calcolatore una istruzione per volta • Nell’ambito del C++ si hanno solo compilatori, mentre per altri linguaggi di programmazione (come ad es. Java) esistono degli interpreti