Interpreti e compilatori Programmi Interpreti e compilatori
La programmazione La macchina non può leggere una nostra istruzione scritta con il nostro linguaggio È necessario realizzare un linguaggio di programmazione che possa tradurre ciò che scriviamo nei termini del linguaggio macchina
Due scuole di pensiero Interprete Compilatore
Interprete La prima scuola preferisce scrivere un programma che riconosca le istruzioni nel linguaggio scelto e le esegua. Questo programma chiamato interprete legge un’istruzione dopo l’altra, la traduce e la esegue. Il programma da noi scritto non subisce nessuna trasformazione definitiva e l’interprete dovrà essere utilizzato ogni volta che si intende lanciare il programma.
Compilatore La seconda scuola preferisce preparare un programma che legga il nostro programma (contenuto in un file che verrà detto sorgente) e lo traduca una volta per tutte generando un file eseguibile in linguaggio macchina. Questo file sarà immediatamente comprensibile per l’elaboratore e sarà eseguibile a essere lanciato ogni volta che si riutilizzerà il programma.
Pregi e difetti dell’interprete Pregi: può essere più comodo nella fase di preparazione del software, in quanto si programma e si esegue nel medesimo ambiente. Nel caso di un errore potremmo andare direttamente nel punto sospetto ed effettuare nel punto sospetto ed effettuare la correzione. Difetti: in termini di efficienza del programma in quanto la necessità di tradurlo ogni volta ne rallenta inevitabilmente l’esecuzione.
Pregi e difetti del compilatore Pregi: il programma compilato essendo stato tradotto definitivamente sarà più veloce di un suo equivalente interpretato Difetti: tiene separati l’ambiente di programmazione da quello d’esecuzione . In caso di errore sarà necessario richiamare l’editor con cui abbiamo scritto il programma, aprire il file sorgente, correggerlo, ricompilarlo e eseguirlo.
I concetti chiave del programma Variabile: può essere considerato lo scaffale in cui fingiamo di riporre le nostre informazioni. Se oggetto della nostra operazione è una parola (telefono) dovremo preoccuparci di definire e utilizzare una variabile adatta a contenerla.
Pascal Var parola : string [30]; numero : integer; Ovvero abbiamo una variabile parola che è del tipo string (caratteri alfanumerici) lunga al massimo 30 caratteri. Abbiamo definito anche una variabile numero del tipo integer (solo numeri interi)
Caratteristiche della variabile Nella variabile numero non potremmo mai memorizzare la parola telefono e un eventuale carattere alfanumerico (1e 0) poiché questa caratteristica è invece determinata dalla variabile parola in quanto la presenza di string permette di contenere appunto dei caratteri alfanumerici ma non solo numeri
Se il programma è un algoritmo Come s’è detto varie volte un programma è la traduzione nei termini d’un linguaggio di programmazione del percorso disegnato da un algoritmo. Ora un algoritmo può essere costituito da una serie di istruzioni sequenziali (apri lo schedario, prendi la scheda), ma può anche chiedere di operare delle scelte (prendi la scheda che contiene la parola Ripellino).
Apri lo schedario, prendi una scheda Il primo tipo di operazioni può essere rappresentato da un linguaggio di programmazione come una serie di istruzioni da eseguire una dopo l’altra
Prendi la scheda che contiene la parola Ripellino Il secondo tipo richiede la selezione dell’istruzione da eseguire a seconda del verificarsi di certe condizioni. Questa condizione si può rappresentare tramite un diagramma di flusso.
Diagramma di flusso Es NO SI Leggo parola Parola= Ripellino
Lettura del Diagramma Leggo la variabile parola, il contenuto della variabile parola è uguale alla sequenza di caratteri Ripellino? Se la risposta è si allora esegui le istruzioni a cui porta il lato destro del grafo, se la risposta è no allora gira a sinistra.
In termini di linguaggio di programmazione If parola =‘Ripellino’ then writeln (‘Trovato’) If parola <> ‘Ripellino’ then writeln (‘Non trovato’) If parola = ‘Ripellino’ then writeln (‘Trovato’) else writeln (‘Non trovato’) Gli apici ‘’ prima e dopo il nome di Ripellino indicano al computer l’inizio e la fine di una sequenza di caratteri alfanumerici. Writeln è l’istruzione di stampa del Pascal. L’ultima riga va letta: se trovi ciò che cerchi allora fai questo altrimenti fai quest’altro.
Il cuore del linguaggio di programmazione La capacità di modificare il flusso sequenziale delle istruzioni che compongono un programma al verificarsi di condizioni precise. Ma se non trova ciò che è stato richiesto?
Il loop Una delle caratteristiche principali del computer oltre alla capacità di gestire grandi quantità di dati è quella di poter ripetere una stessa operazione un numero indefinito di volte fino al verificarsi di una determinata condizione. Per questo motivo nel diagramma di flusso di un programma viene racchiusa una serie di istruzioni in un ciclo (loop) che viene eseguito fino a che non venga verificata una certa condizione.
Esempio di loop While (parola <> ‘Ripellino’) or not (eof(archivio)) do begin readln (archivio, parola); End; If parola=‘Ripellino’ then writeln (‘Trovato’) else writeln (‘Non Trovato’);
While do? While…do è l’istruzione che apre il loop, begin e end marcano l’inizio e la fine delle istruzioni del ciclo, in questo caso una solamente, - parola <> ‘Ripellino’ - è la prima condizione di interruzione del loop, or è un operatore logico, not è un operatore di negazione, eof() è una funzione che restituisce true quando incontra la fine del file
Not eof? Not (eof(archivio))costituisce la seconda condizione di fine loop Readln è l’istruzione di lettura Parola è la variabile da leggere, Archivio è il file che contiene i nomi da scorrere.
L’end of file? Il programma seguiterebbe a scorrere il file archivio fino a trovare il nome cercato o fino a che non incontra l’end of file. Il loop si interrompe se la variabile parola è sicuramente uguale a ‘Ripellino’. Altrimenti se non trova la parola ricercata continua il ciclo.
Esempi di linguaggi di programmazione Interprete: BASIC Compilatore: C (linguaggio utilizzato per realizzare sistemi operativi)
Altra piccola distinzione Linguaggi procedurali Linguaggi dichiarativi
Linguaggi procedurale Nel caso di un programma, scritto con questo linguaggio, esso conterrà una serie di ordini dati sequenzialmente alla macchina che li dovrà eseguire
Linguaggi dichiarativi Un linguaggio dichiarativo svolge la funzione di descrivere, ovvero di dichiarare quali sono i dati del problema. Il computer analizzerà i dati e ne dedurrà la risposta da dare. I linguaggi dichiarativi sono più comodi per il programmatore e per l’utente, ma più faticosi per il computer che deve derivare le procedure da seguire dall’analisi del problema che gli viene sottoposto.
Esempi Linguaggi procedurali: Cobol, Pascal, Fortran, BASIC, C Linguaggi dichiarativi: PROLOG
Linguaggi orientati agli oggetti Nascono da due considerazioni: A) i programmatori si sono accorti che certe porzioni del programma possono essere utilizzate più volte, quindi è vantaggioso concepire in modo modulare o dei format i programmi B) nel costruire programmi modulari è spesso utile partire dagli oggetti dei quali il programma si occupa definendone le proprietà e comportamenti e stabilendo fra essi legami e gerarchie.
Facciamo un esempio Supponiamo di scrivere un programma per gestire la vendita delle automobili in un autosalone: Caratteristiche generiche di ogni auto (marca modello cilindrata prezzo ecc) verranno attribuite a un oggetto del nostro programma -- oggetto automobile -- che potremmo utilizzare ogni volta che parliamo di automobile, e che potremmo arricchire con nuove e specifiche caratteristiche a seconda per esempio se si tratti di auto usate o nuove. Possiamo aggiungere categorie oppure attribuire determinati comportamenti.
E nel S.O? La programmazione ad oggetti funziona particolarmente bene per realizzare programmi da utilizzare all’interno di un sistema operativo : icone finestre menù pulsanti
I linguaggi orientati agli oggetti C++ (evoluzione di C) Smalltalk Java