Objective-C (in breve Obj-C) è un linguaggio di programmazione riflessivo orientato agli oggetti, sviluppato da Brad Cox alla metà degli anni ottanta 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 macOS di Apple. A NeXT si deve il supporto dell'Objective-C nel compilatore gcc di GNU.

Storia Le origini Nei primi anni ottanta, 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 ottanta alla 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 ambienti 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 1988, 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 ampiamente apprezzati dall'industria del settore. Ciò portò NeXT 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 libero 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 macOS. Questo le 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.

Sviluppi Oggi Oggi Objective C è spesso usato in tandem con librerie fisse di oggetti standard (spesso denominati "kit" o "framework") come Cocoa o GNUstep. Queste librerie sono spesso fornite assieme al sistema operativo: le librerie GNUstep sono parte della collezione di software GNU e a volte presenti in alcune distribuzioni Gnu/Linux e Cocoa di MacOS. Il programmatore non è obbligato ad ereditare le funzionalità della classe base esistente (NSObject). Objective C permette la dichiarazione di nuove classi base che non ereditino nessuna delle funzionalità preesistenti. Originariamente gli ambienti di programmazione basati su Objective C offrivano la classe Object con alcune funzionalità di base, ma con l'introduzione di OpenStep, NeXT ha creato una nuova classe base chiamata NSObject che offriva caratteristiche aggiuntive oltre a quelle di Object. Quasi tutte le classi di Cocoa ereditano da NSObject.

La rinominazione non è servita solo per differenziare i nuovi comportamenti delle classi nel nuovo framework, ma ha consentito al codice che ancora usava la classe Object di coesistere (sebbene con alcune limitazioni) nello stesso run-time system. Nello stesso tempo l'introduzione del prefisso di due lettere è diventato una sorta di surrogato alla mancanza in Objective C degli spacename (o Namespaces che dir si voglia). Usare un prefisso per creare un identificatore di package informale è diventata un'abitudine standard nella comunità di programmatori Objective C.

Objective C 2.0 Alla Worldwide Developers Conference del 2006, Apple ha annunciato l'uscita di "Objective C 2.0" i cui contenuti sono la garbage collection, migliorie nella sintassi, miglioramenti delle prestazioni del run-time e il supporto ai 64-bit. Non è ancora noto quando queste evoluzioni saranno supportate nel run-time GNU, sebbene lo siano già in Mac OS X Leopard.

Garbage collection Objective C 2.0 consente la garbage collection, ma in maniera dipendente dal sistema operativo. Tuttavia è possibile usarla in modo retro-compatibile, in modo che il codice sorgente scritto per versioni precedenti continui a funzionare.

Proprietà Mentre precedentemente le variabili d'istanza richiedevano metodi espliciti di lettura e scrittura (detti getters e setters), Objective C 2.0 introduce le proprietà (property) con la seguente sintassi: @interface Persona: NSObject { } @property(readonly) NSString *nome; @property(readonly) int eta; -(id)initWithName:(NSString)nome eta:(int)eta; @end Una volta inserite nell'interfaccia, si può accedere alle proprietà usando la notazione descritta nell'esempio: NSString *nome = unaPersona.nome; Il compilatore traduce questa notazione in chiamate di metodi accessori. L'istruzione precedente è equivalente a: NSString *nome = [unaPersona nome];

Enumerazione veloce Invece di usare un oggetto enumeratore per operare iterazioni all'interno di una raccolta di oggetti, Objective C 2.0 offre una sintassi di ciclo dedicata; riprendendo l'esempio precedente: for (Persona *persona in laGente) NSLog(@"%@ ha %i anni.", persona.nome, persona.eta);

Portable Object Compiler Oltre alle implementazioni GCC/NeXT/Apple, che hanno aggiunto diverse estensioni a quella originale di Stepstone, esiste un'altra implementazione Open Source di Objective C che aggiunge un set di estensioni lievemente differente: il Portable Object Compiler implementa tra l'altro anche dei blocchi di codice sullo stile Smalltalk.

Sintassi L'Objective C è un sottile strato posto sopra il linguaggio C; C quindi è un 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++ e Java 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 devono 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