Sua Maestà Ada

Il Linguaggio della Certezza

Ada, come Internet, nacque per decisione del DoD (Dipartimento della Difesa dell'USA) con obiettivi chiari e precisi: creare un nuovo linguaggio di programmazione di alto livello, completo, chiaro e molto leggibile adatto a scrivere applicazioni embedded, mission-critical, distribuite e real-time da utilizzare nei missili, aerei, sommergibili nucleari... Cioè, un linguaggio che deve impedire a monte la presenza di bug che potrebbe provocare un disastro con perdite di vite umane. Perciò Ada è massiciamente presente nella Boeing 777 (quasi il 99% del software di controllo è stato scritto in Ada), negli Airbus, nei treni ad alta velocità e nei satelliti. Il software scritto in Ada dal DoD doveva anche integrare o sostituire quelli già scritti in altri linguaggi.

Ada potrebbe essere visto come una vastissima opera di normalizzazione del software per il DoD.

Siamo alla fine degli anni '70 del secolo scorso. Una ingente somma di danaro (si parlava di 50 milioni di dollari come cifra iniziale), una grande équipe composta da scienziati ed esperti provenienti da diversi settori del mondo accademico e dell'industria, tutti riuniti per un unico obiettivo: creare il linguaggio perfetto.

Dopo una lunga ed attenta analisi di una ventina di linguaggi esistenti, è stato scelto il Pascal come base per il nuovo linguaggio. La ragione è più che evidente. La potenza, la chiarezza, l'espressività, il rigore unito alla semplicità e l'eleganza hanno sempre distinto il Pascal.

La somiglianza con il Pascal è anche nell'attribuzione del nome al linguaggio. In effetti, mentre il nome Pascal è stato dato al linguaggio in onore allo scienziato Blaise Pascal, il nome Ada è stato attribuito in onore alla scienziata Augusta Ada, contessa di Lovalace, considerata il primo programmatore della storia.

La prima versione ufficiale di Ada uscì nel 1983 denominata appunto Ada83, la seconda nel 1995 denominata Ada95 e l'ultima nel 2005 denominata Ada2005.

Più o meno come è successo con Internet, Ada finì per uscire fuori dal campo militare ed entrare nel mondo civile. La differenza è che mentre Internet fu all'inizio un progetto segreto, Ada era un progetto praticamente aperto e molto noto.

Ada, oggi, è un linguaggio completo, sicuro e di successo visto che ha raggiunto tutti gli obiettivi prefissati. Perciò, il linguaggio è utilizzable per scrivere sofware per il controllo delle apparechiature e degli strumenti di bordo negli aerei, nei treni ad alta velocità, nelle apparecchiature mediche ed in tutti i settori dove l'affidabilità e la sicurezza non sono degli optional.

Ma com'è questo Ada?

Eccolo!

with Ada.Text_IO;
 procedure Hello is
 begin
   Put_Line ("Hello World!");
end Hello;

Come potete ben notare, la somiglianza con il Pascal non è del tutto casuale. Perciò, per i programmatori Pascal, il passaggio ad Ada è praticamente indolore finché non si comincia ad utilizzare le caratteritiche avanzate del linguaggio della contessa.

Un Linguaggio Ridondante

Molti ritengono che Ada sia un linguaggio rigido e ridondante. Questo è vero soprattutto per chi proviene dal C o da Perl dove il programmi scritti in questi linguaggi sono veloci da scrivere ma diventa una pena leggerli. Ada è praticamente tutto il contrario. I programmi Ada sono lunghi da scrivere, a causa della verbosità del linguaggio, ma sono molto chiari da leggere e capire. In effetti sembrano auto-documentati. Questa è una qualità da non sottovalutare quando si tratta di scrivere programmi lunghi e complessi.

La rigidità di Ada deriva dal fatto che i programmi debbono essere codificati nel modo più corretto possibile ed il compilatore tollera poco o niente delle acrobazie normalmente ammesse e a volte anche incoraggiate in altri linguaggi. Per rendere più chiara questa idea, si dice che il linguaggio C tratta i programmatori come degli adulti, il Pascal li tratta come dei monelli, mentre Ada li tratta come dei criminali. In effetti, i compiltaori Ada fanno più di 3000 test di controllo sul codice prima di compilarlo in esecutivo. In più il DoD non permette che sia scritta una versione mini o incompleta di Ada. Cioè applica la legge del tutto o nulla. I compilatori Ada debbono essere certificati. Così, solo poche aziende si sono permessi di concedersi il lusso di scrivere compilatori Ada.

Così, quasi sempre, un programma scritto in Ada una volta che è stato compilato senza errori ed avvertimenti girerà correttamente come previsto e senza problemi. Contrariamente ad altri linguaggi la compilazione in codice eseguibile non implica sempre che il programma giri oppure è immune dagli errori. Cioè sono di tipo "compila e prega". Grazie ad Ada sono stati scritti programmi con svariati milioni di linee di codice utilizzati in attività critiche dalle quali dipende la vità di milioni di persone ed almeno finora, sembra che tutto continui ad andar bene.

Perché Ada non è così diffuso?

La diffusione di un linguaggio di programmazione, o di un sistema operativo, non è stata mai sinonimo di qualità. Diversamente non riusciremo mai a spiegarci perché il Visual Basic è prevalso su Delphi oppure il DOS sul Mac, Amiga ed OS/2. Ci sono altri fattori che entrino in gioco per rendere un linguaggio popolare ed adottato dalle masse dei programmatori. Secondo la maggior parte dei sosenitori di Ada ci sono due fattori che hanno impedito la diffusione su larga scala di Ada. Il primo è un sostegno continuo ed un marketing martellante come già è avvenuto con Java della Sun oppure C# della Microsoft. Il secondo è la complessità di Ada. Cioè, un linguaggio avrà successo quando nasce piccolo con funzionalità limitate ma cresce gradualmente nel tempo. In questo modo impararlo non richiede molte risorse all'inizio. Java per esempio è nato e cresciuto secondo questo principio, mentre il C++è un'estensione di un linguaggio relativamente piccolo e molto diffuso che è il C. Ada, invece, è nato completo, coerente, unitario e standardizzato e quindi sembrava all'epoca mastodontico ed indomabile da spaventare un neo-arrivato.

Per ironoia della sorte, oggi, Java e particolarmente il C++, a causa delle continue estensioni, sono molto più complessi e caotici di Ada. In più non sono adatti a scrivere applicazioni mission-critical, paralleli e distribuiti come è nella natura di Ada.

Secondo il mio personale parere, i due precedenti fattori sono imprtanti, ma fino ad un certo punto a condizionare così tanto la diffusione di Ada. C'è un altro fattore forse più importante di entrambi. L'incompatibilità con il linguaggio Pascal a livello di sintassi. In quegli anni il Pascal godeva di una grande diffusione e di un enorme successo. Se Ada fosse stato un super set del Pascal avrebbe trascinato la maggior parte dei programmatori pascal. Esattamente come fece il C++ con il C. In effetti, l'autore del C++ è stato estremente "furbo" nel rendere il nuovo linguaggio completamente compatibile con il vecchio. In questo modo, il nuovo arrivato al C++ dal C poteva continuare ad usare il C insieme a tutte le librerie già disponibili ed introdursi graduilamente alle novità del C++. In altri termini, i precedenti investimenti ed il know-how sono stati totalmente capitalizzati.

La limitata adozione di Ada da parte dei programmatori è causata anche dalla diffusa abitudine di sviluppare la maggior parte del software in circolazione. Sembra che scrivere software oggi sia diventato un'attività simile a quella del bricolage e non dell'ingegneria. La mancanza di un design dell'intero ciclo di vita del software è diventata una cosa abbastanza diffusa. Nella maggior parte dei casi quando si inizia a scrivere un nuovo software si improvvisa tutto come se si trattasse di un'opera d'arte e non di ingegneria. Cioè, si inizia così come capita, poi si procedere con migliorie, estensioni e caccia agli errori. Se questa prassi può andare bene per una piccola applicazione, diventa controproducente quando la stessa applicazione cresce e supera la soglia della criticità.

Ci vediamo tra dieci di anni

Dalla sua prima uscita ufficiale, cioè Ada83 (nel 1983), fino ad oggi, fine 2007, abbiamo assistito all'uscita di solo due versioni; cioè Ada95 (del 1995) e Ada 2005. Ada95 ha rappresentato una naturale evoluzione di Ada83 con notevoli estensioni tra le quali quella della programmazione ad oggetti da diventare il primo linguaggio Object Oriented standardizzato (ISO/ANSI) nella storia. Ada 2005, invece, ha aggiunto solo piccole migliorie ed aggiunte alla libreria standard di Ada95, come quella della programmazione numerica (numeri complessi, calcolo matriciale...). Quindi, in 27 anni abbiamo assistito solamente a due release di Ada. Ciò implica che la prossima versione la vedremmo tra una decina di anni! Una cosa però è certa, tutto quello che abbiamo scritto per Ada95 oppure Ada2005 girerà sulla prossima versione di Ada, al limite con pochissime modifiche anche nel caso di applicazioni parallele, distribuite e mission critical anche nel caso software per computer con più processori.

Come linguaggio standard, la prossima revisione di Ada avverrà nel 2015. Questo significa che abbiamo tutto il tempo di lavorare con un linguaggio così maturo e completo da non richiedere aggiornamenti a brevi termini, soprattutto quando si tratta di scrivere software per computer con più processori. In effetti, dal lontano 1983, Ada ha già di serie il multitasking.

La ragione di tutto ciò è che il linguaggio Ada è stato progettato e realizzato per scrivere software dove la corretteza ed il funzionamento per lunghi periodi senza modifiche sono di primaria importanza e dove un errore nel software potrebbe provocare una catastrofe. In altri termini, un normale software scritto in Ada è in qualche modo certificato.
Se confrontiamo questa filosofia di sviluppo del software con quella, per esempio, proposta dalla Microsoft, l'azienda che produce il maggior numero di strumenti di sviluppo al mondo, notiamo una sostenaziale divergenza. La tecnologia .NET della Microsoft che appena aveva raggiunto la prima versione, annunciò già la seconda versione ed ora annuncia la terza e così via. Questa continua e frenetica evoluzione della piattaforma .NET obbliga lo sviluppatore ad un continuo aggiornamento che alla fine risulterà favorevole solo alla Micorosoft.

La dichiarazione della Micorosft di aver abbandonato lo sviluppo del Visual Basic a favore della nuova tecnologia .NET ha provocato una seria preoccupazione presso le decine e decine di migliaia di programmatori VB di tutto il mondo. Allora, che deve fare un povero programmatore che ha tanto investito ad imparare ed utilizzare il VB? Seguire la Micorosft con tutte le sue frenesie, oppure continuare ad utilizzare un prodotto senza nessun futuro? Ma chi garantisce che tra qualche anno la Micorosoft non decida per una nuova tecnologia ed abbandonare la piattaforma .NET? Nessuno. Questo è un vero dilemma.

Questo problema non si pone minimamente per chi sviluppa in Ada anche per un futuro abbastanza lontano. In altri termini, l'investimento in Ada è sicuro e duraturo da garantire quasi sempre le qualità di un software certificato senza l'affanno di aggiornarsi in continuazione oppure il rischio di trovarsi a lavorare un giorno con una tecnologia obsoleta e superata.

Tutti sappiamo che la maggior parte degli sviluppatori utilizza strumenti bacati e produce software bacato con il rischio di un blocco del computer e peggio ancora con la produzione di risultati sballati in qualsiasi momento. Ormai l'utente sembra accettare questa situazione e non farci più caso. Il software bacato è diventato una norma e non più un'eccezione. La situazione rimarrà tale finché vediamo prevalare il look, la ricchezza di feature anche se non le utilizziamo. La falsa esigenza di rilasciare senza sosta nuove versioni di software apparentemente più bello e continuare a credere che il software deve essere per forza bacato è molto dannosa ed eticamente inaccettabile. Sicuramente l'accettazione di questa filosofia da parte degli utenti ha incoraggiato la fioritura della produzione e la diffuzione del software mediocre che utilizziamo tutti i giorni.

Io ho la convinzione che se gli architetti progettassero le case come i programmatori sviluppano la maggior parte del software che utilizziamo oggi, il primo uccello che posa sul tetto di una casa provocherebbe il suo crollo.

Ada per i Comuni Mortali

Ada non è solo utilizzabili per scrivere applicazioni mission-critical, dove la correttzza del software è fondamentale, ma è realmente un linguaggio general purpose. Oltre alla semplice, chiara ed elegante sintassi, Ada è un linguaggio super standardizzato. Perciò, è molto indicato per scrivere software complesso che deve durare nel tempo.
Personalmente, lo trovo ideale per scrivere librerie per applicazioni scientifiche e tecniche al posto del Fortran e del C/C++. Grazie alla presenza di diversi paradigmi di programmazione nel linguaggio (generica, object oriented e procedurale), Ada è un linguaggio con controllo rigido sui tipi di dati e sulle operazioni su di essi. La compilazione di un programma, o di una libreria, produce un codice binario ben ottimizzato e con bassa presenza di errori.
Grazie alla possibilità di produrre dell DLL (per Windows) e SO (Shared Object per Unix/Linux) con una chiara interfaccia, è molto facile e conveniente utilizzare poi queste librerie in programmi scritti in altri linguaggi ed ambienti di sviluppo.
Trovo Ada ottimo anche per scrivere applicazioni server e web, grazie al suo multitasking e soprattutto quando si utilizza AWS (Ada web server) come server internet.

Conclusione

Ada non è la soluzione definitiva dei problemi del software engineering, ma è un ottimo strumento che viene in aiuto quando si tratta di scrivere software affidabile e corretto. E' comunque possibile raggiungere tale obiettivo utilizzando altri linguaggi, ma sicuramente ad un prezzo maggiore. Ada non è forse indicato a scrivere piccole applicazioni dove la presenza di un errore nel software non ha delle terribili conseguenze e non sono richeste elevate prestazioni. Comunque quando si tratta di scrivere applicazioni medie o complesse con un lungo ciclo di vita, nonché soggette a future modifiche ed estensioni, allora Ada è lo strumento giusto. Quando invece il software deve essere performante, sicuro, mission-critical, distribuito e real-time, allora Ada diventa la scelta obbligata.