Objective-C
L'Objective C, spesso citato anche come ObjC o Objective-C o Obj-C, è un linguaggio di programmazione riflessivo orientato agli oggetti, sviluppato da Brad Cox alla metà degli anni '80 presso la Stepstone Corporation.
Come lo stesso nome suggerisce, l'Objective C è un'estensione a oggetti del linguaggio C. Esso mantiene la completa compatibilità col C (a differenza di quanto avviene, per esempio, nel caso del C++). Tra l'altro, anche a causa di questa compatibilità, Objective C non è dotato di forte tipizzazione (caratteristica che invece esibiscono, tra gli altri, sia C++ che Java).
Le estensioni a oggetti con cui Objective C arricchisce il modello semantico del C sono ispirate al linguaggio Smalltalk, in particolar modo alla gestione dei messaggi. Le caratteristiche del runtime system collocano l'Objective C tra i linguaggi ad oggetti dinamici. Sono supportati tutti gli elementi classici della programmazione a oggetti; ma non mancano concetti innovativi anche su questo fronte, come il meccanismo delle categorie e strumenti legati alla riflessione.
La sua diffusione è principalmente legata al framework OpenStep di NeXT e al suo successore Cocoa, presente nel sistema operativo Mac OS X di Apple. A NeXT si deve il supporto dell'Objective C nel compilatore gcc di GNU.
Storia
Le origini
Nei primi anni '80, la pratica comune dell'ingegneria del software era basata sulla programmazione strutturata. Questa modalità era stata sviluppata per poter suddividere programmi di grandi dimensioni in parti più piccole, principalmente per facilitare il lavoro di sviluppo e di manutenzione del software. Ciononostante, col crescere della dimensione dei problemi da risolvere, la programmazione strutturata divenne sempre meno utile, dato che conduceva alla stesura di un numero sempre maggiore di procedure, ad uno spaghetti code e ad uno scarso riuso del codice sorgente.
Venne ipotizzato poi che la programmazione orientata agli oggetti potesse essere una potenziale soluzione al problema. In effetti Smalltalk aveva già affrontato molte di queste questioni ingegneristiche, pur con lo svantaggio di necessitare di una macchina virtuale che interpretava un oggetto in memoria chiamato immagine contenente tutti gli strumenti necessari. L'immagine Smalltalk era molto grossa, usava tendenzialmente un'enorme quantità di memoria per l'epoca e girava molto lentamente anche per la mancanza di un supporto specifico dell'hardware alle macchine virtuali.
L'Objective C fu creato principalmente da Brad Cox e Tom Love all'inizio degli anni '80 ala Stepstone. Entrambi erano stati introdotti a Smalltalk durante la loro permanenza al Programming Technology Center della ITT Corporation nel 1981. Cox aveva iniziato ad interessarsi ai problemi legati alla riusabilità del software e si accorse che un linguaggio simile a Smalltalk sarebbe stato estremamente valido per costruire potenti ambiente di sviluppo per i progettisti di ITT. Cox iniziò così a modificare il compilatore C per aggiungere alcune delle caratteristiche di Smalltalk. Ottenne così ben presto una implementazione funzionante di una estensione ad oggetti del linguaggio C che chiamò OOPC (Object-Oriented Programming in C). Nel frattempo Love fu assunto da Schlumberger Research nel 1982 ed ebbe l'opportunità di acquisire la prima copia commerciale di Smalltalk-80 che influenzò in seguito lo sviluppo della loro creatura.
Per dimostrare che il linguaggio costituiva un reale progresso, Cox mostrò che per realizzare componenti software intercambiabili erano necessari pochi adattamenti pratici agli strumenti già esistenti. Nello specifico, era necessario supportare gli oggetti in modo flessibile con un insieme di librerie software che fossero usabili e consentissero al codice sorgente (e ad ogni risorsa necessaria al codice) di essere raccolto in un solo formato multipiattaforma.
Cox e Love formarono infine una nuova impresa, la Productivity Products International (PPI), per commercializzare il loro prodotto che accoppiava un compilatore Objective C con una potente classe di librerie.
Nel 1986 Cox pubblicò la sua descrizione dell'Objective C nella sua forma originale nel libro Object-Oriented Programming, An Evolutionary Approach. Sebbene fosse attento a puntualizzare che la questione della riusabilità del software non poteva essere esaurita dal linguaggio di programmazione, l'Objective C si trovò spesso ad essere confrontato, caratteristica per caratteristica, con gli altri linguaggi
NeXT
Nel 1998, NeXT, la compagnia fondata da Steve Jobs dopo Apple, ottenne la licenza dell'Objective C da Stepstone (allora proprietaria del marchio) e realizzò il proprio compilatore Objective C e le librerie sulle quali basò l'interfaccia utente di NeXTSTEP. Sebbene le workstation NeXTSTEP non riuscirono ad avere un forte impatto sul mercato, i loro strumenti vennero ampliamente apprezzati dall'industria del settore. Ciò portò NeXTstep ad abbandonare la produzione di hardware ed a focalizzarsi sugli strumenti software, vendendo NeXTSTEP (e OpenStep) come piattaforma per la programmazione.
In seguito il progetto GNU iniziò a lavorare sul clone gratuito che chiamò GNUstep, basato sullo standard OpenStep. Dennis Glatting scrisse il primo run-time gnu-objc nel 1992 e Richard Stallman lo seguì subito dopo con un secondo. il run-time GNU Objective C, che è usato dal 1993, è stato sviluppato da Kresten Krab Thorup mentre era studente universitario in Danimarca.
Apple
Dopo aver acquisito NeXT nel 1996, Apple ha usato OpenStep come base per il suo nuovo sistema operativo Mac OS X. Questo gli consentì di includere l'Objective C di NeXT ed il suo sistema di sviluppo Project Builder (in seguito rinominato Xcode). La maggior parte delle attuali API di Apple (API Cocoa) sono basate sugli oggetti d'interfaccia di OpenStep e costituiscono il più significativo ambiente di sviluppo basato su Objective C attualmente usato.
Sintassi
l'Objective C è un sottile strato posto sopra il linguaggio C; C quindi è uno sottoinsieme stretto dell'Objective C. Ne consegue che è possibile compilare un qualsiasi programma scritto in C con un compilatore Objective C. La gran parte della sintassi (clausole del preprocessore, espressioni, dichiarazioni e chiamate di funzioni) è derivata da quella del C, mentre la sintassi relativa alle caratteristiche object-oriented è stata creata per ottenere la comunicazione a scambio di messaggi simile a quella di Smalltalk.
Messaggi
la sintassi aggiunta rispetto al C è intesa al supporto della programmazione ad oggetti. Il modello di programmazione dell'Objective C è basato sullo scambio di messaggi tra oggetti così come avviene in Smalltalk. Tale modello è differente da quello di Simula, che viene usato in numerosi linguaggi quali, tra gli altri, il C++. Questa distinzione è semanticamente importante e consiste principalmente nel fatto che in Objective C non si chiama un metodo, ma si invia un messaggio.
Si dice che un oggetto chiamato ogg la cui classe implementa il metodo faiQualcosa, risponde al messaggio faiQualcosa. L'invio del messaggio faiQualcosa all'oggetto ogg è espresso da:
[ogg faiQualcosa];
mentre l'azione equivalente in C++ sarebbe espressa da:
ogg.faiQualcosa;
In questo modo è possibile inviare messaggi ad un oggetto anche se l'oggetto non è capace di rispondere. Questo differisce dai linguaggi tipizzati staticamente come C++ e Java nei quali tutte le chiamate devo essere di metodi predefiniti.
Interfacce e implementazioni
l'Objective C richiede che l'interfaccia e l'implementazione di una classe siano dichiarati in blocchi di codice differenti. Per convenzione l'interfaccia è messa in un file con suffisso ".h", mentre l'implementazione in un file con suffisso ".m".
Interfaccia
L'interfaccia di una classe è solitamente definita in un file ".h". La convenzione usata è quella di assegnare il nome al file basandosi sul nome della classe, nell'esempio "NomeDellaClasse.h".
//definizione dell'interfaccia: "NomeDellaClasse.h"
#import "NomeDellaSuperclasse.h"
@interface NomeDellaClasse : NomeDellaSuperclasse
{
//variabili d'istanza
int variabileIntera;
float variabileFloat;
...
}
//metodi di classe
+ metodoDiClasse1
+ metodoDiClasse2
+ ...
//metodi di istanza
- metodoDiIstanza1
- metodoDiIstanza2
- ...
@end
Il segno meno (-) denota i metodi d'istanza, mentre il segno più (+) quello di classe (analoghi alle funzioni statiche del C++). Si noti la differenza di significato con le convenzioni dei diagrammi UML dove i due segni rappresentano rispettivamente i metodi privati e pubblici.
Implementazione
L'interfaccia dichiara solamente i prototipi dei metodi e non i metodi stessi che vengono inseriti nell'implementazione. L'implementazione è solitamente scritta in un file con estensione ".m". La convenzione usata è quella di assegnare il nome al file basandosi sul nome della classe, nell'esempio "NomeDellaClasse.m"
//definizione dell'implementazione: "NomeDellaClasse.m"
#import "NomeDellaClasse.h"
@implementation NomeDellaClasse
+ metodoDiClasse1
{
// implementazione
...
}
+ metodoDiClasse2
{
// implementazione
...
}
...
- metodoDiIstanza1
{
// implementazione
...
}
- metodoDiIstanza2
{
// implementazione
...
}
...
@end
I metodi sono scritti in maniera diversa dalle funzioni in stile C. Ad esempio, una funzione, sia in C che in Objective C segue la seguente forma generale:
int fai_la_radice_quadrata(int i)
{
return radice_quadrata(i);
}
che avrà come prototipo:
int fai_la_radice_quadrata(int);
L'implementazione come metodo diverrà:
- (int) fai_la_radice_quadrata:(int) i
{
return [self radice_quadrata: i];
}
Un approccio più canonico alla scrittura del metodo sarebbe quello di citare il primo argomento nel nome del selettore:
- (int) faiLaRadiceQuadrataDiInt: (int) i
{
return [self radiceQuadrataDiInt:i];
}
Questa sintassi può apparire complicata, ma consente di assegnare i nomi ai parametri, ad esempio:
- (int) changeColorWithRed:(int) r green:(int) g blue:(int) b
può essere invocato così:
[myColor changeColorWithRed:5 green:2 blue:6];
Le rappresentazioni interne di questi metodi possono variare con le diverse implementazioni di Objective C.
Se MyColor, nell'esempio precedente, fosse della classe Color, internamente il metodo d'istanza -changeColorWithRed:green:blue: potrebbe essere etichettato _i_Color_changeColorWithRed_green_blue, dove i seguito dal nome della classe, si riferisce al fatto che è un metodo d'istanza ed i due punti (:) sono sostituiti dal trattino basso (_). Dato che l'ordine dei parametri fa parte del nome del metodo, esso non può essere cambiato.
In ogni caso i nomi interni delle funzioni sono usati raramente in maniera diretta e generalmente anche i messaggi inviati sono convertiti in funzioni definite in librerie di run-time e non accedono direttamente ai nomi interni. Ciò è dovuto anche al fatto che al momento della compilazione non sempre si conosce quale metodo sarà effettivamente chiamato, perché la classe del destinatario (l'oggetto a cui viene inviato il messaggio) potrebbe essere sconosciuta fino al run-time.
Analisi del linguaggio
L'implementazione dell'Objective C usa un semplice run-time system scritto in linguaggio C che aumenta di poco la dimensione delle applicazioni. Al contrario, la maggior parte dei sistemi object-oriented esistenti quando fu creato (e Java tuttora) usava una grossa macchina virtuale invasiva per l'intero sistema. I programmi scritti in Objective C tendono a non essere troppo più grandi delle dimensioni del loro codice oggetto e delle librerie usate (che generalmente non devono essere incluse nel codice distribuito), al contrario ad esempio dei sistemi Smalltalk dove grandi quantità di memoria sono necessarie semplicemente per aprire una finestra.
Differenze filosofiche tra Objective C e C++
Il progetto e l'implementazione del C++ e dell'Objective C rappresentano due diversi approcci all'estensione del C.
Oltre alla programmazione strutturata del C, C++ supporta direttamente la programmazione ad oggetti, la programmazione generica e la metaprogrammazione. C++ è inoltre corredato di una estesa libreria standard che include numerose classi container. L'Objective C, invece, aggiunge solo delle caratteristiche object-oriented al C; esso, nella sua versione più "pura" non offre lo stesso numero di in termini di librerie standard, ma in molti contesti dove viene usato, viene corredato di una libreria sul modello di quella di OpenStep, di Cocoa o di GNUstep le quali forniscono funzionalità sinili a quelle offerte dalla libreria standard di C++.
Bibliografia
- Object Oriented Programming: An Evolutionary Approach, Brad J. Cox - Addison Wesley (1991)
Altri progetti
- Wikibooks contiene testi o manuali su Objective C
- Wikimedia Commons contiene immagini o altri file su Objective C
Collegamenti esterni
- {en} Introduction to The Objective-C Programming Language (Apple Developer Connection)
- {en} The Objective-C Programming Language, PDF download from Apple
- {en} Object-Oriented Programming and The Objective-C Language
- {en} The Objective-C++ Front End
- {en} Beginner’s Guide to Objective-C
- {en} ObjectiveLib: variant of a Standard Template Library
- {en} Objective-C by Brad Cox
- {en} Object Oriented Programming in Objective-C
- {en} Objective-C FAQ
- {en} comp.lang.objective-C FAQ
- {en} Objective-C: Links, Resources, Stuff
- {en} Objective-C A beginners tutorial
- {en} Objective-C mailing list
- {en} UML for Objective-C (PDF)