Informatica — Classe Quarta

Storia della
Programmazione ad Oggetti

Dal linguaggio macchina all'OOP:
sessant'anni di idee che hanno cambiato il software

Parte 1

Prima dell'OOP: dalle macchine ai linguaggi

Alan Turing e la macchina universale

Alan Turing
Alan M. Turing (1912–1954)
University of Cambridge — National Physical Laboratory
Nel 1936 Turing propose il modello teorico del calcolatore a istruzioni memorizzate: la macchina di Turing. Una macchina "general purpose" capace di eseguire qualsiasi algoritmo, leggendo simboli da un nastro e seguendo regole precise.

Questo concetto rivoluzionario getta le fondamenta di tutta la storia dei computer moderni.
modello teorico algoritmo 1936
Idea chiave: un computer non è costruito per uno scopo specifico — può fare qualsiasi cosa descrivibile come algoritmo. Ciò che cambia il modo in cui lo usiamo è il software.

I primi linguaggi: pensare come la macchina

I primi linguaggi nascevano come astrazioni della macchina, non del problema.

⚙️
Assembly / Linguaggio macchina — istruzioni dirette al processore (0 e 1)
▼ astrazione
📜
Linguaggi imperativi — FORTRAN (1957), COBOL, BASIC
Più leggibili, ma il programmatore pensa ancora come la macchina
▼ astrazione
🧠
Programmazione ad Oggetti — il programmatore pensa come il problema reale
"I computers non sono semplici macchine: sono macchine per amplificare la mente umana." — Steve Jobs, "Bicycles for the Mind"

Problem Space vs Solution Space

🌍 Problem Space (mondo reale)
Il dominio in cui esiste il problema:
studenti, conti bancari, auto, prenotazioni…

I linguaggi tradizionali non lo rappresentano direttamente: costringono a tradurre il problema in termini di memoria e variabili.
💻 Solution Space (computer)
Il dominio della soluzione:
linguaggi di programmazione, compilatori, strutture dati…

Il mapping fra i due mondi è la vera difficoltà della programmazione.
La svolta dell'OOP: fornisce strumenti per descrivere direttamente gli elementi del Problem Space come oggetti nel programma. Si programma in termini del problema reale, non della macchina.

Parte 2

I protagonisti: le persone che hanno inventato l'OOP

Una rivoluzione lunga sessant'anni

A differenza di molti progressi dell'umanità, l'OOP è il risultato del lavoro di molte persone nel corso di molti anni.

1960s
Origini
1970s
Fondamenta
1980s
Maturità
1990s
Standard
2000+
Dominio
1966
Dahl & Nygaard — SIMULA: prime classi e oggetti
1969–1972
Alan Kay / Xerox PARC — Smalltalk: ereditarietà e polimorfismo
~1972
Dijkstra — astrazione a livelli e incapsulamento
1981
Barbara Liskov — CLU: tipi di dato astratti, information hiding
1983
Ichbiah — Ada: genericità e package
1983–1986
Stroustrup — C++: OOP dentro il C
1988–1995
Meyer — Eiffel  |  Gang of Four — Design Patterns
1997
Booch, Jacobson, Rumbaugh — UML

1966 — SIMULA: nasce la classe

Ole-Johan Dahl
Ole-Johan Dahl
Kristen Nygaard
Kristen Nygaard
Ole-Johan Dahl & Kristen Nygaard
Norwegian Computing Center, Oslo — "SIMULA – An Algol-based simulation language", Communications of the ACM, 1966
SIMULA nasce per simulare sistemi complessi (navi, traffico, processi…). Per farlo, i due ricercatori norvegesi introducono per la prima volta il concetto di classe: un modello che raggruppa dati e comportamenti relativi a un'entità reale.

Ogni nave in simulazione è un oggetto, istanza di una classe Nave. Un'idea semplice ma rivoluzionaria.
prima classe OOP simulazione Oslo
Concetto introdotto: Classe — il prototipo/stampo da cui si creano oggetti. Prima di SIMULA non esisteva questo concetto in nessun linguaggio.

1969–1972 — Smalltalk: l'OOP pura

Alan Kay
Alan Kay (con Adele Goldberg ed altri)
Univ. of Utah, 1969 — poi Xerox Palo Alto Research Center (PARC), 1972
"The Reactive Engine", 1969
Kay studia SIMULA e ha una visione: un linguaggio in cui tutto è un oggetto e gli oggetti comunicano tramite messaggi. Al Xerox PARC (il laboratorio che inventò anche il mouse e la GUI) nasce Smalltalk: il linguaggio OOP più puro mai creato.

Kay conia anche il termine "object-oriented".
ereditarietà polimorfismo messaggi Smalltalk
Molti considerano ancora Smalltalk l'implementazione più pura dell'OOP. Alan Kay ricevette il Premio Turing nel 2003.

Anni '70 — L'astrazione a livelli

Edsger Dijkstra
Edsger W. Dijkstra (1930–2002)
Eindhoven University of Technology
Premio Turing 1972
Dijkstra propone di costruire il software in livelli di astrazione, con una rigida separazione semantica fra livelli successivi: ogni livello offre servizi al livello superiore e nasconde i propri dettagli.

Questo è il principio dell'incapsulamento: nascondere la complessità interna ed esporre solo l'interfaccia necessaria. Un concetto centrale in OOP.
incapsulamento livelli di astrazione modularità
Famosa citazione: "Il test può dimostrare la presenza di bug, mai la loro assenza." — Dijkstra fu anche pioniere della programmazione strutturata (addio al GOTO!).

1981 — Tipi astratti e Information Hiding

Barbara Liskov
Barbara Liskov
MIT — "CLU Reference Manual", Springer-Verlag, 1981
Premio Turing 2008
Con il linguaggio CLU, Liskov definisce formalmente la teoria dei tipi di dato astratti (ADT): un tipo è definito dai comportamenti che offre, non dalla struttura interna.

Introduce il concetto di information hiding: i dettagli interni di un oggetto devono essere nascosti al resto del programma. Solo l'interfaccia pubblica è visibile.
ADT information hiding interfaccia pubblica
Il famoso Principio di Liskov (LSP): se S è un sottotipo di T, allora gli oggetti di tipo T possono essere sostituiti con oggetti di tipo S senza alterare il comportamento del programma. Oggi è uno dei principi SOLID.

1983 — Ada: genericità e package

Jean Ichbiah
Jean Ichbiah ed altri
U.S. Department of Defense (DoD), 1983
Il linguaggio prende il nome da Ada Lovelace, prima programmatrice della storia
Il DoD vuole un unico linguaggio per tutti i sistemi militari e avionici. Il risultato è Ada, che introduce due concetti potenti:
  • Package: moduli che raggruppano dati e operazioni correlate
  • Genericità: codice che funziona con tipi diversi (precursore dei template C++)
package genericità sistemi embedded

1983–1986 — C++: OOP per tutti

Bjarne Stroustrup
Bjarne Stroustrup
AT&T Bell Telephone Laboratories
"Adding classes to C", Software Practice and Experience, 1983
"The C++ Programming Language", Addison-Wesley, 1986
Stroustrup studia Simula durante il dottorato, poi lavora a Bell Labs con il C. L'idea: trapiantare i concetti OOP nel C, già diffusissimo e portabile.

Il risultato è C++ ("++" è l'operatore di incremento del C): un linguaggio che supporta programmazione imperativa, procedurale, OOP e generica.
classi in C compatibilità C linguaggio ibrido
C++ diventa uno dei linguaggi più usati al mondo. Ancora oggi è fondamentale nei sistemi operativi, nei videogiochi, nei sistemi embedded e ad alte prestazioni.

1988 — Eiffel: l'OOP accademica

Bertrand Meyer
Bertrand Meyer
"Object Oriented Software Construction", Prentice-Hall, 1988
"Eiffel: the language", Prentice-Hall, 1992
Meyer crea Eiffel partendo da zero, con l'obiettivo di realizzare il linguaggio OOP più rigoroso e corretto possibile.

Introduce il concetto di Design by Contract: ogni metodo ha precondizioni (cosa deve essere vero prima) e postcondizioni (cosa garantisce dopo). Il codice diventa una specie di contratto formale.
Design by Contract rigore formale OOP pura
Eiffel è considerato il miglior connubio fra linguaggio e ambiente per sviluppo OOP, ma è rimasto prevalentemente in ambito accademico.

1995 — Design Patterns: la "Banda dei Quattro"

EG Erich Gamma
RH Richard Helm
RJ Ralph Johnson
JV John Vlissides
"Design Patterns – Elements of Reusable Object-Oriented Software"
Addison-Wesley, 1995

Le fotografie di questi autori non sono disponibili in pubblico dominio.

Il termine "Design Pattern" viene dall'architetto Christopher Alexander, che aveva studiato schemi ricorrenti nell'architettura civile. La "Gang of Four" (GoF) applica l'idea al software.

Cos'è un Design Pattern?
Una soluzione riutilizzabile a un problema ricorrente nella progettazione software. Non è codice da copiare — è un modello concettuale.
Esempi famosi
Singleton — una sola istanza
Observer — notifica ai sottoscrittori
Factory — creazione di oggetti
Iterator — scorrimento di collezioni
Il libro GoF definisce 23 pattern ancora oggi utilizzati quotidianamente in ogni linguaggio OOP: Java, Python, C#, C++…

1997 — UML: un linguaggio per disegnare il software

Grady Booch
Grady Booch
Rational Software
Ivar Jacobson
Ivar Jacobson
inventore degli Use Case
JR James Rumbaugh
James Rumbaugh
creatore di OMT
"The Three Amigos" unificano i propri metodi di modellazione in UML — Unified Modeling Language: un linguaggio grafico standard per progettare sistemi OOP. Diagrammi delle classi, sequenza, use case, stati… Oggi è lo standard industriale per la progettazione software.

Parte 3

I concetti fondamentali dell'OOP

Che cos'è un Oggetto?

Alan Kay sintetizza le 5 caratteristiche fondamentali degli oggetti in Smalltalk:

1. Modello del mondo reale
Un oggetto rappresenta un elemento del Problem Space. È una "variabile evoluta": memorizza dati e sa eseguire operazioni su se stesso.
2. Comunicazione tramite messaggi
Un programma è un insieme di oggetti che interagiscono. Gli oggetti si scambiano messaggi che causano operazioni.
3. Dati interni
Ogni oggetto contiene i propri dati. I dati possono essere altri oggetti → modelli di complessità crescente.
4. Tipo / Classe
Ogni oggetto appartiene a un tipo (classe). Un oggetto è un'istanza della sua classe.
5. Sostituibilità
Tutti gli oggetti dello stesso tipo accettano gli stessi messaggi. Un cerchio è una forma geometrica → accetta tutti i messaggi delle forme.

I 4 pilastri dell'OOP

🔒 Incapsulamento
I dati interni di un oggetto sono nascosti all'esterno. Si accede solo tramite metodi pubblici (interfaccia). Come la guida di un'auto: usi il volante, non i pistoni.

→ Dijkstra, Liskov
👪 Ereditarietà
Una classe può estendere un'altra, ereditandone attributi e metodi. Cane estende Animale: ha tutto ciò che ha un animale, più le sue specificità.

→ Simula, Smalltalk
🎭 Polimorfismo
Stesso messaggio, comportamenti diversi a seconda dell'oggetto. disegna() chiamato su un Cerchio o su un Quadrato fa cose diverse, ma il codice che chiama è lo stesso.

→ Smalltalk, C++
🧩 Astrazione
Rappresentare solo gli aspetti essenziali di un'entità, ignorando i dettagli non rilevanti. Una Macchina ha targa, velocità, accelera() ma non ha "numero di atomi".

→ OOP in generale

I paradigmi di programmazione in C++

Il C++ è un linguaggio multi-paradigma che supporta quattro stili di programmazione:

Programmazione Imperativa
Si specificano i passi da eseguire per raggiungere uno stato. Es: if, for, assegnazioni. Lo stile più diretto.
Programmazione Procedurale
Si usano funzioni (procedure/subroutine) per modularizzare la soluzione. Information hiding tramite scope delle variabili.
Programmazione OOP
Il codice è visto come oggetti che interagiscono scambiandosi messaggi. Incapsulamento, ereditarietà, polimorfismo.
Programmazione Generica
Lo stesso codice funziona con tipi diversi (template). Es: un vettore di int, di string, di qualsiasi tipo.
Assembly C C++ Java Python C#

L'OOP oggi: linguaggi che hanno cambiato il mondo

☕ Java (1995)
James Gosling — Sun Microsystems.
"Write once, run anywhere." OOP puro, JVM, Android. Usato in milioni di server e applicazioni enterprise.
🐍 Python (1991)
Guido van Rossum.
Sintassi semplice, OOP opzionale. Oggi il linguaggio più popolare al mondo: AI, data science, web.
🔷 C# (2000)
Anders Hejlsberg — Microsoft.
OOP moderno, fortemente tipizzato. Usato in Unity (videogiochi) e applicazioni Windows.
🦅 Swift / Kotlin (2014–2016)
Apple e JetBrains/Google.
Linguaggi OOP moderni per iOS e Android. Sicuri, veloci, espressivi.

Perché studiare l'OOP?

  • 🌍 Modella il mondo reale — si programma in termini di problemi, non di macchine
  • 🔒 Codice più sicuro — l'incapsulamento protegge i dati da modifiche accidentali
  • ♻️ Riuso del codice — l'ereditarietà evita di riscrivere quello che già esiste
  • 🔌 Estensibilità — aggiungere funzionalità senza rompere il codice esistente
  • 👥 Lavoro in team — moduli indipendenti possono essere sviluppati in parallelo
  • 📐 Design Patterns — soluzioni collaudate a problemi ricorrenti
"OOP per me significa solo messaggi, incapsulamento locale e late-binding. Il resto è dettaglio di implementazione." — Alan Kay, creatore di Smalltalk
Fonti: Il Paradigma Orientato agli OggettiIntroduzione al C++ — Dahl & Nygaard 1966 — Kay 1969 — Liskov 1981 — Stroustrup 1983 — Meyer 1988 — GoF 1995 — Booch-Jacobson-Rumbaugh 1997