Caratteristiche e differenza tra programmi e linguaggi in informatica
Programmi e linguaggi
Un elaboratore deve essere in grado essenzialmente di ricevere, trasmettere, manipolare e conservare dati ed informazioni. I dati possono essere di diverso tipo: numerici, testuali (successioni di caratteri), grafici (disegni, immagini), sonori. Per elaborare i dati, occorre fornire alla macchina una serie di istruzioni che realizzino il tipo di elaborazione di cui si ha bisogno: queste formano un programma, che va trasmesso al computer e conservato in memoria per essere successivamente eseguito al bisogno.
Al momento dell’esecuzione, occorre fornire anche dei dati da far elaborare al suddetto programma. Bisogna in pratica:
- inserire nel computer, attraverso la tastiera o un disco, un insieme di informazioni (dati in entrata o in input), che vengono conservate in memoria;
- questi dati in input vengono elaborati dal programma e si ottengono, come risultato, altre informazioni (dati in uscita o in output).
- i dati in output vengono stampati su carta o visualizzati sul monitor.
ESEMPIO
Come esempio di elaborazione, si consideri l’algoritmo che calcola l’area del cerchio tramite la formula area = π • r2. Per eseguire il programma relativo all’algoritmo in oggetto, occorre fornire ulteriormente, come dato in entrata, un valore numerico per il raggio r. Devono essere effettuati pertanto i seguenti passi:
- lettura (read) del valore numerico del raggio del cerchio;
- calcolo del valore dell’area usando l’algoritmo Questo valore, insieme ai dati di input, viene registrato nella memoria del computer;
- stampa (print) dei valori del raggio e dell’area corrispondente;
- stop.
La realizzazione di ognuno di questi passi dell’algoritmo richiede una o più istruzioni: la totalità di queste istruzioni costituisce il programma che calcola l’area del cerchio. Un programma si può intendere, quindi, come il risultato della codifica di un algoritmo, ovvero la codifica è la traduzione di un dato algoritmo, espresso a parole, in una sequenza di istruzioni scritte in un certo linguaggio, istruzioni che formano il programma relativo all’ algoritmo in oggetto.
Un computer deve quindi essere capace di leggere istruzioni di questo tipo, nonché i dati su cui operare. Deve anche essere in grado di memorizzare un’istruzione dopo averla ricevuta, in modo da poter sviluppare le azioni previste dal programma nel loro insieme.
Deve poi essere in grado di sviluppare i conti ed eseguire le operazioni previste, ed infine di trasmettere i risultati all’utente. Per operare in questo modo, l’elaboratore ha bisogno di memoria e di capacità di calcolo, ma ha anche bisogno di comunicare con l’utente. In particolare, la comunicazione avviene tramite le cosiddette periferiche, cioè le unità di ingresso (input) ed uscita (output) dei dati.
Allo scopo di comunicare con un computer, poi, é necessario un linguaggio, inteso proprio nel senso comune, cioè come strumento di comunicazione fatto di parole ben definite, nonché di regole per una corretta combinazione di queste parole (sintassi). Questi linguaggi sono chiamati linguaggi di programmazione. Ne esistono di diversi tipi, di solito meno complessi rispetto ai linguaggi correnti usati comunemente per parlare.
Invece ogni calcolatore ha un suo linguaggio macchina, una specie di linguaggio madre i cui termini la macchina è in grado di interpretare immediatamente. Esso è pur sempre un linguaggio di programmazione, ma in effetti è una collezione di dettagliate istruzioni che controllano i circuiti interni della macchina. I linguaggi macchina sono molto pesanti per l’utente, perché sono complessi per loro natura e perché un programma scritto in un certo linguaggio macchina può essere utilizzato solo su quel tipo di macchine, in quanto ogni tipo di calcolatore ha il proprio insieme di istruzioni particolari. Ovviamente gli schemi espressivi dei linguaggi macchina sono molto lontani da quelli umani. Lo stesso si può dire per quei linguaggi molto primitivi, tipo l’ASSEMBLER, studiati per aderire con facilità a questi schemi espressivi. Adoperare un linguaggio di basso livello, cioè poco evoluto verso le esigenze del programmatore, comporta delle conseguenze negative quali:
- lunghi tempi di codifica degli algoritmi;
- facilità di errore nella codifica a causa della difficoltà della medesima;
- ridotta trasportabilità del programma, legato a quella macchina, o a quel tipo di macchine per cui è stato concepito.
Da qui l’esigenza di creare linguaggi di programmazione sempre più ad alto livello, i cui termini siano abbastanza vicini al modo di pensare e di parlare del programmatore e non alle esigenze della macchina. Il problema della comprensione, da parte delle macchine, di programmi scritti in questi linguaggi di programmazione viene risolto con l’uso dei compilatori, che sono programmi che traducono le istruzioni scritte nel linguaggio originario in istruzioni scritte in linguaggio macchina. Questi traduttori sono quindi dei veri e propri programmi che ricevono in input un programma scritto in un linguaggio ad alto livello, come il Pascal, e che si chiama programma sorgente, e lo traducono in un programma scritto nel linguaggio della macchina, che si chiama programma oggetto. È ovvio che ogni linguaggio ad alto livello ha un proprio esclusivo compilatore.
Il concetto di algoritmo
Gli algoritmi che si usano in Informatica, che sono gli unici che ci interessano, devono avere delle caratteristiche ben precise. Per illustrarle, cominciamo dalla definizione: dicesi algoritmo una successione ordinata di un numero finito di passi (cioè operazioni, istruzioni, azioni) che portano alla risoluzione di un certo problema in un tempo finito.
Possiamo riassumere le proprietà che un algoritmo deve possedere mediante cinque
caratteristiche:
- Definitezza: le azioni devono essere ben definite, non devono esserci ambiguità.
- Eseguibilità: le azioni devono poter essere eseguite da una macchina e quindi devono essere prive di riferimenti aleatori o voluttuari (come “un pò”, “a piacere”, ecc).
- Determinismo: fatto un passo, il successivo è uno ed uno solo, ben determinato.
- Finitezza: il numero di passi deve essere finito.
- Terminazione: l’algoritmo, prima o poi, deve finire.
Quest’ultima condizione non è garantita dalla precedente: possono esistere algoritmi con dei cicli costituiti da un numero finito di azioni che si ripetono all’infinito. A tal proposito, si può considerare l’algoritmo della figura A2: basta togliere l’ultimo rombo perché l’algoritmo non finisca mai.
