# PL/I

PL/I, (Programming Language One) è un linguaggio di programmazione progettato nel 1964 per lo sviluppo di applicazioni scientifiche, ingegneristiche o commerciali (il suo principale campo di applicazione è l'elaborazione dati). La sintassi del linguaggio rispecchia quella della lingua inglese ed è pensata per poter descrivere e manipolare strutture dati complesse: il PL/I possiede infatti un corredo molto ampio di funzioni, supporta la ricorsione e la programmazione strutturata. I compilatori PL/I sono spesso dei sub-set del linguaggio, indirizzati a specifici settori applicativi.

## Storia

Il PL/I è stato sviluppato dall'IBM all'interno del progetto degli IBM System/360 (S/360): una famiglia di computer compatibili fra di loro per soppiantare i computer sviluppati in precedenza, molto diversi ed incompatibili fra di loro. I nuovi modelli avrebbero dovuto essere utilizzabili sia in campo scientifico che per applicazioni commerciali.
Lo scopo del PL/I era appunto quello di creare un linguaggio unico che potesse essere utilizzato in entrambi gli ambiti (all'epoca la maggior parte delle applicazioni scientifiche usava il Fortran, mentre il COBOL era utilizzato per le applicazioni commerciali). Un altro obiettivo era quello di creare un linguaggio che possedesse i costrutti di programmazione strutturata, derivati dall'ALGOL, che né il Fortran né il COBOL possedevano. Il PL/I fu progettato, nel corso di alcuni mesi, da un comitato costituito da programmatori dell'IBM e da utenti provenienti dagli USA. L'obiettivo principale era quello di avere il PL/I disponibile in concomitanza col lancio degli S/360, ma sfortunatamente ciò non fu possibile.
Originariamente il nome del linguaggio avrebbe dovuto essere NPL (New Programming Language), ma l'acronimo era già utilizzato dal National Physical Laboratory in Inghilterra, e pertanto si scelse PL/I in sostituzione.
Il PL/I non ottenne il successo sperato per vari motivi, il maggiore di quali fu probabilmente la sua complessità che rese molto difficile una sua rapida implementazione. La complessità derivava probabilmente dal fatto che la sua progettazione era opera di un comitato che desiderava soddisfare le esigenze di un pubblico molto eterogeneo. Inoltre il PL/I possedeva caratteristiche molto sofisticate, ma che venivano usate raramente (ad esempio il multithreading), le quali aggiungevano il loro carico di complessità e costi ai compilatori. La complessità del compilatore fu probabilmente uno dei fattori che furono sottovalutati in fase di definizione del linguaggio. L'ottimizzazione del codice ottenuto era molto difficoltosa a causa della necessità di poter modificare le variabili in modo asincrono, rendendo difficile prevedere come una determinata variabile sarebbe stata modificata a run-time.
L'inerente complessità, il ritardo nell'implementazione, la scarsa qualità dei primi compilatori PL/I scoraggiarono gli utenti che si rivolsero di nuovo al COBOL o al Fortran. Un altro grosso problema fu che, all'epoca, i programmatori Fortran, anziché guardare ai vantaggi che il PL/I poteva offrire loro, continuarono a considerarlo un linguaggio per applicazioni commerciali. Ironicamente i programmatori COBOL considerarono il PL/I un linguaggio per applicazioni scientifiche.
Nonostante ciò, il PL/I venne comunque utilizzato: il progetto Multics, uno dei primi tentativi di sviluppare un sistema operativo in un linguaggio ad alto livello, utilizzava il PL/I. Un sottoinsieme del PL/I, il PL/M, fu utilizzato per scrivere il CP/M, mentre il dialetto XPL fu utilizzato per scrivere HAL/S, utilizzato sullo Space Shuttle. Un compilatore sviluppato dalla Cornell University per insegnare un dialetto del PL/I, il PL/C, aveva l'interessante caratteristica di non generare mai errori durante la compilazione di un programma: molti errori di sintassi venivano corretti automaticamente, mentre i rimanenti venivano semplicemente convertiti in istruzioni di stampa sullo schermo. Il linguaggio ETSPL (Extended Telephone Systems Programming Language), progettato per programmare centrali telefoniche, è un sottoinsieme del PL/I (di cui ricalca la sintassi) con alcune eccezioni riguardanti principalmente i tipi di variabili. Con questo linguaggio fu programmata negli USA negli anni settanta la centrale telefonica di transito GTD-3 EAX e, in Italia, la sua versione internazionale GTD-3 EAX I. Il primo sistema di prenotazione voli online (SABRE) fu scritto (o almeno si suppone sia stato scritto) in PL/I.
Il PL/I fu probabilmente il primo linguaggio "commerciale" dove il compilatore fu scritto nel linguaggio da compilare (il linguaggio sperimentale NELIAC fu il primo con questa caratteristica, cinque anni prima del PL/I, e molti altri seguirono).
Il PL/I è stato maggiormente usato nei mainframe IBM, ma ne esistono versioni per Microsoft Windows, AIX, OpenVMS, e Unix.

## Programma di esempio
### Hello, world!

Il seguente esempio stampa il testo "Hello world".

## Curiosità

Dato che il compilatore non vieta l'attribuzione di nomi di variabili uguali a parole riservate (come IF, ELSE e THEN) e che utilizza lo stesso segno ('=') per controllare l'uguaglianza fra due variabili e per eseguire un'operazione di assegnazione è possibile scrivere uno "scioglilingua per compilatori":
Questa parte di codice dovrebbe essere interpretata come: SE la variabile IF è uguale alla variabile THEN ALLORA assegna alla variabile THEN il valore della variabile ELSE ALTRIMENTI assegna alla variabile ELSE il valore della variabile IF.
Questo fa notare come il codice potesse dare atto a problemi di interpretazione.

## Standard

nel 1987 ANSI ha pubblicato
ANSI X3.74-1987 (R1998) Title: Information Systems - Programming Language - PL/I General-Purpose Subset