I programmi traduttori
Il computer è in grado di eseguire soltanto istruzioni in linguaggio macchina; il programma codificato in un linguaggio di programmazione viene tradotto in linguaggio macchina da programmi traduttori chiamati assemblatori per la traduzione del linguaggio Assembler e compilatori o interpreti, secondo il modo in cui operano, per la traduzione dei linguaggi ad alto livello.
Per ogni linguaggio esiste un programma traduttore specifico; per alcuni esiste un interprete, per altri un compilatore, a volte sia un interprete che un compilatore.
Per esempio per i linguaggi Pascal e C/C++ ci sono dei compilatori, per il linguaggio Visual Basic, sebbene sia più diffuso l’utilizzo con l’interprete, esistono anche compilatori.
Java ha un compilatore che traduce il programma sorgente in un linguaggio intermedio, che poi viene interpretato dalla Java Virtual Machine.
Assemblatori e compilatori creano un programma oggetto, traduzione del programma sorgente in linguaggio macchina.
Il programma oggetto deve essere linkato per produrre un programma eseguibile prima di poter essere eseguito.
Il programma sorgente
Le istruzioni del programma vengono memorizzate in un file che contiene il programma sorgente, cioè il programma scritto nel linguaggio di programmazione.
Il programma sorgente viene scritto con un editor, un programma di utilità che consente di inserire e memorizzare un testo e di modificarlo successivamente per effettuare aggiunte o correzioni.
Il compilatore
Il compilatore è un programma che traduce un programma sorgente scritto in linguaggio ad alto livello in un programma oggetto in linguaggio macchina.
Il lavoro del compilatore si divide nelle fasi di analisi e di sintesi.
Il compilatore può operare in una o più passate; i compilatori a una passata sono più veloci.
L’analisi si divide in:
-
analisi lessicale (eseguita dallo scanner), che individua le parole del vocabolario e costruisce la tabella dei simboli;
-
analisi sintattica (eseguita dal parser), che controlla se le frasi sono scritte rispettando la sintassi del linguaggio cioè le regole della grammatica; durante questo processo viene creato l’albero sintattico (parse tree) relativo al programma;
-
analisi semantica, che controlla la validità del significato degli elementi in base al contesto (per esempio la presenza delle istruzioni dichiarative necessarie, il tipo delle costanti e delle variabili in operazioni di assegnazione, la validità degli operatori in espressioni aritmetiche, la correttezza del numero e tipo dei parametri passati nelle chiamate a sottoprogrammi ecc.).
L’analisi permette di verificare la correttezza del programma.
Il compilatore individua e segnala tutti gli errori formali.
Se ci sono errori la traduzione non può avvenire.
Se non ci sono errori il compilatore passa alla fase di sintesi durante la quale effettua la traduzione vera e propria e genera il codice oggetto, di solito in formato rilocabile, e produce l’elenco dei simboli rilocabili.
La fase di sintesi può essere preceduta da una traduzione del programma in un codice intermedio e da una fase di ottimizzazione del codice, che permette di ottenere un programma più efficiente, cioè che utilizza meno risorse di calcolo (memoria e CPU).
La generazione del codice oggetto dipende dalla piattaforma utilizzata (processore e sistema operativo).
La fase di analisi di un compilatore è indipendente dalla piattaforma, ma la fase di generazione del codice deve essere adattata per ogni piattaforma. La possibilità di adattamento del compilatore a piattaforme diverse viene detta portabilità. Il passaggio della traduzione attraverso un linguaggio intermedio favorisce questa caratteristica.
Il programma oggetto prodotto dal compilatore deve essere linkato per produrre un programma eseguibile.
Il linker
Il linker trasforma il programma oggetto in programma eseguibile.
Il programma oggetto realizzato dall’assemblatore o da un compilatore non può essere eseguito in modo autonomo (anche se può essere eseguito per esempio all’interno di un ambiente integrato).
Per creare un programma eseguibile bisogna che al programma oggetto siano collegati dei moduli di sistema (supporto run-time) che rendono disponibili delle funzioni necessarie al programma. Il collegamento dei moduli di sistema è effettuato dal linker.
Il linker permette anche di collegare più moduli oggetto per creare un unico programma eseguibile.
L’interprete
L’interprete è un programma che traduce le istruzioni del linguaggio ad alto livello in linguaggio macchina, una per una, al momento dell’esecuzione.
L’esecuzione può iniziare subito dopo la scrittura del programma sorgente.
L’interprete permette di lavorare in un ambiente interattivo per la realizzazione dei programmi.
Perché un programma possa essere eseguito, l’interprete e il programma devono essere contemporaneamente in memoria centrale.
L’interprete procede istruzione per istruzione, sul programma sorgente: controlla l’istruzione, la traduce in linguaggio macchina e la esegue.
Le istruzioni di un ciclo vengono tradotte ogni volta che il ciclo viene percorso.
Se un’istruzione (per esempio di un ramo di una istruzione condizionale) non viene eseguita, non viene controllata e potrebbe presentare degli errori che non vengono individuati.
L’interprete non crea un programma oggetto.
Se l’interprete riscontra un errore formale nella scrittura di una istruzione, segnala l’errore e interrompe l’esecuzione del programma.
Vantaggi | Svantaggi | |
---|---|---|
Compilatore |
|
|
Interprete |
|
|
Ambienti di programmazione IDE e RAD
Gli ambienti di sviluppo IDE (Integrated Development Environment, o ambienti di sviluppo intergrati) sono ambienti di programmazione con interfaccia grafica che offrono tutti gli strumenti necessari all’implementazione di un programma: editor, interpete o compilatore e linker, debugger ecc.
RAD (Rapid Application Development) è un approccio per rendere più rapido lo sviluppo di applicazioni tramite modelli e strumenti per il disegno dell’interfaccia grafica o addirittura la produzione automatica del codice (per esempio tramite Wizard che generano il codice in base a scelte impostate dal programmatore).