ALGOL

ALGOL (abbreviazione di ALGOrithmic Language, ossia linguaggio algoritmico) è un linguaggio di programmazione sviluppato nel 1958. In un certo senso fu una reazione al Fortran; introdusse concetti fondamentali come lo stack dei record di attivazione e per certi versi si può considerare capostipite di una grande famiglia di linguaggi di notevole successo, dal Pascal al C.

Per una trentina d'anni è stato lo standard de facto con cui si rappresentavano gli algoritmi. L'ALGOL utilizza blocchi di istruzioni delimitati da coppie di begin ed end (come il Pascal); è stato il primo linguaggio ad usare questa sintassi molto utilizzata anche in didattica: frammenti di sintassi simile all'ALGOL sono tuttora utilizzati a volte come notazione per gli algoritmi chiamata Pidgin Algol.

Esistono tre versioni ufficiali di ALGOL: ALGOL 58, ALGOL 60 ed ALGOL 68. Di queste, solo ALGOL 60 si è diffusa (Niklaus Wirth basò il proprio Algol-W sull'ALGOL 60 prima di cominciare a sviluppare il Pascal). I nomi ufficiali delle versioni di ALGOL sono dovuti all'anno di pubblicazione. L'ALGOL 58 era conosciuto originariamente come IAL (l'acronimo di International Algorithmic Language.)

Storia 
L'ALGOL è stato sviluppato congiuntamente da un comitato di informatici statunitense ed europeo. Esistono tre differenti sintassi: una sintassi di riferimento, una sintassi per la pubblicazione ed una per l'implementazione. Le differenti sintassi permisero di usare differenti parole chiave e convenzioni per i punti decimali (punti o virgole) a seconda della lingua utilizzata.

John Backus sviluppò il metodo di descrizione dei linguaggi di programmazione detto Backus normal form (BNF) specificatamente per l'ALGOL 58. È stato rivisto ed ampliato da Peter Naur nella Backus-Naur form per l'ALGOL 60. Sia Backus che Naur fecero parte del comitato che creò l'ALGOL 60. L'ALGOL 60 ispirò molti dei linguaggi che seguirono; la citazione canonica a questo proposito è dovuta a C. A. R. Hoare: "ALGOL fu un grande progresso sui suoi successori". La citazione completa è: "Qui c'è un linguaggio così avanzato che non è solo un miglioramento rispetto ai predecessori ma anche rispetto ai propri successori" ma l'aforisma è più conosciuto. A volte viene attribuito erroneamente a Edsger Dijkstra, conosciuto per le acute osservazioni, che collaborò all'implementazione del primo compilatore per ALGOL 60.

Il B5000 della Burroughs Corporation ed i suoi successori erano macchine a stack progettate per essere programmate mediante varianti estese dell'ALGOL 60, conosciute come Elliot ALGOL; effettivamente il loro sistema operativo chiamato MCP (Master Control Program) era scritto in Elliot ALGOL fin dal 1961. La Unisys Corporation vende ancora computer che discendono dal B5000, utilizzano l'MCP e supportano vari compilatori di Elliot ALGOL.

ALGOL 60 ufficialmente non possedeva istruzioni di I/O; le varie implementazioni necessariamente dovettero implementarle ma il modo variava da un'implementazione all'altra. ALGOL 68 offrì invece una completa libreria di istruzioni di transput (il termine usato da ALGOL 68 per indicare l'Input/Output).

L'ALGOL 60 era dotato di due modalità di passaggio dei parametri: il più comune è detto passaggio per valore, l'altro chiamato passaggio per nome non è mai stato adottato da nessun altro linguaggio di programmazione successivo. Il passaggio per nome aveva alcune limitazioni rispetto al passaggio per riferimento, facendone una caratteristica indesiderata nella progettazione del linguaggio. Per esempio, è impossibile con l'ALGOL 60 sviluppare una procedura che scambi i valori di due parametri se i parametri sono passati mediante una variabile intera ed un array indicizzato mediante la stessa variabile intera.

L'ALGOL 68 è stato definito mediante un formalismo chiamato grammatica a due livelli creato da Adriaan van Wijngaarden e dal quale ha preso il nome. Le grammatiche di Van Wijngaarden utilizzano una grammatica libera dal contesto per generare un insieme infinito di produzioni che permettono di riconoscere un particolare programma in ALGOL 68; sono in grado di esprimere il tipo di richieste che in molti altri standard di linguaggi di programmazione vanno sotto il nome di semantica e devono essere espresse in linguaggio naturale non ambiguo ed in seguito implementati nei compilatori come codice ad hoc collegato col parser del linguaggio formale.

Esempio di programma (ALGOL 60) 
Il modo in cui deve essere scritto il testo in grassetto dipende dalla particolare implementazione (es. 'INTEGER' in luogo di 'integer').

 procedure Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k);
     value n, m; array a; integer n, m, i, k; real y;
 comment The absolute greatest element of the matrix a, of size n by m
 is transferred to y, and the subscripts of this element to i and k;
 begin integer p, q;
     y := 0; i := k := 1;
     for p:=1 step 1 until n do
     for q:=1 step 1 until m do
         if abs(a[p, q]) > y then
             begin y := abs(a[p, q]);
             i := p; k := q
             end
 end Absmax

Hello world 
Poiché ALGOL 60 non possiede istruzioni di I/O native, non esiste una versione di "Hello World" portabile. Il codice seguente può essere eseguito sull'implementazione di ALGOL per i mainframe Burroughs A-Series ed è tratta da questo sito:

 BEGIN
 FILE F (KIND=REMOTE);
 EBCDIC ARRAY E [0:11];
 REPLACE E BY "HELLO WORLD!";
 WHILE TRUE DO
   BEGIN
   WRITE (F, *, E);
   END;
 END.

Un esempio alternativo che utilizza le primitive di I/O dell'Elliott ALGOL è presentato qui di seguito. In realtà l'Elliott ALGOL usa caratteri differenti per 'inizio-stringa' e 'fine-stringa':

  program HiFolks;
  begin
     print ‘Hello world’;
  end;

Altri progetti

Collegamenti esterni 
 
 
 
 
 
   (analisi numerica) 
   PDF
  T. J. Dekker  
  P. W. Hemker  (1971) (equazioni differenziali) 
  N. Temme  
  Un articolo  di Charles Lindsey che spiega la nascita del linguaggio e probabilmente sfata alcuni miti.
  La sintassi dell'ALGOL 60 in BNF.
   A tutorial on Algol 68
   

Linguaggi di programmazione procedurali
Linguaggi di programmazione imperativi
Linguaggi di programmazione strutturati