Uno degli aspetti che hanno fortemente condizionato la storia dell’informatica è l’evoluzione dei linguaggi di programmazione, finalizzata alla semplificazione dell’attività di sviluppo e, parallelamente, all’aumento esponenziale delle relative funzionalità.

programming language history

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

Generazionale:

  • Prima Generazione (1GL): rientrano in questa categoria i vari linguaggi macchina proprietari, 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. Con essi nascono gli assembler, ovvero programmi in grado di tradurre il linguaggio assembly in linguaggio macchina;
  • Terza Generazione (3GL): rientrano in questa categoria i linguaggi che spostano il focus verso il linguaggio naturale (english-like), risultando decisamente più intuitivi dell’assembly e del linguaggio macchina. Questi linguaggi vengono definiti anche come linguaggi di alto livello e tra essi si annoverano in C, C++, Basic, Java, C#, ecc…;
  • Quarta Generazione (4GL): in questa categoria troviamo i linguaggi dichiarativi, il cui rappresentate più illustre è SQL, utilizzato principalmente nei database relazionali.
  • Quinta Generazione (5GL): sono linguaggi basati sulla soluzione dei problemi con vincoli indicati nel programma, invece che sull’esecuzione di uno specifico predefinito. Il loro scopo è quello di evolversi ed attarsi alle situazioni contestuali, cosa che li rende la scelta naturale per la ricerca Rbotica, Intelligenza Artificiale e Patterns Neurali. 

Esecuzione:

  • compilati: sono i linguaggi il cui codice, per essere eseguito viene tradotto nel linguaggio macchina specifico del calcolatore su cui verrà eseguito. Tale operazione è detta di compilazione ed è effettuata da un compilatore (es: gcc e g++). Alcuni esempi di linguaggi compilati sono il C ed il C++;
  • interpretati: il codice non viene compilato ma viene interpretato a runtime in congiunzione ai dati di contesto. Tra essi si annoverano i linguaggi di Scripting come: PERL, PHP, ecc…;
  • 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. Gli esempi più rilevanti sono .Net (.Net Runtime) e Java (Java Virtual Machine, JVM). In realtà lo scenario si è decisamente evoluto e più che una interpretazione, nella seconda fase avviene una compilazione Just-inTime (JIT) per lo specifico sistema;

 

Paradigma di programmazione:

  • procedurale: il codice è suddiviso in subroutine (funzioni e/o procedure) che eseguono specifici compiti, consentendo, solitamente, di sfruttare i pericolosi salti condizionali (aka go-to). La suddivisione in funzioni (o procedure) è pensata per ridurre la complessità del programma nel suo complesso, adottato la strategia del divide-et-impera ed abbracciando un’astrazione di tipo funzionale in cui è sufficiente conoscere solo l’interfaccia della procedura tralasciandone i dettagli implementativi. La definizione “procedurale” deriva dal linguaggio COBOL, che è stato il primo ad utilizzare questo concetto;
  • strutturata: in pratica una programmazione procedurale epurata dei salti condizionali. La possibilità di realizzare tutto quello che è possibile con i linguaggi procedurali senza l’uso dei pericolosi salti condizionali è dimostrato nel teorema dei due matematici italiani Böhm-Jacopini: qualsiasi algoritmo può essere trasformato in un algoritmo equivalente composto soltanto di combinazioni di sequenze, selezioni e iterazioni (eliminando, quindi, la necessità dei salti condizionati). Rientrano in questa categoria alcuni dei più celebri linguaggi di programmazione: da Pascal ad ADA al 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 una entità con uno specifico stato. Un linguaggio per essere definito “orientato agli oggetti” deve contemplare tre proprietà fondamentali: incapsulamento, ereditarietà e polimorfismo. L’obiettivo è quello di realizzare la cosiddetta astrazione dei dati, soffermandosi sulle informazioni essenziali. Tra i linguaggi più celebri troviamo: C++, Java, C#, ecc…;
  • dichiarativa: in questo paradigma la programmazione si sviluppa utilizzando elementi caratteristici della sfera matematica:
    • programmazione funzionale, si basa sull’utilizzo di funzioni matematiche. Il linguaggio più noto è il LISP, utilizzato fortemente nell’ambito dell’intelligenza artificiale;
    • programmazione logica, si basa sulla logica del primo ordine sia per rappresentare sia per elaborare l’informazione, e si scompone in Programmazione logica induttiva e Programmazione logica abduttiva. Il linguaggio più affermato in tale ambito è il Prolog.

40s1

60s

80s

90s

(credits - Paige Bailey @DynamicWebPaige)

Qualsiasi linguaggio si utilizzi, è tradizione che il primo programma sia “Hello World” esattamente come fatto da Brian Kernighan e Dennis Ritchie nel best-seller “Il Linguaggio C (ISBN 887192200X)”, ereditato da un precedente lavoro del 1974 di Kernighan dal titolo “Programming in C: A Tutorial”.

In realtà sembra che la storia di “Hello, World” cominci molti anni prima, addirittura nel 1801 quando Joseph Marie Jacquard utilizza una serie di schede di cartone perforate per comandare un Telaio Jacquar (di cui è l’inventore) affinché producesse su tela tale scritta. Proprio la possibilità di comandare tale tipologia di telaio con schede perforate, fa sì che esso sia ritenuto l’antenato del calcolatore.

jacquard

Telaio Jacquar e schede perforate

Free Joomla templates by Ltheme