I linguaggi di programmazione e la loro storia

Nel gergo informatico comune, quando si parla di un “linguaggio”, si fa di solito riferimento a un linguaggio di programmazione. Tutti sanno che esistono linguaggi di specifiche, linguaggi di analisi ecc., ma alla domanda: “Che linguaggio usate?” tipicamente la risposta è “Java” oppure “C” o ancora “C++” e così via. Spesso, questa è stata definita come un’anomalia, un limite per il sistema di sviluppo. Può darsi. Di fatto, l’utente finale vuole un sistema software che funzioni. Analisi, progetto e tutte le fasi precedenti la codifica sono certamente importantissime a questo scopo. Tuttavia, solo la programmazione fornisce un sistema funzionante, ovvero ciò che ha un valore diretto e tangibile.

LINGUAGGIO DI PROGRAMMAZIONE

In primo luogo, un linguaggio di programmazione è da definirsi come la notazione con la quale si rende possibile la definizione degli algoritmi.

Ogni linguaggio è caratterizzato da una sintassi (l’insieme di regole formali per la composizione di programmi nel linguaggio scelto) e da una semantica (l’insieme dei significati da attribuire alle frasi sintatticamente corrette costruite nel linguaggio scelto).

Esistono, fondamentalmente, tre modi per catalogare un linguaggio di programmazione:

  1. Generazionale: Prima Generazione (1GL): si tratta di linguaggi decisamente complessi e fortemente legati all’architettura hardware specifica; Seconda Generazione (2GL): costituiscono una prima astrazione del linguaggio macchina (assembly), permettendo comunque di migliorare l’attività di sviluppo grazie all’utilizzo di un numero minore di istruzioni; Terza Generazione (3GL): rientrano in questa categoria i linguaggi più simili all’inglese (english-like), risultando decisamente più intuitivi dell’assembly e del linguaggio macchina. Questi linguaggi vengono definiti anche come linguaggi di alto livello; Quarta Generazione (4GL): in questa categoria troviamo i linguaggi dichiarativi; Quinta Generazione (5GL): sono linguaggi basati sulla risoluzione dei problemi con vincoli indicati nel programma. Il loro scopo è quello di evolversi ed attarsi alle situazioni contestuali, cosa che li rende la scelta naturale per la ricerca robotica, l’Intelligenza Artificiale e i Pattern Neurali. 

  1. Esecuzionale: compilati: sono i linguaggi il cui codice, per essere eseguito viene tradotto nel linguaggio macchina specifico del calcolatore su cui verrà eseguito; interpretati: il codice non viene compilato ma viene interpretato; compilazione intermedia: in tal caso si ha una situazione ibrida tra le due precedenti. Il codice viene prima compilato in un linguaggio intermedio e, successivamente, interpretato da un apposito engine che prende il nome di Virtual Machine o Runtime.

  2. Per paradigma di programmazione: procedurale: il codice è suddiviso in subroutine (funzioni e/o procedure) che eseguono specifici compiti. La definizione “procedurale” deriva dal linguaggio COBOL, che è stato il primo ad utilizzare questo concetto; strutturato: rientrano in questa categoria alcuni dei più celebri linguaggi di programmazione, come il C; orientata agli oggetti (OOP – Object Oriented Programming): in questo caso il fulcro dell’intero programma è la classe (e la relativa interfaccia) composta da attributi e metodi funzionali. L’istanza di una classe è definita oggetto, ovvero un’entità dotata di specifico stato; dichiarativa: in questo paradigma la programmazione si sviluppa utilizzando elementi caratteristici della sfera matematica.
    •  

      STORIA

Durante il lustro compreso tra il 1844 e il 1849, Ada Lovelace, matematica e scrittrice inglese, sulla base delle ricerche del matematico italiano Luigi Menabrea, propose una nuova macchina denominata “the Analytical Engine” (macchina analitica). La Lovelace accluse ai suoi appunti delle note nelle quali veniva specificata la metodologia funzionale al calcolo dei numeri di Bernoulli (in analisi matematica chiamasi numero di Bernoulli una successione di numeri razionali Bn). Si tratta del primo linguaggio di programmazione mai esistito.

Altresì, durante gli anni venti del ‘900 vennero sviluppati i primi computer alimentati elettricamente. Tuttavia, le limitazioni a carico della velocità e della capacità (in termini di memoria) costrinsero i programmatori nella sola realizzazione di programmi hand-tuned (sintonizzati a mano). Il primo programma di alto livello ad essere designato fu Plankalkül, sviluppato da Konrad Zuse, ingegnere civile e inventore tedesco. Altro programma high level, proposto nel 1949, fu lo “Short Code” uno dei primi linguaggi per computer elettronico (macchinario in grado di sviluppare sequenze logiche e/o matematiche automaticamente). Particolare caratteristica dello “Short Code” consta nel fatto che, al contrario del “machine code”, le asserzioni rappresentanti espressioni matematiche vengono scritte in una forma tale da essere comprensibili.

Importante fu, poi, l’assembly. Quest’ultimo presenta la capacità di trasformare delle precise istruzioni in simboli più facili da utilizzare. Assembly non è altro che una rappresentazione simbolica del linguaggio macchina, dove a ogni istruzione binaria corrisponde un’istruzione mnemonica, relativamente più semplice da ricordare. Attualmente, Assembly è utilizzato per debug di applicazioni, analisi del funzionamento di programmi, controllo del corretto funzionamento dei software e modifica degli stessi.

FORTRAN (acronimo di FORmula TRANslation ovvero “traduzione di formule”) fu un linguaggio di programmazione sviluppato a partire dal 1954 da un gruppo di lavoro guidato da John Backus. Si tratta di un linguaggio a utilizzo “general purpose” (è particolarmente versatile) con paradigma procedurale e OOP.

Altra pietra miliare per quanto concerne la storia dei linguaggi fu l’ALGOL, basato sulla programmazione imperativa algoritmica e utilizzato per compilatori e linguaggi di alto livello. Con un approccio imperativo, uno sviluppatore scrive il codice che specifica i passaggi che il computer deve eseguire per raggiungere l’obiettivo (al contrario, un approccio funzionale implica la composizione del problema come set di funzioni da eseguire. È necessario definire con attenzione l’input e l’output di ogni funzione).

Nel 1972 Dennis Ritchie realizzò la prima versione del linguaggio C che si distingueva dai suoi predecessori per il fatto di implementare una vasta gamma di tipi di dati come carattere, interi, numeri in virgola mobile, strutture etc. Da allora il linguaggio non ha subito profonde trasformazioni: la sua sintassi è stata estesa, ma nella sostanza il linguaggio è rimasto quello delle origini.

Lo sviluppo del linguaggio C++ all’inizio degli anni Ottanta è dovuto a Bjarne Stroustrup dei laboratori Bell. Originariamente il C++ era stato sviluppato per risolvere alcune simulazioni molto rigorose e guidate da eventi; per questo tipo di applicazione la scelta della massima efficienza precludeva l’impiego di altri linguaggi. Uno degli scopi principali del C++ era quello di mantenere piena compatibilità con il C. Grazie all’alto livello di successo nel raggiungimento di questo obiettivo, molti programmatori trovano la transizione al linguaggio C++ molto più semplice rispetto alla transizione da altri linguaggi al C. Il C++ consente, inoltre, lo sviluppo di software su larga scala.

Java è un linguaggio di programmazione nato negli anni novanta, e destinato a diventare in breve tempo, il linguaggio più utilizzato in assoluto. Nato per puri scopi di ricerca in ambito universitario, Java si pone come un “super-linguaggio” che supera i limiti e i difetti che hanno altri linguaggi. Il codice è compilato, una classe alla volta, da un compilatore Java che lo trasforma in un modulo simil-oggetto chiamato di solito “bytecode”. Il bytecode è lo stesso per ogni compilatore Java, indipendentemente dalla configurazione di sistema operativo e hardware in uso.

Altro importante linguaggio è il PHP, un linguaggio di scripting generico orientato allo sviluppo web, originariamente creato dal programmatore Rasmus Lerdorf nel 1994.

di Michelangelo Grimaldi