Топ-100
Indietro

ⓘ Objective-C, spesso citato anche come Objective C o ObjC o Obj-C, è un linguaggio di programmazione riflessivo orientato agli oggetti, sviluppato da Brad Cox al ..




Objective-C
                                     

ⓘ Objective-C

Objective-C, spesso citato anche come Objective C o ObjC o 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, lObjective C è unestensione a oggetti del linguaggio C. Esso mantiene la completa compatibilità col C. Tra laltro, anche a causa di questa compatibilità, Objective C non è dotato di forte tipizzazione.

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 lObjective 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 dellObjective C nel compilatore gcc di GNU.

                                     

1.1. Storia Le origini

Nei primi anni ottanta, la pratica comune dellingegneria 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. Limmagine Smalltalk era molto grossa, usava tendenzialmente unenorme quantità di memoria per lepoca e girava molto lentamente anche per la mancanza di un supporto specifico dellhardware alle macchine virtuali.

LObjective C fu creato principalmente da Brad Cox e Tom Love allinizio 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 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 lopportunità 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 dellObjective 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, lObjective C si trovò spesso ad essere confrontato, caratteristica per caratteristica, con gli altri linguaggi.

                                     

1.2. Storia NeXT

Nel 1988, NeXT, la compagnia fondata da Steve Jobs dopo Apple, ottenne la licenza dellObjective C da Stepstone allora proprietaria del marchio e realizzò il proprio compilatore Objective C le librerie sulle quali basò linterfaccia utente di NeXTSTEP. Sebbene le workstation NeXTSTEP non riuscirono ad avere un forte impatto sul mercato, i loro strumenti vennero ampiamente apprezzati dallindustria 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.

                                     

1.3. Storia 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 lObjective 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 dinterfaccia di OpenStep e costituiscono il più significativo ambiente di sviluppo basato su Objective C attualmente usato.

                                     

2.1. 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 lintroduzione 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 lintroduzione 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 unabitudine standard nella comunità di programmatori Objective C.



                                     

2.2. Sviluppi Objective C 2.0

Alla Worldwide Developers Conference del 2006, Apple ha annunciato luscita 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.

                                     

2.3. Sviluppi 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.

                                     

2.4. Sviluppi Proprietà

Mentre precedentemente le variabili distanza richiedevano metodi espliciti di lettura e scrittura detti getters e setters, Objective C 2.0 introduce le proprietà property con la seguente sintassi:

Una volta inserite nellinterfaccia, si può accedere alle proprietà usando la notazione descritta nellesempio:

Il compilatore traduce questa notazione in chiamate di metodi accessori. Listruzione precedente è equivalente a:

                                     

2.5. Sviluppi Enumerazione veloce

Invece di usare un oggetto enumeratore per operare iterazioni allinterno di una raccolta di oggetti, Objective C 2.0 offre una sintassi di ciclo dedicata; riprendendo lesempio precedente:

                                     

2.6. Sviluppi Portable Object Compiler

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

                                     

3. Altre caratteristiche

Objective C ha incluso sin dal suo apparire un lista di caratteristiche che sono tuttora in via di acquisizione in altri linguaggi, oltre ad alcune che sono rimaste sue uniche prerogative. Ciò ha permesso di mettere in luce, partendo dalla realizzazione di Cox ed in seguito da quella di NeXT, che alcuni considerazioni superano i concetti più strettamente legati al linguaggio. Il sistema deve essere usabile e flessibile nel complesso per poter essere pienamente fruibile.

  • Un oggetto può essere archiviato su uno stream ad esempio un file e può essere riletto e recuperato su richiesta.
  • Lo swizzling dei puntatori consente di modificare le classi al run-time. Tipicamente per scopi di debugging se un oggetto la cui memoria è stata rilasciata dovesse venire referenziato per errore.
  • La chiamata di procedura remota è banale. Basta semplicemente aggiungere una categoria con un metodo che "serializzi" linvocazione e la inoltri.
  • Delegare i metodi ad altri oggetti al run-time è banale. Basta semplicemente aggiungere una categoria comprendente le modifiche ad un metodo per implementare il forwarding al destinatario della delega.


                                     

4. Objective C++

Objective C++ è un front-end del compilatore gcc in grado di compilare codice sorgente che usa una sintassi combinazione di C++ e Objective C. Objective C++ aggiunge a C++ le stesse estensioni che Objective C aggiunge a C. Dato che nulla è stato fatto per unificare le differenze semantiche tra i due linguaggi, sono state applicate alcune restrizioni:

  • la semantica "per valore" del C++ non può essere applicata agli oggetti Objective C, i quali rimangono accessibili solo mediante puntatori
  • non ci possono essere dichiarazioni Objective C in dichiarazioni di template C++ e viceversa. Comunque è possibile usare tipi Objective C es. Nomeclasse * come parametri di template C++
  • le classi Objective C non possono contenere variabili di istanza di classi C++ che non abbiano un costruttore di default o che abbiano uno o più metodi virtuali, ma si possono usare puntatori ad oggetti C++ come variabili di istanza senza restrizioni
  • La gestione delle eccezioni Objective C è distinta da quella di C++
  • una classe C++ non può derivare da una classe Objective C e viceversa
  • i namespace C++ non possono essere dichiarati allinterno di una dichiarazione Objective C


                                     

5. Analisi del linguaggio

Limplementazione dellObjective 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 lintero sistema. I programmi scritti in Objective C tendono ad essere di poco 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.

Il linguaggio può essere implementato con un compilatore C in GCC, prima come un preprocessore ed in seguito come un modulo del compilatore piuttosto che con un nuovo compilatore. Ciò consente allObjective C di sfruttare lenorme mole di codice, librerie e strumenti già esistenti in C che può essere adattata in Objective C per fornire uninterfaccia object-oriented. Tutte questi fattori riducono le barriere dingresso al nuovo linguaggio, fattore che costituì il problema principale di Smalltalk negli anni ottanta.

Le prime versioni di Objective C non supportavano la garbage collection. Al tempo questa scelta fu oggetto di discussioni e in molti ai tempi di Smalltalk la consideravano un lungo "tempo morto" in cui il sistema era reso non più utilizzabile. Anche se qualche implementazione di terze parti principalmente GNUstep aveva già aggiunto questa caratteristica, è stata implementata da Apple una tecnica simile tramite ARC in Mac OS X Leopard, ma non è disponibile per applicazioni implementate per versioni precedenti del sistema operativo.

Unaltra critica comunemente fatta allObjective C è quella di non avere un supporto nativo per i namespace. I programmatori sono perciò costretti ad aggiungere prefissi in maniera più o meno arbitraria ai nomi delle classi che implementano, fatto che può causare collisioni. Dal 2007 tutte le classi le funzioni di macOS in ambiente Cocoa hanno il prefisso "NS" es. NSObject o NSButton per identificarle chiaramente; "NS" deriva dal nome delle classi definite durante lo sviluppo di NeXTSTEP.

Dato che Objective C è uno stretto superinsieme del C, non tratta i tipi primitivi del C come first-class object.

A differenza del C++, Objective C non supporta loverloading degli operatori, consente lereditarietà solo diretta da una singola classe vietando così lereditarietà multipla. Dato che il linguaggio Java venne influenzato dallObjective C, la decisione di usare lereditarietà singola venne portata anche in Java. In alternativa allereditarietà multipla possono essere usate le categorie ed i protocolli.

                                     

5.1. Analisi del linguaggio Differenze filosofiche tra Objective C e C++

Il progetto e limplementazione del C++ e dellObjective C rappresentano due diversi approcci allestensione 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. LObjective C, invece, aggiunge solo delle caratteristiche object-oriented al C; esso, nella sua versione più "pura" non offre lo stesso 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à simili a quelle offerte dalla libreria standard di C++.

Unaltra notevole differenza consiste nel fatto che lObjective C fornisce un maggior supporto run-time alla riflessione rispetto a C++. In Objective C si può interrogare un oggetto riguardo alle sue stesse proprietà, ad esempio se possa o meno rispondere ad un dato messaggio, mentre in C++ ciò è impossibile a meno di fare ricorso a librerie esterne. Comunque è possibile chiedere se due oggetti sono o meno dello stesso tipo inclusi i tipi predefiniti se un oggetto è istanza di una data classe o superclasse.

Luso della riflessione fa parte di una più ampia distinzione tra caratteristiche dinamiche run-time e statiche compile-time dei linguaggi. Sebbene sia Objective C che C++ implementino un misto di entrambe le caratteristiche, Objective C è decisamente più orientato verso le decisioni dinamiche, mentre C++ verso quelle effettuate al momento della compilazione.