Impara il C prima di apprendere Objective-C [closed]


107

Essendo un aspirante sviluppatore Apple, voglio ottenere le opinioni della comunità se è meglio imparare il C prima di passare a Objective-C e, infine, al Cocoa Framework?

Il mio istinto dice che impara C, che mi darà una buona base.

Risposte:


163

Imparerei prima il C. Ho imparato C (e ho fatto molto in C) prima di passare a Obj-C. Ho molti colleghi che non sono mai stati veri programmatori in C, hanno iniziato con Obj-C e hanno imparato solo quanto C era necessario.

Ogni tanto vedo come risolvono un problema interamente in Obj-C, risultando a volte in soluzioni molto goffe. Di solito poi sostituisco un po 'di codice Obj-C con codice C puro (dopotutto puoi mescolarli quanto vuoi, il contenuto di un metodo Obj-C può essere interamente, codice C puro). Senza alcuna intenzione di insultare alcun programmatore Obj-C, ci sono soluzioni molto eleganti in Obj-C, queste sono soluzioni che funzionano (e sembrano) molto meglio grazie agli oggetti(La programmazione OOP può rendere i programmi complessi molto più belli della programmazione funzionale; il polimorfismo ad esempio è una caratteristica brillante) ... e mi piace molto Obj-C (molto più del C ++! Odio la sintassi C ++ e alcune funzionalità del linguaggio sono semplicemente eccessive e portare a cattivi modelli di sviluppo IMHO); tuttavia, quando a volte riscrivo il codice Obj-C dei miei colleghi (e lo faccio solo se penso che sia assolutamente necessario), il codice risultante è solitamente più piccolo del 50%, richiede solo il 25% della memoria utilizzata prima ed è circa il 400% più veloce in fase di esecuzione.

Quello che sto cercando di dire qui: ogni lingua ha i suoi pro e contro. C ha pro e contro e così fa Obj-C. Tuttavia, la caratteristica davvero eccezionale di Obj-C (ecco perché mi piace anche più di Java) è che puoi saltare al C normale a piacimento e viceversa. Perché questa è una caratteristica così eccezionale? Perché proprio come Obj-C risolve molti dei contro del C puro, il C puro può correggere alcuni dei contro di Obj-C. Se li mischi insieme riceverai una squadra molto potente.

Se impari solo Obj-C e non hai idea di C o ne conosci solo le basi e non hai mai provato quanto elegante possa risolvere alcuni problemi comuni, in realtà hai imparato solo metà di Obj-C. C è una parte fondamentale di Obj-C. La capacità di utilizzare C in qualsiasi momento e ovunque è una caratteristica fondamentale di esso.

Un tipico esempio era un codice che abbiamo usato che doveva codificare i dati in base64, ma non potevamo usare una libreria esterna per quello (nessuna libreria OpenSSL). Abbiamo utilizzato un codificatore base64, interamente scritto utilizzando classi Cocoa. Funzionava bene, ma quando lo abbiamo fatto codificare 200 MB di dati binari, ci è voluta un'eternità e il sovraccarico di memoria era inaccettabile. L'ho sostituito con un codificatore base64 minuscolo e ultracompatto scritto interamente come una funzione C (ho copiato il corpo della funzione nel corpo del metodo, il metodo ha preso NSData come input e ha restituito NSString come output, tuttavia all'interno della funzione tutto era C). L'encoder C era molto più compatto, batteva il puro encoder Cocoa del fattore 8 in velocità e anche l'overhead della memoria era molto inferiore. Codificare / decodificare i dati, giocare con i bit e simili attività di basso livello sono solo i punti di forza di C.

Un altro esempio è stato un codice dell'interfaccia utente che ha disegnato molti grafici. Per memorizzare i dati necessari per disegnare i grafici, abbiamo utilizzato NSArray. In realtà NSMutableArray, poiché il grafico era animato. Risultato: animazione del grafico molto lenta. Abbiamo sostituito tutti gli NSArray con normali array C, oggetti con strutture (dopo che tutte le informazioni sulle coordinate del grafico non sono niente che devi avere negli oggetti), l'accesso all'enumeratore con semplici cicli for e abbiamo iniziato a spostare i dati tra gli array con memcopy invece di prendere i dati da un array a l'altro, indice per indice. Il risultato: una velocità aumentata del fattore 4. Il grafico si animava in modo fluido, anche sui vecchi sistemi PPC.

La debolezza di C è che ogni programma più complesso diventa brutto nel lungo periodo. Mantenere le applicazioni C leggibili, estensibili e gestibili richiede molta disciplina da parte di un programmatore. Molti progetti falliscono perché manca questa disciplina. Obj-C semplifica la struttura dell'applicazione utilizzando classi, ereditarietà, protocolli e così via. Detto questo, non userei la funzionalità C pura oltre i confini di un metodo se non necessario. Preferisco mantenere tutto il codice in un'app Objective-C all'interno del metodo di un oggetto; tutto il resto annulla lo scopo di un'applicazione OO. Tuttavia, all'interno del metodo a volte uso esclusivamente C puro.


e se conosco già C ++ e voglio imparare Objective-C per lo sviluppo di iPhone / iTouch, è necessario imparare C qualunque?
chester89,

11
@ chester89: se conosci già C ++, ne sai abbastanza per iniziare con Objective-C.
Sven

Sven ha ragione, il C ++ è così complesso e usa già così tanto C puro, se conosci molto bene il C ++, dovresti anche conoscere C abbastanza bene.
Mecki

Questa è ancora la mia riflessione preferita sull'argomento, grazie.
Mork dal

1
@FrederikWitte Lascia fuori C ++, ti confonderà solo come principiante (e non è un linguaggio di cui avresti bisogno per lo sviluppo mobile). Inizia con Java, è un buon linguaggio di insegnamento e solo conoscere Java è sufficiente per sviluppare per Android (forse a meno che tu non voglia scrivere giochi o lettori video o giù di lì). Quindi impara C e infine Obj-C, a meno che tu non voglia saltare tutto questo e invece impara Swift. La tua scelta.
Mecki

25

Puoi imparare abbastanza prontamente C e Objective-C allo stesso tempo - non c'è certamente bisogno di imparare le minuzie di C (inclusa l'aritmetica dei puntatori e così via) prima di iniziare con le aggiunte di Objective-C al linguaggio e come programmatore alle prime armi iniziare rapidamente con Objective-C può aiutarti a iniziare a "pensare per oggetti" più rapidamente.

In termini di risorse disponibili, la documentazione di Apple in genere presuppone familiarità con C, quindi iniziare con il linguaggio di programmazione Objective-C 2.0 non sarà di grande beneficio per te. Investirei in una copia di Programming in Objective-C di Stephen Kochan (a seconda di quanto velocemente vuoi iniziare, potresti considerare di aspettare la seconda edizione):

Libreria degli sviluppatori Objective-C di programmazione Libreria degli sviluppatori Objective-C 2.0 di programmazione

Non presuppone alcuna esperienza precedente e ti insegna Objective-C e tutto il C di cui hai bisogno.

Se ti senti un po 'ambizioso, potresti iniziare con il tutorial "Learn C" di Scott Stevenson , ma presenta alcuni prerequisiti ("Dovresti già conoscere almeno un linguaggio di scripting o di programmazione, comprese le funzioni, le variabili e i loop. Dovrò anche digitare i comandi nel terminale di Mac OS X. ").

(Solo per la cronaca e per il contesto: ho imparato entrambi nello stesso periodo nel 1991 - non sembrava farmi alcun male. Tuttavia, avevo un background in BASIC, Pascal, Logo e LISP. )


2
non dovresti assolutamente trovare necessario imparare prima il C. Soprattutto se conosci già un linguaggio come il C # di Java. C # e Java devono molto all'obiettivo C. Anche se C # deve molto di più all'esperienza di Helsberg e agli errori con Delphi.
Daniel Honig

18

Ho pensato molto a questo problema prima di scrivere il mio libro su Objective-C. In primo luogo, credo davvero che imparare il linguaggio C prima di imparare Objective-C sia la strada sbagliata. C è un proceduralelinguaggio contenente molte caratteristiche che non sono necessarie per la programmazione in Objective-C, specialmente a livello principiante. In effetti, il ricorso ad alcune di queste caratteristiche va contro la tendenza ad aderire a una buona metodologia di programmazione orientata agli oggetti. Inoltre, non è una buona idea insegnare tutti i dettagli di un linguaggio procedurale (e attaccare la soluzione di un problema con funzioni e tecniche di programmazione strutturata) prima di apprenderne uno orientato agli oggetti. Questo può far partire il programmatore nella direzione sbagliata, portando potenzialmente allo sviluppo dell'orientamento e della mentalità sbagliati per promuovere una buona disciplina di programmazione orientata agli oggetti. Solo perché Objective-C è un'estensione del linguaggio C non significa che devi prima imparare il C!

Penso che insegnare Objective-C e il linguaggio C sottostante come un unico linguaggio integrato sia l'approccio giusto. Non c'è motivo di apprendere che un'istruzione "for" proviene dal linguaggio C e non dal suo linguaggio Objective-C superset. Inoltre, perché apprendere in dettaglio cose come array e stringhe C (e manipolarli) primaimparare ad esempio su array (NSArray) e oggetti stringa (NSString)? Molti testi in C dedicano molto tempo alle strutture, ai puntatori alle strutture e all'iterazione di array con puntatori. Ma puoi iniziare a scrivere programmi Objective-C senza conoscere nessuna di queste funzionalità del linguaggio C. E per un programmatore alle prime armi, questo è un grosso problema. Questo non solo accorcia la curva di apprendimento, ma riduce anche la quantità di materiale che deve essere appreso (e parte di esso selettivamente filtrato) per scrivere programmi Objective-C.

Sono d'accordo sul fatto che vorrai imparare la maggior parte, se non tutte, le funzionalità C sottostanti, ma molte possono essere rimandate fino a una solida conoscenza della definizione di classi e metodi, lavorare con oggetti ed espressioni di messaggi e comprendere i concetti di ereditarietà e il polimorfismo sono ben compresi.


Tutto questo è per coloro che vogliono imparare velocemente evitando difficoltà e comprensione profonda. Sto insegnando a un noob completo di programmazione (mentre ho più di 11 anni di esperienza di programmazione) per programmare e insegnare agli altri prima (ma non sono un insegnante per chiarirlo). E sai cosa? Tutti questi concetti a cui siamo abituati sono così complicati e non intuitivi per un principiante assoluto! C è un ottimo modo per capire le cose di livello abbastanza basso, in modo che in futuro non sarà un po 'magico per loro. Detto questo, per una migliore curva di apprendimento del programmatore è meglio con C all'inizio con le sue regole barbare =)
MANIAK_dobrii

15

Mi tufferei subito nell'Obiettivo C: se hai già alcune lingue sotto la cintura, non è la sintassi che è la curva di apprendimento, è il cacao.


1
Detto questo, c'è molto più materiale disponibile per l'apprendimento C. Ho scoperto che era la parte più difficile di ObjC, la mancanza di materiale che fosse ben organizzato, chiaro, abbastanza approfondito da confrontare con il materiale C o C ++ e aiutarti davvero a capire cosa fosse sta succedendo dentro.
Spanky

10

Penso che, per la maggior parte, imparare il C sia una buona idea indipendentemente dall'arena in cui ti trovi, almeno per capire il funzionamento interno dello sviluppo del software prima di utilizzare prodotti preconfezionati, in questo modo se qualcosa va storto hai una migliore possibilità di comprendere il funzionamento interno. Ci sono molte discussioni su questo su SO, ed è una domanda piuttosto soggettiva, ma in generale userai intrinsecamente C all'interno del tuo codice Objective-C, quindi immagino che dipenda davvero da te. Sono una persona dal basso, ma a volte può intromettersi e conosco diverse persone intelligenti che si sono fatte strada dall'alto verso il basso, penso che la parte importante sia che tu riesca a capire il funzionamento interno come sarà distingue le tue capacità da quelle che non lo fanno e aumenta le tue capacità.


imparare prima il C può anche distorcere la tua visione della programmazione OO se non sei già radicato in essa. La combinazione di codifica strutturata e procedurale non è buona. Ma è anche vero che OO perde il suo valore in molti posti in cui C brilla come la scrittura di codice di livello inferiore.
Daniel Honig

1
La mia ragione per suggerire a ogni sviluppatore di imparare il C ad un certo punto è almeno basata sull'idea che anche i linguaggi OO si compilano seguendo le stesse esatte istruzioni che C fa alla fine. Le variabili per gli oggetti usano i puntatori, i Garbage Collector usano malloc e free, i file sono bloccati usando gli handle del sistema operativo; Quando qualcosa va storto in un'applicazione Java o C #, conoscere questi concetti fondamentali può migliorare notevolmente la comprensione di cosa è andato storto. La comprensione dell'allocazione delle risorse che verrà eseguita tende anche a portare a scrivere codice più informato che funzionerà in modo più ottimale per un contesto specifico.
TheXenocide

7

È una buona idea imparare C prima di apprendere Objective-C, che è un rigoroso superset di C. Ciò significa che Objective-C può supportare tutto il normale codice C, quindi il codice comune ai programmi C è destinato a comparire anche in Objective- Codice C.

Oltre a guardare le cose puramente da un punto di vista linguistico, scoprirai che Mac OS X è un sistema operativo Unix completo. Tutte le librerie a livello di sistema sono scritte in C.

Probabilmente è possibile imparare entrambi allo stesso tempo, ma penso che apprezzerai e comprenderai di più Objective-C se avrai prima una solida conoscenza di C.


5

Imparerei Objective-C e imparerei tutto il C di cui hai bisogno man mano che procedi.

Le aree di C da cui non dipenderai molto:

  • Aritmetica dei puntatori e array. Non ho usato affatto gli array C.
  • Stringhe in C. Le corde di Objective-C fanno il lavoro in modo più piacevole e sicuro.
  • Gestione manuale della memoria se si utilizza GC in Obj-C 2.1. Consiglio vivamente questo percorso per motivi di velocità di sviluppo e prestazioni.

6
Un avvertimento: Garbage Collection in Objective-C non è disponibile su tutte le piattaforme (specialmente l'iPhone), il che è qualcosa di cui essere consapevoli.
Mark Bessey

5

Man mano che impari Objective-C e Cocoa, non puoi evitare di apprendere bit di C. Ad esempio, i rettangoli sono comunemente rappresentati da CGRect, una struttura C.

Se hai tempo, impara sicuramente C. Come altri hanno detto qui, il libro di Kochan (seconda e prima edizione) è eccellente come libro in cui immergersi.


4

Ci sono molte cose che non puoi fare puramente in Objective-C, quindi l'apprendimento di alcune abilità di base del C sarà piuttosto critico. Avrai almeno bisogno di capire le dichiarazioni di variabili e le funzioni di base della libreria C, o sarai frustrato.


3

Onestamente, così tanti linguaggi si basano sulla sintassi C che è una buona cosa avere familiarità. Ci vorrebbe una o due settimane per familiarizzare con C a prescindere.

Detto questo, ho semplicemente insegnato a me stesso l'Obiettivo C, e devo essere onesto: non ho trovato la mia esperienza in C così utile come avrei pensato. L'obiettivo C è stato decisamente illuminante per me.


3

Puoi passare direttamente a Objective-C, con i seguenti vantaggi:

  1. Imparerai "un po '" C nel modo.
  2. Imparerai le parti C che sono rilevanti per te.

Almeno per me è più facile imparare una nuova lingua quando sono interessato a un'app o un campione specifico, e fallisco quando devo imparare altre cose che non sono esattamente ciò che mi interessa.

Puoi sempre perfezionare la tua conoscenza del C in seguito se ti interessi alla programmazione di livello inferiore.


3

Meglio, non lo so, ancor meno perché non ho familiarità con Objective-C.
Ma le basi del C non sono così difficili da imparare, non è un linguaggio molto complesso (in termini di sintassi, non in termini di padronanza!), Quindi provaci, non sarà tempo perso.
Personalmente, penso che sia sempre una buona idea imparare il C, dà una buona idea di come funziona il computer. Dopotutto, la maggior parte delle lingue e dei sistemi sono ancora scritti in C. Allora vai avanti! :-)

PS .: Con "andare avanti", non intendevo "lasciar perdere", ma solo "imparare di più, imparare diversamente". Una volta che conosci C, potresti non rilasciarlo mai: Java usa JNI per chiamare routine C per cose di basso livello, Python, Lua, ecc. Sono spesso estesi con codice C (il riferimento a Lua presuppone anche solo una certa conoscenza di C per alcune funzioni che sono solo un wrapper sottile per la funzione C dietro) e così via.


3

Sì, imparare il linguaggio C prima di qualsiasi altro linguaggio avanzato ti aiuterà ad imparare velocemente altri linguaggi.


2

Secondo Wikipedia , Objective-C è un rigoroso superinsieme di C. In questo caso, suggerirei di imparare prima il C. Quindi quando impari Objective-C sarà chiaro quali parti vengono aggiunte come parte di Objective-C.


2

C ti dà pochissima astrazione dall'assemblaggio. Alcuni compilatori C ti permetteranno persino di assemblare in linea. Questo può essere molto utile per pensare a come funziona il computer, che è importante sapere.

Detto questo, se sei veramente interessato all'Object-C, non lasciarti bloccare a scrivere qualcosa in C solo perché "fa bene". Non devi frustrarti mentre cerchi di apprendere un nuovo set di abilità. È importante che ti diverta con quello che stai facendo.



2

L'obiettivo C è sufficientemente diverso da C da non meritare l'apprendimento C prima.

Dal punto di vista della sintassi / famiglia linguistica è quasi meglio studiare SmallTalk (su cui si basa l'obiettivo C)

Da una prospettiva pratica, concentra i tuoi sforzi sull'apprendimento di una lingua alla volta.

Successivamente, se desideri imparare un altro linguaggio, C ++, Java e Python sono 1) facili da imparare in gruppo 2) popolari e quindi commerciabili 3) potenti.


1
No, Objective-C è un piccolissimo superset di C. Senza C non puoi fare nulla in Objective-C. Certo, il modello a oggetti è preso da smalltalk, ma la sintassi per la maggior parte delle parti non è nemmeno vicina.
Sven

2

Dovresti avere una conoscenza di base di C prima di avviare Objective_C, ma non è necessario padroneggiare ogni dettaglio di C.

Ho pubblicato i miei appunti dopo aver letto "Programmazione in Objective-C" nel caso in cui aiutasse qualcun altro.

imparare l'obiettivo c con la programmazione-


1

A seconda di molte lingue che già conosci, potrebbe essere un'idea migliore iniziare ad imparare Objective-C. Le basi nella maggior parte delle lingue sono fondamentalmente le stesse, è la sintassi che è diversa. Imparare prima il C non farà davvero molta differenza quando si tratta di apprendere Objective-C.


Ma solo se si conosce almeno un altro linguaggio di programmazione.
Sven

Oltre al commento di @ Sven: "... che ha qualche concetto di puntatori"
MANIAK_dobrii

1

Ho imparato subito Objective-C e ha funzionato bene per circa un anno ormai, ho avuto qualche difficoltà a leggere il codice C quando ho scaricato il progetto per vedere come funzionano, ma ora sento davvero il bisogno di imparare C.Puoi provare ad imparare ObjC senza C, ma prima o poi avrai bisogno di C.


1

IMHO si dovrebbe prima imparare almeno un po 'di C e soprattutto sui puntatori. Ciò è ancora più importante se si proviene da una lingua che non ha puntatori. Molte persone chiedono del codice come

NSString *string = [[NSString alloc] init];
string = @"something";

poiché non conoscono la distinzione tra un puntatore e l'oggetto a cui punta.

Ovviamente non è necessario imparare tutto il C prima di poter iniziare con Objective-C, ma alcune cose fondamentali sono assolutamente necessarie.


Vorrei poter votare +10. Una volta in un'intervista a obj-c dev mi è stato chiesto se è possibile creare un puntatore a NSInteger ... Sono rimasto scioccato, perché era così essenziale per me, ma sembra non per tutti. Quindi è importante e facile dimenticare che anche questo deve essere compreso.
MANIAK_dobrii

0

Diamine no, vai direttamente all'obiettivo C!

Sono passato da ActionScript 3 a Objective C e ho già uno stagista in un'azienda!

Fai quello che vuoi.


Perché perdere completamente lo stato mentale orientato agli oggetti e iniziare ad imparare prima il C? È come imparare a far volare un aquilone e sperare di essere un pilota. È necessario integrare l'OOP sin dall'inizio.
SwiftArchitect

0

Se impari un'altra lingua prima, avrai sempre confusione nello scrivere la sintassi corretta. Non conosco lo scopo, ma Object C utilizza una sintassi strana (non comune) per chiamare i metodi degli oggetti. Lo denomina come invio di messaggi, sì, è vero di conseguenza puro concetto Object Oriented, tuttavia la maggior parte dei linguaggi Object oriented lo chiamano metodo chiamante e usano la sintassi più tradizionale dei metodi chiamanti. La raccolta dei rifiuti è anche qualcosa di molto strano, Object C si basa sul conteggio dei riferimenti della vecchia scuola. Quindi avrai difficoltà ad accettarlo se passi da un'altra lingua. Sto scrivendo un libro Guida rapida alla migrazione di Object C per programmatori C / C ++ che sperano di aiutare le persone a rilevare tutte le differenze più rapidamente.


Perché in Objective-C "inviare un messaggio" non significa "chiamare un metodo", ma, allo stesso tempo, l'invio di un messaggio provoca la chiamata di un metodo (funzione) =) Quando si invia un messaggio a un oggetto, viene inviato un messaggio meccanismo (potete leggere qui: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/... o qui: stackoverflow.com/questions/982116/... )
MANIAK_dobrii
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.