Objective-C: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
ortografia
m Rimuovo dei wikilink errati.
 
(18 versioni intermedie di 11 utenti non mostrate)
Riga 2:
|nome = Objective-C
|autore = [[Brad Cox]] e [[Tom Love]] ([[Stepstone|Stepstone Corp.]])
|data = [[1983]]
|versione = 2.0
|utilizzo = linguaggio general-purpose
|paradigmi =
|paradigmi = [[Programmazione orientata agli oggetti|programmazione a oggetti]]
|tipizzazione = [[Tipo di dato|debole]], [[Tipo di dato#Tipizzazione statica e dinamica|dinamica]]
|specifiche =
|influenzato_da = [[C (linguaggio)|C]], [[Smalltalk]]
|estensione =
|influenzato_da =
|ha_influenzato = [[C++]], [[Swift (linguaggio di programmazione)|Swift]], [[Java (linguaggio di programmazione)|Java]]
|implementazione_riferimento =
|sistema_operativo = [[Multipiattaforma]]
|lingua =
|sito_web = https://developer.apple.com/library/mac/navigation/
|licenza =
|sito_web =
}}
'''Objective-C''', spesso citato anche come '''Objective C''' o '''ObjC''' o '''Obj-C''', è un [[linguaggio di programmazione]] [[riflessione (informatica)|riflessivo]] [[Programmazione orientata agli oggetti|orientato agli oggetti]], sviluppato da [[Brad Cox]] alla metà degli [[Anni 1980|anni ottanta]] presso la [[Stepstone]] Corporation.
 
'''Objective-C''', spesso(in citato anche come '''Objective C''' o '''ObjC''' obreve '''Obj-C''',) è un [[linguaggio di programmazione]] [[riflessione (informatica)|riflessivo]] [[Programmazione orientata agli oggetti|orientato agli oggetti]], sviluppato da [[Brad Cox]] alla metà degli [[Anni 1980|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 (linguaggio di programmazione)|Java]]).
 
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 (linguaggio di programmazione)|Java]]).
Le estensioni a oggetti con cui Objective C arricchisce il modello semantico del C sono ispirate al linguaggio [[Smalltalk]], in particolar modo alla [[comunicazione a scambio di messaggi|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|categorie]] e strumenti legati alla [[riflessione (informatica)|riflessione]].
 
Le estensioni a oggetti con cui Objective -C arricchisce il modello semantico del C sono ispirate al linguaggio [[Smalltalk]], in particolar modo alla [[comunicazione a scambio di messaggi|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|categorie]] e strumenti legati alla [[riflessione (informatica)|riflessione]].
La sua diffusione è principalmente legata al [[framework]] [[OpenStep]] di [[NeXT]] e al suo successore [[Cocoa (software)|Cocoa]], presente nel sistema operativo [[macOS]] di [[Apple]]. A [[NeXT]] si deve il supporto dell'Objective C nel compilatore [[gNU Compiler Collection|gcc]] di [[GNU]].
 
La sua diffusione è principalmente legata al [[framework]] [[OpenStep]] di [[NeXT]] e al suo successore [[Cocoa (software)|Cocoa]], presente nel sistema operativo [[macOS]] di [[Apple]]. A [[NeXT]] si deve il supporto dell'Objective -C nel compilatore [[gNU Compiler Collection|gcc]] di [[GNU]].
 
== Storia ==
Riga 77 ⟶ 83:
 
==== Portable Object Compiler ====
Oltre alle implementazioni [[GNU Compiler Collection|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''[<ref>{{cita web | url=http://users.pandora.be/stes/compiler.html] | titolo=Portable Object Compiler | lingua=en | urlarchivio=https://web.archive.org/web/20080802040731/http://users.pandora.be/stes/compiler.html | dataarchivio=2 agosto 2008 | urlmorto=sì }}</ref> implementa tra l'altro anche dei blocchi di codice sullo stile Smalltalk.
 
== Sintassi ==
Riga 141 ⟶ 147:
...
}
+ metodoDiClasse2
{
// implementazione
Riga 206 ⟶ 212:
Le rappresentazioni interne di questi metodi possono variare con le diverse implementazioni di Objective C.
 
Se ''MyColor''<code>myColor</code>, nell'esempio precedente, fosse della classe ''<code>Color''</code>, internamente il metodo d'istanza ''<code>-changeColorWithRed:green:blue:'' </code> potrebbe essere etichettato ''<code>_i_Color_changeColorWithRed_green_blue''</code>, dove ''<code>i''</code> 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.
Riga 235 ⟶ 241:
Objective C (come Smalltalk) può usare la [[tipo di dato|tipizzazione dinamica]]; ovvero rende possibile, per aumentare la flessibilità, inviare ad un oggetto un messaggio non definito nella propria interfaccia. In Objective C un oggetto può "catturare" questo messaggio e può inviarlo ad un altro oggetto (che può rispondere correttamente o inviare a sua volta il messaggio ad un altro oggetto e così via). Questo comportamento è chiamato ''forwarding'' (in [[lingua italiana|italiano]]: ''inoltro'') o ''delega'' del messaggio (si veda [[#Forwarding|sotto]]). In alternativa, è possibile usare un gestore degli errori nel caso il messaggio non possa essere inoltrato. Nel caso l'oggetto non inoltri il messaggio, non gestisca l'errore o non risponda sarà generato un errore a tempo di esecuzione.
 
Informazioni di tipizzazione statica possono essere aggiunte eventualmente alle variabili. Tali informazioni sono controllate nela [[compile-time]]. Nelle istruzioni seguenti, vengono fornite informazioni di tipo sempre più specifiche. Le istruzioni sono equivalenti durante l'esecuzione, ma le informazioni consentono al compilatore di avvisare il programmatore se gli argomenti passati non corrispondono ai tipi specificati. Nella prima istruzione, l'oggetto deve conformarsi al protocollo ''aProtocol'' e, nella seconda, deve essere un membro della classe ''NSNumber''.
<syntaxhighlight lang="objc">
- setMyValue:(id <aProtocol>) foo;
Riga 558 ⟶ 564:
 
== Altre caratteristiche ==
Objective C ha incluso sin dal suo apparire ununa 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.
 
* 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.
Riga 577 ⟶ 583:
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 (linguaggio di programmazione)|Java]] tuttora) usava una grossa [[macchina virtuale]] invasiva per l'intero sistema. I programmi scritti in Objective C tendono ad essere di poco più grandi delle dimensioni del loro [[codice oggetto]] e delle [[libreria software|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 (informatica)|finestra]].
 
Il linguaggio può essere implementato con un compilatore C (in [[GNU Compiler Collection|GCC]], prima come un [[preprocessore]] ed in seguito come un modulo del compilatore) piuttosto che con un nuovo compilatore. Ciò consente all'Objective C di sfruttare l'enorme mole di codice, librerie e strumenti già esistenti in C che può essere adattata in Objective C per fornire un'interfaccia object-oriented. TutteTutti questi fattori riducono le barriere d'ingresso al nuovo linguaggio, fattore che costituì il problema principale di Smalltalk negli [[anni 1980|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 [[Automatic Reference Counting|ARC]] in [[Mac OS X Leopard]], ma non è disponibile per applicazioni implementate per versioni precedenti del [[sistema operativo]].<ref>{{Cita web | url=https://www.apple.com/macosx/developertools/xcode.html | titolo=Mac OS X Leopard – Xcode 3.0 | autore=Apple, Inc. | anno=22 agosto 2006 | sito=apple.com | accesso=22 agosto 2006 | lingua=en | urlarchivio=https://web.archive.org/web/20071024144921/http://www.apple.com/macosx/developertools/xcode.html | dataarchivio=24 ottobre 2007 | urlmorto=sì }}</ref>
 
Un'altra critica comunemente fatta all'Objective C è quella di non avere un supporto nativo per i [[namespace]]. I programmatori sono perciò costretti ad aggiungere [[prefisso|prefissi]] in maniera più o meno arbitraria ai nomi delle classi che implementano, fatto che può causare collisioni. Dal [[2007]] tutte le classi e le funzioni di [[macOS]] in ambiente [[Cocoa (software)|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]].
Riga 600 ⟶ 606:
 
== Bibliografia ==
* ''{{cita libro|autore=Brad J. Cox|titolo=Object Oriented Programming: An Evolutionary Approach'', Brad J|url=https://archive. Cox org/details/objectorientedpr0000coxb|edizione=2|anno=1991|editore=Addison- Addison Wesley (1991)|lingua=inglese|ISBN=0201548348}}
 
== Altri progetti ==
{{interprogetto|preposizione=sull'}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{cita web|http://programmazione.html.it/guide/leggi/183/guida-objective-c/|Guida Objective C - HTML.it}}
* {{FOLDOC}}
* {{cita web | 1 = http://programmazione.html.it/guide/leggi/183/guida-objective-c/ | 2 = Guida Objective C - HTML.it | accesso = 5 febbraio 2010 | dataarchivio = 23 luglio 2010 | urlarchivio = https://web.archive.org/web/20100723144028/http://programmazione.html.it/guide/leggi/183/guida-objective-c | urlmorto = sì }}
* {{cita web | 1 = http://www.devapp.it/wordpress/diventare-un-xcoder.html | 2 = Diventare un XCoder, guida introduttiva sullo sviluppo in Objective C per Mac OS X / iOS | accesso = 28 febbraio 2011 | urlarchivio = https://web.archive.org/web/20110223223634/http://www.devapp.it/wordpress/diventare-un-xcoder.html | dataarchivio = 23 febbraio 2011 | urlmorto = sì }}
* {{cita web|1=https://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/|2=Introduction to The Objective-C Programming Language (Apple Developer Connection)|lingua=en|accesso=3 maggio 2019|dataarchivio=4 luglio 2003|urlarchivio=https://web.archive.org/web/20030704024148/http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf|urlmorto=sì}}* {{en}}
* {{en}} ''[https://web.archive.org/web/20030704024148/http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf The Objective-C Programming Language]''
* {{cita web|1=http://www.toodarkpark.org/computers/objc/|2=Object-Oriented Programming and The Objective-C Language|lingua=en|accesso=6 febbraio 2008|urlarchivio=https://web.archive.org/web/20041018235301/http://www.toodarkpark.org/computers/objc/|dataarchivio=18 ottobre 2004|urlmorto=sì}}
* {{cita web|https://developer.apple.com/documentation/ReleaseNotes/Cocoa/Objective-C++.html|The Objective-C++ Front End|lingua=en}}
Riga 615 ⟶ 625:
* {{cita web|http://www.faqs.org/faqs/computer-lang/Objective-C/faq/|Objective-C FAQ|lingua=en}}
* {{cita web|1=http://thaesofereode.info/clocFAQ/|2=comp.lang.objective-C FAQ|lingua=en|accesso=6 febbraio 2008|urlarchivio=https://web.archive.org/web/20090220060852/http://thaesofereode.info/clocFAQ/|dataarchivio=20 febbraio 2009|urlmorto=sì}}
* {{cita web|1=http://www.foldr.org/~michaelw/objective-c/|2=Objective-C: Links, Resources, Stuff|lingua=en|accesso=6 febbraio 2008|dataarchivio=15 giugno 2006|urlarchivio=https://web.archive.org/web/20060615145345/http://www.foldr.org/~michaelw/objective-c/|urlmorto=sì}}
* {{cita web|url=http://softtecharticles.com/mambo/index.php?option=com_content&task=view&id=32&Itemid=40|titolo=Objective-C A beginners tutorial|lingua=en|urlmorto=sì}}
* {{en}} [news://comp.lang.objective-c Newsgroup su Objective-C]