web-dev-qa-db-fra.com

Apprenez le C avant d'apprendre l'Objectif-C

Étant un aspirant développeur Apple développeur, je veux obtenir l'avis de la communauté s'il vaut mieux apprendre le C avant de passer à Objective-C et finalement au Cocoa Framework?

Mon instinct dit apprendre C, ce qui me donnera une bonne base.

106
Lark

J'apprendrais d'abord C. J'ai appris le C (et j'ai beaucoup fait en C) avant de passer à Obj-C. J'ai de nombreux collègues qui n'ont jamais été de vrais programmeurs C, ils ont commencé avec Obj-C et n'ont appris que le C nécessaire.

De temps en temps, je vois comment ils résolvent un problème entièrement en Obj-C, entraînant parfois des solutions très maladroites. Habituellement, je remplace ensuite du code Obj-C par du code C pur (après tout, vous pouvez les mélanger autant que vous le souhaitez, le contenu d'une méthode Obj-C peut être entièrement du code C pur). Sans aucune intention d'insulter un programmeur Obj-C, il existe des solutions très élégantes en Obj-C, ce sont des solutions qui fonctionnent (et ont l'air) beaucoup mieux grâce à objets (la programmation OOP peut rendre les programmes complexes beaucoup plus beaux que la programmation fonctionnelle; le polymorphisme par exemple est une fonctionnalité brillante) ... et j'aime vraiment Obj-C (bien plus que C++! Je déteste la syntaxe C++ et certaines fonctionnalités du langage sont trop exagérées et conduisent à de mauvaises modèles de développement à mon humble avis); cependant, lorsque je réécris parfois le code Obj-C de mes collègues (et je ne le fais vraiment que si je pense que cela est absolument nécessaire), le code résultant est généralement 50% plus petit, n'a besoin que de 25% de la mémoire utilisée avant et est environ 400% plus rapide à l'exécution.

Ce que j'essaie de dire ici: chaque langue a ses avantages et ses inconvénients. C a des avantages et des inconvénients, tout comme Obj-C. Cependant, la très bonne fonctionnalité d'Obj-C (c'est pourquoi je l'aime même plus que Java) est que vous pouvez passer au C simple à volonté et inversement. Pourquoi est-ce une telle fonctionnalité? Parce que, tout comme Obj-C corrige de nombreux inconvénients du C pur, le C pur peut corriger certains des inconvénients d'Obj-C. Si vous les mélangez, vous recevrez une équipe très puissante.

Si vous apprenez seulement l'Obj-C et n'avez aucune idée de C ou ne connaissez que les bases de celui-ci et que vous n'avez jamais essayé avec quelle élégance il peut résoudre certains problèmes courants, vous n'avez en fait appris que la moitié de l'Obj-C. C est une partie fondamentale d'Obj-C. La possibilité d'utiliser C à tout moment et partout en est une caractéristique fondamentale.

Un exemple typique était un code que nous avons utilisé qui devait coder des données en base64, mais nous ne pouvions pas utiliser une bibliothèque externe pour cela (pas de bibliothèque OpenSSL). Nous avons utilisé un encodeur base64, entièrement écrit en utilisant des classes Cocoa. Cela fonctionnait bien, mais lorsque nous l'avons fait encoder 200 Mo de données binaires, cela a pris une éternité et la surcharge de mémoire était inacceptable. Je l'ai remplacé par un petit encodeur base64 ultra compact écrit entièrement comme une fonction C (j'ai copié le corps de la fonction dans le corps de la méthode, la méthode a pris NSData en entrée et a renvoyé NSString en sortie, mais à l'intérieur de la fonction, tout était C). L'encodeur C était tellement plus compact, il battait l'encodeur Cocoa pur du facteur 8 en vitesse et la surcharge de mémoire était également beaucoup moins. Encoder/décoder des données, jouer avec des bits et des tâches similaires de bas niveau ne sont que les points forts de C.

Un autre exemple était un code d'interface utilisateur qui a dessiné beaucoup de graphiques. Pour stocker les données nécessaires pour peindre les graphiques, nous avons utilisé NSArray. En fait NSMutableArray, puisque le graphique était animé. Résultat: animation graphique très lente. Nous avons remplacé tous les NSArray par des tableaux C normaux, des objets avec des structures (après tout, les informations de coordonnées du graphique ne sont rien que vous devez avoir dans les objets), l'accès de l'énumérateur avec des boucles simples pour et avons commencé à déplacer des données entre les tableaux avec memcopy au lieu de prendre des données d'un tableau vers l'autre, index pour index. Le résultat: une accélération du facteur 4. Le graphique s'animait en douceur, même sur les anciens systèmes PPC.

La faiblesse de C est que chaque programme plus complexe devient laid à long terme. Garder les applications C lisibles, extensibles et gérables demande beaucoup de discipline à un programmeur. De nombreux projets échouent car cette discipline fait défaut. Obj-C vous permet de structurer facilement votre application à l'aide de classes, d'héritage, de protocoles, etc. Cela dit, je n'utiliserais pas de fonctionnalité C pure à travers les frontières d'une méthode, sauf si cela est nécessaire. Je préfère garder tout le code dans une application Objective-C dans la méthode d'un objet; tout le reste va à l'encontre du but d'une application OO. Cependant, dans la méthode, j'utilise parfois exclusivement du C pur.

162
Mecki

Vous pouvez facilement apprendre C et Objective-C en même temps - il n'est certainement pas nécessaire d'apprendre les minuties de C (y compris l'arithmétique des pointeurs et ainsi de suite) avant de commencer avec les ajouts d'Objective-C au langage, et en tant que programmeur débutant se lancer rapidement avec Objective-C peut vous aider à commencer à "penser dans les objets" plus rapidement.

En termes de ressources disponibles, la documentation d'Apple suppose généralement une familiarité avec C, donc commencer par The Objective-C 2.0 Programming Language ne vous sera pas très utile. J'investirais dans une copie de Programming in Objective-C de Stephen Kochan (selon la rapidité avec laquelle vous souhaitez démarrer, vous pourriez envisager d'attendre la deuxième édition):

Programmation de la bibliothèque de développeurs Objective-CProgrammation de la bibliothèque de développeurs Objective-C 2.

Il ne suppose aucune expérience préalable et vous apprend l'Objective-C et autant de C que vous en avez besoin.

Si vous vous sentez un peu ambitieux, vous pouvez commencer par Tutoriel "Learn C" de Scott Stevenson , mais il a quelques prérequis ("Vous devriez déjà connaître au moins un langage de script ou de programmation, y compris les fonctions , variables et boucles. Vous devrez également saisir des commandes dans le terminal Mac OS X. ").

(Juste pour mémoire et pour le contexte: j'ai appris les deux en même temps en 1991 - cela ne semblait pas me faire de mal. Cependant, j'avais une formation en BASIC, Pascal, Logo et LISP.)

25
mmalc

J'ai beaucoup réfléchi à cette question avant d'écrire mon livre sur Objective-C. Tout d'abord, je crois vraiment qu'apprendre le langage C avant d'apprendre Objective-C est le mauvais chemin. C est un langage procédural contenant de nombreuses fonctionnalités qui ne sont pas nécessaires pour la programmation en Objective-C, en particulier au niveau novice. En fait, le recours à certaines de ces fonctionnalités va à l'encontre du respect d'une bonne méthodologie de programmation orientée objet. Ce n'est pas non plus une bonne idée d'enseigner tous les détails d'un langage procédural (et d'attaquer la solution d'un problème avec des fonctions et des techniques de programmation structurées) avant d'en apprendre un orienté objet. Cela peut démarrer le programmeur dans la mauvaise direction, ce qui peut conduire à développer une mauvaise orientation et un mauvais état d'esprit pour favoriser une bonne discipline de programmation orientée objet. Ce n'est pas parce que Objective-C est une extension du langage C que vous devez d'abord apprendre le C!

Je pense que l'enseignement d'Objective-C et du langage C sous-jacent comme un seul langage intégré est la bonne approche. Il n'y a aucune raison d'apprendre qu'une déclaration "for" provient du langage C et non de son langage Objective-C sur-ensemble. De plus, pourquoi apprendre en détail des choses comme les tableaux C et les chaînes (et les manipuler) avant apprendre les objets tableau (NSArray) et chaîne (NSString), par exemple? De nombreux textes C consacrent beaucoup de temps aux structures et aux pointeurs sur les structures, et parcourent les tableaux avec des pointeurs. Mais vous pouvez commencer à écrire des programmes Objective-C sans connaître aucune de ces fonctionnalités du langage C. Et pour un programmeur débutant, c'est un gros problème. Non seulement cela raccourcit la courbe d'apprentissage, mais réduit également la quantité de matériel à apprendre (et une partie filtrée de manière sélective) pour écrire des programmes Objective-C.

Je suis d'accord que vous voudrez apprendre la plupart, sinon la totalité, des fonctionnalités C sous-jacentes, mais beaucoup peuvent être différées jusqu'à ce que vous maîtrisiez bien la définition des classes et des méthodes, le travail avec les objets et les expressions de message, et la compréhension des concepts d'héritage et le polymorphisme est bien connu.

18
skochan

Je plongerais directement avec Objective C - si vous avez déjà quelques langues sous votre ceinture, ce n'est pas la syntaxe qui est la courbe d'apprentissage, c'est Cocoa.

15
Paul Dixon

Je pense que, pour la plupart, l'apprentissage du C est une bonne idée, peu importe dans quel domaine vous allez, au moins pour comprendre le fonctionnement interne du développement de logiciels avant d'utiliser des produits préemballés, de cette façon si quelque chose ne va pas vous avez une meilleure chance de comprendre le fonctionnement interne. Il y a beaucoup de discussions à ce sujet sur SO, et c'est une question plutôt subjective, mais en général, vous utiliserez intrinsèquement C dans votre code Objective-C, donc je suppose que cela dépend vraiment de vous. Je suis une personne de haut niveau, mais parfois cela peut gêner et je connais plusieurs personnes intelligentes qui ont travaillé de haut en bas, je pense que la partie importante est que vous arriviez à comprendre le fonctionnement interne comme il le fera démarquez vos capacités de celles qui ne le font pas et augmentez vos capacités.

10
TheXenocide

C'est une bonne idée d'apprendre C avant d'apprendre Objective-C, qui est un surensemble strict de C. Cela signifie que Objective-C peut prendre en charge tout le code C normal, donc le code commun aux programmes C est lié à apparaître même dans Objective- Code C.

En plus de regarder les choses uniquement du point de vue de la langue, vous constaterez que Mac OS X est un système d'exploitation Unix complet. Toutes les bibliothèques de niveau système sont écrites en C.

Il est probablement possible d'apprendre les deux en même temps, mais je pense que vous apprécierez et comprendrez davantage Objective-C si vous avez d'abord une solide connaissance pratique de C.

7
Doug

Lorsque vous apprenez Objective-C et Cocoa, vous ne pouvez pas éviter d'apprendre des bits de C. Par exemple, les rectangles sont couramment représentés par CGRect, une structure C.

Si vous avez le temps, apprenez par tous les moyens C. Comme d'autres l'ont dit ici, le livre de Kochan (deuxième et première éditions) est excellent comme livre à plonger.

5
mattwestbright

J'apprendrais l'Objective-C et j'apprendrais autant de C que vous en auriez besoin.

Les domaines de C sur lesquels vous ne dépendrez pas beaucoup:

  • Arithmétique et tableaux de pointeurs. Je n'ai pas du tout utilisé de tableaux C.
  • Cordes en C. Les cordes d'Objective-C font le travail de manière plus agréable et plus sûre.
  • Gestion manuelle de la mémoire si vous utilisez GC dans Obj-C 2.1. Je recommande fortement cette route pour des raisons de vitesse de développement et de performances.
5
Giao

Il y a beaucoup de choses que vous ne pouvez pas faire uniquement dans Objective-C, donc l'apprentissage de certaines compétences de base en C sera assez critique. Vous aurez au moins besoin de comprendre les déclarations de variables et les fonctions de base de la bibliothèque C, ou vous serez frustré.

4
Mark Bessey

Oui, l'apprentissage du langage C avant toute autre langue avancée vous aidera à apprendre rapidement d'autres langues.

3
Coding future

Mieux, je ne sais pas, encore moins car je ne connais pas Objective-C.
Mais les bases de C ne sont pas si difficiles à apprendre, ce n'est pas un langage très complexe (en termes de syntaxe, pas en termes de mastering!), Alors allez-y, il ne sera pas gaspillé temps.
Personnellement, je pense que c'est toujours une bonne idée d'apprendre le C, cela donne un bon aperçu du fonctionnement de l'ordinateur. Après tout, la plupart des langages et des systèmes sont toujours écrits en C. Alors continuez! :-)

PS: Par "passer à autre chose", je ne voulais pas dire "laisser tomber", juste "en savoir plus, apprendre différemment". Une fois que vous connaissez C, vous pourriez ne jamais le laisser tomber: Java utilise JNI pour appeler des routines C pour des trucs de bas niveau, Python, Lua, etc. sont souvent étendus avec du code C (la référence Lua suppose même simplement que quelques connaissances en C pour certaines fonctions qui ne sont qu'un mince wrapper pour la fonction C derrière), et ainsi de suite.

3
PhiLho

Honnêtement, tant de langages sont basés sur la syntaxe C que c'est une bonne chose à connaître. Je prendrais une semaine ou deux pour vous familiariser avec C malgré tout.

Cela dit, je viens de m'enseigner l'objectif C, et je dois être honnête: je n'ai pas trouvé mon expérience en C aussi utile que je l'aurais pensé. L'objectif C m'a définitivement ouvert les yeux.

3
user25967

Vous pouvez accéder directement à Objective-C, avec les avantages suivants:

  1. Vous apprendrez "certains" C de la manière.
  2. Vous apprendrez les parties C qui vous intéressent.

Au moins pour moi, il est plus facile d'apprendre une nouvelle langue lorsque je suis intéressé par une application ou un échantillon spécifique, et j'échoue lorsque je dois apprendre autre chose qui n'est pas exactement ce qui m'intéresse.

Vous pouvez toujours affiner vos connaissances C plus tard si vous vous intéressez à la programmation de niveau inférieur.

3
OscarRyz

Selon Wikipedia , Objective-C est un super-ensemble strict de C. Ceci étant le cas, je suggère d'apprendre le C en premier. Ensuite, lorsque vous apprendrez Objective-C, il sera clair quelles parties sont ajoutées dans le cadre d'Objective-C.

2
Trent

C vous donne très peu d'abstraction de l'Assemblée. Certains compilateurs C vous permettront même d'assembler en ligne. Cela peut être très utile pour réfléchir au fonctionnement de l'ordinateur, ce qu'il est important de savoir.

Cela étant dit, si vous êtes vraiment intéressé par Object-C, ne vous laissez pas coincer en écrivant quelque chose en C juste parce que c'est "bon pour vous". Vous n'avez pas besoin de vous frustrer lorsque vous essayez d'apprendre un nouvel ensemble de compétences. Il est important que vous vous amusiez avec ce que vous faites.

2
Steve g

Vous devez avoir une connaissance de base de C avant de démarrer Objective_C, mais il n'est pas nécessaire de maîtriser chaque détail de C.

J'ai publié mes notes après avoir lu "Programmation en Objective-C" au cas où cela aiderait quelqu'un d'autre.

apprendre l'Objectif C avec la programmation -

2
cfischer

Voulez-vous être un développeur hard-core? Apprenez ensuite c en premier.

Les livres dont vous avez besoin pour maîtriser complètement c sont parmi les meilleurs écrits en technologie. Voici ce dont vous avez besoin:

langage de programmation C

La bibliothèque C standard

2
Freddie

L'objectif C est suffisamment différent de C pour ne pas mériter d'apprendre C en premier.

Du point de vue de la syntaxe/famille linguistique, il est presque préférable d'étudier Smalltalk (sur lequel l'Objectif C est basé)

D'un point de vue pratique, concentrez vos efforts sur l'apprentissage d'une langue à la fois.

Plus tard, si vous souhaitez apprendre un autre langage, C++, Java et Python sont 1) facile à apprendre en tant que groupe 2) populaire et donc commercialisable 3) puissant.

2
Brooks

Selon de nombreuses langues que vous connaissez déjà, il peut être préférable de commencer à apprendre Objective-C. Les fondements dans la plupart des langues sont fondamentalement les mêmes, c'est la syntaxe qui est différente. Apprendre le C en premier ne fera pas vraiment de différence en ce qui concerne l'apprentissage de l'Objectif-C.

1
Dave

À mon humble avis, il faut d'abord apprendre au moins certains C et en particulier sur les pointeurs. C’est encore plus important si l’on vient d’une langue qui n’a pas de pointeurs. Beaucoup de gens posent des questions sur le code comme

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

car ils ne connaissent pas la distinction entre un pointeur et l'objet vers lequel il pointe.

Bien sûr, il n'est pas nécessaire d'apprendre tous de C avant de commencer avec Objective-C, mais certaines choses fondamentales sont absolument nécessaires.

1
Sven

J'ai tout de suite appris Objective-C et cela a bien fonctionné pendant environ un an maintenant, j'ai juste eu quelques difficultés à lire le code C lorsque j'ai téléchargé le projet pour voir comment il fonctionne, mais maintenant je ressens vraiment le besoin d'apprendre C. Vous pouvez essayer d'apprendre ObjC sans C, mais tôt ou tard, vous aurez besoin de C.

1
Alexandre Cassagne

Si vous apprenez une autre langue auparavant, vous aurez toujours de la confusion en écrivant la bonne syntaxe. Je ne connais pas le but, mais l'Objet C utilise une syntaxe étrange (pas commune) pour appeler des méthodes d'objet. Il le nomme comme envoyant des messages, oui, c'est vrai en conséquence pur concept orienté objet, cependant la plupart des langages orientés objet le nomment comme méthode d'appel et utilisent une syntaxe plus traditionnelle des méthodes d'appel. La collecte des ordures est également quelque chose de très étrange, l'Objet C est basé sur le compte de référence de la vieille école. Vous aurez donc des difficultés à l'accepter si vous passez d'une autre langue. J'écris un guide de migration rapide Object C pour les programmeurs C/C++ dans l'espoir d'aider les gens à détecter toutes les différences plus rapidement.

0
Dmitriy

Heck non, allez directement à l'objectif C!

Je suis passé d'ActionScript 3 à Objective C, et j'ai déjà un stagiaire dans une entreprise!

Fais ce que tu veux.

0
Nathan