Un linguaggio orientato agli oggetti è un linguaggio di programmazione che ruota attorno al concetto di un oggetto. Sono stati sviluppati linguaggi orientati agli oggetti per semplificare lo sviluppo, il debug, il riutilizzo e la manutenzione del software rispetto a quanto è possibile con i linguaggi precedenti. La comprensione degli oggetti e dei linguaggi orientati agli oggetti richiede la conoscenza dell’evoluzione dei linguaggi di programmazione e delle strutture dati.
- Evoluzione dei linguaggi di programmazione
- Linguaggio assembly.
- Lingue di alto ordine.
- Linguaggi strutturati.
- Linguaggi orientati agli oggetti.
- Caratteristiche della programmazione orientata agli oggetti
- Incapsulamento e nascondiglio dei dati.
- Ereditarietà.
- Polimorfismo.
- Linguaggi orientati agli oggetti comuni
- Smalltalk.
- C++.
- Java.
- Altre lingue.
- Bibliografia
Evoluzione dei linguaggi di programmazione
I linguaggi di programmazione per computer si sono evoluti continuamente nel corso degli anni. Questa evoluzione è dettagliata nei seguenti esempi.
Linguaggio assembly.
I primi programmi per computer sono stati scritti in linguaggio assembly. Questo è un tipo primitivo di linguaggio in cui ogni istruzione corrisponde a una singola istruzione della macchina; è il funzionamento del computer più semplice possibile. Realizzare qualcosa di utile richiede molte istruzioni della macchina. Il linguaggio Assembly è specifico per un particolare tipo di computer; spostare il programma su un diverso tipo di computer richiede la scrittura di un programma completamente nuovo. I programmi in linguaggio assembly sono difficili da scrivere, eseguire il debug e mantenere. Sebbene altri linguaggi siano ora utilizzati per la maggior parte delle applicazioni informatiche, il linguaggio assembly è ancora usato oggi come prima lingua quando viene sviluppato un nuovo chip.
Lingue di alto ordine.
Dopo il linguaggio assembly, sono stati sviluppati linguaggi di ordine superiore; tra i primi c’erano FORTRAN e BASIC. Una dichiarazione in una lingua di alto ordine corrisponde a una frase in inglese. Un programma chiamato compilatore legge le istruzioni da un file sorgente e genera un file contenente le istruzioni della macchina, che è chiamato un file oggetto. Il file oggetto può quindi essere caricato ed eseguito dal computer. Un linguaggio di alto ordine è più portabile di un programma in linguaggio assembly; lo stesso file sorgente può essere compilato per qualsiasi computer purché esista un compilatore adatto.
I primi linguaggi di alto ordine consentivano solo tipi di dati semplici come numero intero, numero in virgola mobile o stringa (una sequenza di lettere). L’unica struttura dati disponibile era l’array. Un array è un elenco di elementi che sono tutti dello stesso tipo di dati; ad esempio, un elenco di numeri o un elenco di stringhe. Un database è stato creato utilizzando un gruppo di array. Ad esempio, un database di prodotti potrebbe contenere tre array denominati Numero del prodotto, Descrizione del prodotto e Prezzo del prodotto. Spettava al programmatore mantenere allineati gli array; ad esempio, assicurarsi che il terzo elemento di ciascun array corrispondesse allo stesso prodotto.
Linguaggi strutturati.
Il passo successivo nell’evoluzione dei linguaggi di programmazione per computer è stato lo sviluppo di linguaggi strutturati, come C e PASCAL, e l’introduzione di strutture dati. Una struttura dati è un insieme di tipi di dati più semplici in un singolo record. Ad esempio, un database di prodotti può essere costruito come un array di record di prodotto, ogni record contenente il numero del prodotto, la descrizione del prodotto e i campi del prezzo del prodotto. Ora un record potrebbe contenere tutte le informazioni necessarie su un singolo elemento. Anche le strutture sono diventate più definite nella parte procedurale del linguaggio. Una funzione o una procedura è una piccola parte di un programma più grande che potrebbe essere scritto per fornire alcune operazioni di base su una struttura di dati come un record.
Linguaggi orientati agli oggetti.
Il passo successivo nell’evoluzione dei linguaggi di programmazione per computer, l’orientamento agli oggetti, è stato introdotto nel linguaggio Smalltalk. L’orientamento agli oggetti prende i concetti di programmazione strutturataun passo avanti. Ora, invece di strutture dati e strutture di programma separate, sia i dati che gli elementi del programma sono combinati in un’unica struttura chiamata oggetto. Gli elementi di dati dell’oggetto sono chiamati attributi, mentre gli elementi del programma oggetto sono chiamati metodi. Collettivamente, attributi e metodi sono chiamati membri dell’oggetto. Di solito, i metodi di un oggetto sono gli unici programmi in grado di operare sugli attributi dell’oggetto.
Con l’orientamento agli oggetti, un cambiamento fondamentale è venuto nel modo in cui i programmi vengono visualizzati. La vista precedente era che i dati devono essere manipolati in qualche modo per ottenere un risultato finale, e un programma è stato visto come un mezzo sequenziale per eseguire le manipolazioni. Dal punto di vista dell’orientamento degli oggetti, un programma viene visualizzato come un gruppo di oggetti che reagiscono ai messaggi dell’utente, di altri programmi o di altri oggetti. Questo punto di vista ha portato all’idea di una programmazione basata sugli eventi; cioè quando si verifica l’evento A, questo oggetto esegue l’azione B. Un messaggio viene inviato a un oggetto chiamando uno dei suoi metodi.
Caratteristiche della programmazione orientata agli oggetti
Le caratteristiche chiave della programmazione orientata agli oggetti includono l’incapsulamento e l’occultamento dei dati, l’ereditarietà e il polimorfismo.
Incapsulamento e nascondiglio dei dati.
L’idea centrale nella programmazione orientata agli oggetti (OOP) è che gli attributi dell’oggetto e i metodi che operano sugli attributi sono legati insieme, o incapsulati, nell’oggetto. I metodi dell’oggetto forniscono le uniche interfacce tra l’oggetto e altre parti del programma. Questo è diverso dalle lingue precedenti, dove qualsiasi parte di un programma potrebbe operare su qualsiasi pezzo di dati in qualsiasi momento. Anche se questo sembra restrittivo, le restrizioni si traducono in un programma più modulare che è più facile da sviluppare e meno probabilità di contenere errori. Significa anche che è più facile spostare un oggetto in un ambiente diverso e farlo funzionare correttamente.
Un oggetto software è in qualche modo simile a un oggetto fisico. Ad esempio, un motore può essere utilizzato per alimentare un’auto. Ha componenti interni, corrispondenti agli attributi, ma non si deve preoccuparsi di ciò che sono o di come funzionano. Il motore deve interfacciarsi con l’acceleratore, il sistema di alimentazione, la trasmissione, l’aspirazione e i collettori di scarico, tutti corrispondenti ai metodi. È inconcepibile che il carburante entri nel motore con qualsiasi mezzo diverso dal sistema di alimentazione. Finché vengono mantenute le interfacce corrette, il motore funzionerà. Così è con gli oggetti. Gli attributi dell’oggetto sono nascosti dall’esterno. L’oggetto interagisce con il suo ambiente attraverso i suoi metodi.
Ereditarietà.
Un altro concetto importante per la programmazione orientata agli oggetti è l’ereditarietà. Una classe di oggetti è definita in una gerarchia e si dice che erediti il comportamento dei suoi antenati (quegli oggetti sopra di esso nella gerarchia). Ad esempio, un programma di disegno può includere tre classi di oggetti: Forma, Rettangolo e Cerchio. Potrebbero essere definiti in modo che Rettangolo e Cerchio siano entrambi discendenti della Forma.
Forma include attributi comuni a qualsiasi forma, come la posizione della forma su una superficie di disegno. Shape fornisce anche metodi per manipolare tali attributi. Ad esempio, un metodo di spostamento potrebbe cambiare la posizione della forma. Inoltre, fornirebbe una definizione per i metodi a cui tutte le forme devono essere in grado di rispondere, ad esempio un metodo di disegno per visualizzare la forma su una superficie di disegno. Il metodo draw in questo caso è detto astratto; non fa altro che creare un requisito che le classi discendenti devono implementarlo.
Poiché Rectangle è un discendente di Shape, eredita attributi (location) e metodi (move) da Shape. Fornisce gli attributi aggiuntivi di cui ha bisogno (larghezza e altezza) e nuovi metodi che manipolano tali attributi (setWidth, setHeight). Rettangolo deve anche fornire un metodo di disegno che dipinge un rettangolo sulla superficie del disegno, perché ogni discendente di forma deve implementare un metodo di disegno. Allo stesso modo, Circle fornisce un nuovo attributo (radius), metodi per manipolarlo (setRadius) e un metodo draw a sé stante.
Con questo tipo di disposizione, il programma drawing manager avrebbe un elenco di forme sulla superficie del disegno. Per spostare un oggetto, chiamerebbe il metodo di spostamento dell’oggetto. Per disegnare un oggetto, il gestore chiama il metodo draw dell’oggetto. Il manager non sa né si preoccupa di come l’oggetto si muove o si disegna, a patto che il lavoro venga svolto. In realtà, potrebbe anche non sapere che tipo di forma è davvero un particolare oggetto. Potrebbe essere un rettangolo, un cerchio o qualsiasi altro oggetto discendente dalla Forma. Ha solo bisogno di sapere che è discendente da Shape, quindi può inviargli qualsiasi messaggio che una Shape può ricevere.
La capacità di ereditarietà di un linguaggio orientato agli oggetti ha aggiunto una nuova dimensione alla programmazione. L’apprendimento di un linguaggio di alto ordine precedente è stato principalmente coinvolto nell’apprendimento della sintassi del linguaggio (come sono costruite le istruzioni linguistiche), il che non è così difficile. In un linguaggio orientato agli oggetti, l’apprendimento della sintassi è ancora necessario, ma acquisire familiarità con le gerarchie di classi standard—che possono includere migliaia di classi, ogni classe con i propri metodi—è un compito molto più grande. Vale la pena, tuttavia, perché un oggetto eredita gli attributi e il comportamento del suo genitore. Un programmatore può evitare il lavoro non necessario trovando un oggetto esistente che fa già la maggior parte di ciò che è necessario. Quindi è possibile aggiungere nuove funzionalità in modo incrementale. Il risultato è un software di costo inferiore e di qualità superiore.
Questa caratteristica ha anche portato all’inclusione di funzionalità di documentazione automatica in diversi linguaggi orientati agli oggetti. Nelle lingue precedenti, la documentazione—se generata a tutti-è stato fatto separatamente, quasi come un ripensamento. Ora le informazioni sulla documentazione possono essere incluse nel codice sorgente dell’oggetto e utilizzate per generare automaticamente un documento HTML (Hypertext Markup Language), completo di collegamenti ipertestuali su e giù per le gerarchie di classi, che possono essere visualizzati con un browser Internet. Ciò rende molto più facile mantenere una documentazione accurata e aggiornata.
Polimorfismo.
La prossima caratteristica importante del linguaggio orientato agli oggetti è il polimorfismo, il che significa che un oggetto discendente non deve rispondere a un messaggio esattamente come fa il suo antenato. Un nuovo oggetto può sovrascrivere i metodi del suo genitore, il che fa sì che il nuovo oggetto reagisca a un messaggio in modo diverso. Ad esempio, una classe comune in un sistema a finestre è un Componente, che rappresenta un oggetto visibile. Un componente è una classe antenato per ogni oggetto visibile sullo schermo: icone, pulsanti, menu, barre di scorrimento, caselle di controllo, pulsanti di opzione, anche le finestre. Tutte queste classi discendenti sovrascrivono alcuni dei metodi del Componente per modificare il comportamento. Ad esempio, un oggetto Icona deve essere visualizzato come una piccola immagine. Icon sostituisce il metodo draw del componente per mostrare l’immagine.
Linguaggi orientati agli oggetti comuni
I linguaggi orientati agli oggetti comuni includono Smalltalk, C, Java e altri linguaggi come BASIC e PASCAL.
Smalltalk.
Smalltalk era il linguaggio orientato agli oggetti originale, sviluppato nei primi anni 1970 da Xerox. Da allora, sono state introdotte diverse varianti. È ancora in uso, ma l’accettazione diffusa è stata ostacolata dalla mancanza di uno standard universale.
C++.
C+ + è un’estensione del linguaggio C che ha fornito funzionalità OOP. È probabilmente il linguaggio orientato agli oggetti più diffuso attualmente in uso. C è un linguaggio ibrido perché compila programmi C standard; non richiede l’uso di oggetti. Ciò consente di sfruttare il software C esistente, mentre si utilizza l’orientamento agli oggetti per il nuovo software. C è controllato dagli standard ANSI.
Java.
Java è il linguaggio orientato agli oggetti puro più ampiamente accettato. È stato sviluppato da Sun Microsystems originariamente come linguaggio di controllo per piccoli elettrodomestici. Tuttavia, si è rivelato ideale per l’utilizzo con Internet. Un’applet Java può essere incorporata in una pagina web. Quando un browser carica la pagina web, carica e visualizza anche l’applet. Sun mantiene ancora uno stretto controllo dello standard linguistico.
Per facilitare l’operabilità multipiattaforma (lavorando su tipi di computer completamente diversi senza ricompilare), Java è implementato in due parti. Il compilatore produce un file oggetto che può essere eseguito solo da una Java Virtual Machine (JVM). Una JVM separata è disponibile per ogni sistema operativo supportato (Windows, Unix / Linux o Solaris). Questo rende i programmi Java in grado di funzionare su uno qualsiasi di questi sistemi senza ricompilare.
Altre lingue.
La maggior parte delle lingue comunemente usate oggi consentono una qualche forma di orientamento agli oggetti. BASIC si è evoluto in Visual BASIC orientato agli oggetti; PASCAL in DELPHI orientato agli oggetti. Generalmente si tratta di linguaggi ibridi, come C, che supportano l’orientamento agli oggetti senza richiederlo.
vedi anche Compilers; Mouse; Procedural Languages.
Donald M. McIver
Bibliografia
Deitel, Harvey M., e Paul J. Deitel. Java: Come programmare, 2a ed. Upper Saddle River, NJ: Prentice Hall, 1998.Voss, Greg. Programmazione orientata agli oggetti, Introduzione. New York: Osborne McGraw-Hill, 1991.