Introduzione
La varietà dei linguaggi di programmazione costituisce uno dei fenomeni più complessi e significativi nella storia dell’informatica. Dalla metà del Novecento a oggi, l’evoluzione di queste forme simboliche di comunicazione tra uomo e macchina ha generato una molteplicità di paradigmi e famiglie linguistiche, ciascuna portatrice di una diversa visione della computazione. Comprendere la tassonomia dei linguaggi di programmazione significa, dunque, leggere in controluce l’evoluzione del pensiero algoritmico e dei modelli concettuali che lo sorreggono.
Le dimensioni della classificazione
La tassonomia dei linguaggi non è mai univoca. Essa può essere organizzata lungo almeno tre assi principali:
- Paradigma computazionale, che definisce il modello di pensiero dominante (imperativo, funzionale, logico, dichiarativo, orientato agli oggetti, reattivo, concorrente).
- Livello di astrazione, che distingue i linguaggi di basso livello (vicini all’hardware) da quelli di alto livello (più prossimi alla logica umana).
- Dominio applicativo, che identifica i linguaggi progettati per contesti specifici (scientifico, gestionale, embedded, web, data analysis).
Questi tre assi interagiscono, dando origine a una mappa concettuale articolata, dove i confini non sono rigidi ma permeabili.
Le principali famiglie linguistiche
Linguaggi imperativi e procedurali
Discendono direttamente dall’architettura di von Neumann e modellano la computazione come sequenza di istruzioni che modificano lo stato di memoria. Esempi emblematici sono C, Pascal, Fortran e Ada. L’attenzione è rivolta al come calcolare piuttosto che al cosa calcolare.
Linguaggi funzionali
Basati sul calcolo lambda, i linguaggi funzionali (come Lisp, Haskell, OCaml) descrivono la computazione come applicazione di funzioni pure, prive di effetti collaterali. Essi privilegiano l’astrazione matematica e la composizionalità, offrendo un paradigma elegante ma spesso distante dalla logica imperativa dell’hardware.
Linguaggi logici e dichiarativi
In Prolog e nei suoi derivati, la computazione emerge come processo di inferenza logica: si definiscono fatti e regole, e il linguaggio deduce le conseguenze. Il programmatore specifica il cosa deve essere vero, non il come ottenerlo. Questo approccio si è rivelato cruciale nell’intelligenza artificiale simbolica.
Linguaggi orientati agli oggetti
Con Smalltalk, C++, Java, il paradigma orientato agli oggetti ha introdotto la nozione di entità autonome che combinano dati e comportamenti. Tale modello mira a rappresentare il mondo come un insieme di oggetti interagenti, favorendo la modularità e la riusabilità del codice.
Linguaggi multiparadigma
Molti linguaggi contemporanei, come Python, Scala o Rust, integrano più paradigmi, offrendo una sintesi flessibile tra imperativo, funzionale e orientato agli oggetti. Questa ibridazione riflette l’evoluzione dell’ingegneria del software verso modelli pragmatici e adattivi.
Tassonomia come genealogia del pensiero computazionale
La classificazione dei linguaggi non è solo una questione tecnica: è una forma di genealogia culturale. Ogni linguaggio incarna una specifica visione del rapporto tra logica e controllo, tra formalismo e pragmatismo, tra macchina e mente umana.
In questo senso, parlare di “famiglie” linguistiche equivale a esplorare linee di discendenza intellettuale — dalle strutture iterative di Fortran alle astrazioni algebriche di Haskell, fino alla metaprogrammazione riflessiva dei linguaggi moderni.
Conclusione
La tassonomia dei linguaggi di programmazione non è un catalogo statico, ma un processo interpretativo che accompagna l’evoluzione stessa del pensiero computazionale. Ogni linguaggio, nel suo design e nella sua semantica, racconta un modo di intendere la razionalità, il controllo e la creatività. Studiare queste famiglie significa dunque interrogarsi sui limiti e sulle potenzialità dell’intelligenza formale, laddove il codice diventa strumento di pensiero prima ancora che mezzo tecnico.
Bibliografia essenziale
- Sebesta, R. W. (2019). Concepts of Programming Languages (12ª ed.). Boston, MA: Pearson Education, Inc. ISBN: 978-0-13-499718-6. 784 pp.
- Scott, M. L. (2015). Programming Language Pragmatics (4ª ed.). Waltham, MA: Morgan Kaufmann Publishers (Elsevier). ISBN: 978-0-12-410409-9 (paperback); ISBN: 978-0-12-410477-8 (eBook). 992 pp.
- Pierce, B. C. (2002). Types and Programming Languages. Cambridge, MA: The MIT Press. ISBN: 978-0-26-216209-8 (hardcover); ISBN: 978-0-26-230382-8 (eBook). 648 pp.
- Shapiro, S. C. (Ed.). (1992). Encyclopedia of Artificial Intelligence (2ª ed., 2 voll.). New York, NY: John Wiley & Sons, Inc. ISBN: 978-0-47-150307-1 (set completo); ISBN: 978-0-47-150305-7 (vol. 1). 1792 pp.
- Backus, J. (1978). “Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs”. Communications of the ACM, 21(8): 613–641. DOI: 10.1145/359576.359579