I linguaggi di programmazione

Trovato l'algoritmo occorre rappresentarlo in un sistema formale che consenta di comunicarlo alla macchina che lo deve eseguire o ad altre persone. Questo significa trasformare l'algoritmo concettuale in un insieme di istruzioni ben definite e rappresentarle in modo chiaro e non ambiguo. Nel caso dei computer, il sistema formale che consente di descrivere l'algoritmo è rappresentato dal linguaggio di programmazione che fornisce una varietà di approcci, noti come paradigmi di programmazione, per affrontare l'atto e il processo della programmazione, ovvero la traduzione nel linguaggio adottato dell'algoritmo.

I linguaggi di programmazione sono definiti da un insieme di regole grammaticali, o sintassi, che consentono di decidere se una istruzione è ben formata, ovvero scritta correttamente. I linguaggi di programmazione sono stati introdotti per facilitare il compito di scrittura dei programmi ai programmatori; sono linguaggi simbolici che si sono evoluti sempre più verso sistemi di codici complessi e potenti, orientati più all'uomo che alla macchina.

Ad esempio in un linguaggio ad alto livello (come ad esempio PASCAL) per sommare due grandezze e assegnarne il valore ad una terza, potremmo usare l'istruzione:
semiperimetro := base + altezza

Nel linguaggio assemblatore, sempre simbolico ma specifico della singola macchina, si potrebbe dire:
LOAD x
ADD y
STORE Z

Infine nel linguaggio binario usato dalla macchina questa stessa istruzione potrebbe essere tradotta nella sequenza di 0 e 1, totalmente illeggibile per l'uomo, ma perfettamente non ambigua per la macchina:
0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0

Il concetto che ha permesso questa evoluzione è stata l'idea di traduzione di un programma nel linguaggio nativo della macchina, l'unico che tiene conto della sua architettura. Questo ha consentito di scrivere programmi che possono essere eseguiti su diverse macchine, perchè basta predisporre una volta per tutte un traduttore, il programma compilatore.

Si può facilmente comprendere che per predisporre un compilatore, occorre che le regole grammaticali del linguaggio siano espresse in modo non ambiguo. Sono stati definiti allo scopo numerosi strumenti formali per la descrizione sintattica dei linguaggi: tavole sintattiche, grammatiche, notazione di Backus. Il compito di un compilatore è quello di ricevere un programma sorgente, scritto dal programmatore, e di produrre un linguaggio oggetto, eseguibile da una macchina.

Nei 50 anni circa della storia dell'informatica sono stati scritti centinaia di linguaggi. Tracciamo una breve sintesi della loro evoluzione:

Anni 50

Si fa strada e si impone dopo qualche scetticismo l'idea che i linguaggi ad alto livello siano affidabili ed economicamente possibili. Si cerca un compromesso tra espressività del linguaggio che il programmatore deve usare e efficienza di esecuzione del programma da parte del calcolatore.
Di questi anni ricordiamo tra i principali:

  • FORTRAN, che introduce l'importante concetto di sottoprogrammi che lavorano su dati comuni
  • ALGOL, che introduce il concetto di struttura dei programmi e di procedure ricorsive, ovvero che richiamano sè stesse
  • COBOL che introduce il concetto di FILE e di descrizione dei dati

Anni 60

Vengono introdotte notazioni per la descrizione dei linguaggi e viene posta meno enfasi sulla efficienza della computazione, ma più attenzione al modello di computazione. Sono gli anni in cui si comincia a parlare di computazione simbolica e non solo numerica e si cominciano a vedere programmi, non solo per il calcolo scientifico, ma anche per gestire informazioni non numeriche.
Di questi anni ricordiamo tra i principali:

  • LISP, che introduce uniformità tra dati e programmi e introduce un paradigma di programmazione diverso basato sul concetto di funzione
  • APL, nato come linguaggio matematico, ricco di notazioni e operatori per operare su strutture matematiche come vettori e matrici
  • SNOBOL, che offre strumenti utili per la manipolazione di sequenze di caratteri

Anni 70

La programmazione è diventata una attività complessa che coinvolge spesso decine di persone sullo stesso programma, che inoltre deve essere mantenuto nel tempo, introducendo modifiche. Queste operazioni iniziano a diventare molto costose perchè i programmi sono spesso poco leggibili. Si enfatizza perciò la necessità di introdurre metodologie chiare di programmazione e linguaggi che la supportino, che facilitano cioè la scrittura di programmi che supportino la metodologia scelta.
Di questi anni ricordiamo tra i principali:

  • PASCAL, che nasce proprio con l'intento di insegnare la programmazione strutturata, una possibile risposta alla necessità di scrivere programmi adottando una metodologia

La differenza di espressività dei diversi linguaggi o la loro somiglianza, può apparire dall'analisi diei seguenti programmi scritti in linguaggi diversi per risolvere lo stesso semplice problema:

sommare i numeri dispari in un insieme di numeri dati e riportarne la somma.
sm_dispari_pascal, in Pascal
sm_dispari_apl, in APL
sm_dispari_forth, in FORTH. andamento sullo stack
sm_dispari_logo, in LOGO
sm_dispari_lisp, in Lisp

inizio lezione Lezione 1. I linguaggi di programmazione

Copyright © 2002. Alberti. DSI, Università degli Studi di Milano.
argomento precedente argomento prossimo