C pour le programmeur Java? [dupliquer]


Double Possible:
dois-je apprendre le C avant le C++?

En tant que programmeur professionnel (Java) et utilisateur lourd de Linux, je pense qu'il est de ma responsabilité d'apprendre du C (même si je ne l'utilise jamais professionnellement), juste pour faire de moi un meilleur codeur.

Deux questions :

  1. Dois - je d'abord essayer C ou C++ - je me rends compte que ce sont des langages différents avec un terrain d'entente. Est-il utile d'apprendre un peu des deux, ou simplement d'essayer un? Il paraît que C++ est un peu un mastodonte cauchemardesque d'un langage.

  2. Quelles sont les meilleures ressources (livres, tutoriels, programmes de pratique, code de référence) pour un développeur Java comme moi.

Merci

Author: Community, 2010-08-21

7 answers

C est simple à apprendre, difficile à maîtriser. en tant que programmeur Java, la barrière sera la mémoire et la structure .. et annuler les dommages que Java peut avoir fait à l'algorithme produisant des parties de votre cerveau ;)

Je recommanderais de me familiariser avec la chaîne d'outils GCC sur votre boîte Linux, via des tutoriels sur Internet. Ensuite, lisez Le langage de programmation C, et une copie de Linux Application Development ne fait pas de mal. Aussi, sur Linux glib vous évitera de réinventer la roue ... mais essayez au moins de créer votre propre liste liée, hashmap, graphique et autre API pour apprendre. L'arithmétique des pointeurs, les tableaux et l'apprentissage que les éléments tels que les structures ne sont que nommés-les décalages dans un bloc binaire sont tous importants. Passer du temps avec malloc et free et memcheck. Avec C, vos outils et votre chaîne d'outils sont très importants et l'E n'est pas nécessairement votre ami lors de l'apprentissage.

Je choisirais C plutôt que C++ car C est une bonne base pour habituez-vous à la gestion de la mémoire et à l'utilisation du pointeur de C.

La meilleure chose que vous pouvez faire est de appliquer ce que vous apprenez à un véritable projet. Mais soyez prêt à frapper votre tête contre le mur allot dans Valgrind et GDB. Je programme C depuis des années,et je ne suis toujours pas moine C.

Je suis d'accord que C est un excellent langage, il montre un mauvais programmeur. Mais rappelez-vous:

Tout programme C suffisamment compliqué contient un, mise en œuvre lente de la moitié de Common Lisp, spécifiée de manière informelle, truffée de bogues.

Dont la morale est d'apprendre d'autres langues aussi, plutôt que de simplement dérivées de C! Considérez un dialecte Lisp, Erlang (qui est cool en ce moment), Haskell, etc. Ils élargiront vos horizons à partir de la cellule 2x2 de Java. Pensez à regarder SICP aussi.

 28
Author: Aiden Bell, 2010-08-22 12:06:46

Venant d'ASM, C, puis C++, et enfin atterrissant (forcé) sur le territoire Java, j'ai pensé que je pourrais donner une opinion sur le sujet.

Tout d'abord, avec tout le respect que je dois à la communauté Java, l'expérience commerciale montre que si les programmeurs C/C++ peuvent s'habituer aux principes et à la programmation Java (ce n'est peut-être pas si facile), le contraire se produit plus rarement. En d'autres termes, un programmeur C++ devra apprendre et faire face à des tonnes de règles Java (Frameworks...), mais elle va éventuellement (et généralement) être capable de produire un code de travail à long terme en injectant beaucoup de son expérience du système dans le processus. Un programmeur Java allant en C, habitué à des principes plus théoriques et à des règles de structure strictes peut

  • se sentir en insécurité car elle doit décider de beaucoup de choses, comme l'organisation et la structure du programme
  • sentez-vous surpris par les pointeurs, et la gestion de la mémoire: allocation et libération, ce qui doit être bien pensé - découvrir le monde des fuites de mémoire
  • sentez-vous découragé, car les bugs n'apparaîtront pas noir sur blanc dans une console dictée par la JVM à travers 200 lignes de trace de pile, mais peuvent se produire à un niveau plus profond / système, peut-être pris grâce à unE devant lequel le programmeur Java contemplera du code assembleur pour la 1ère fois de sa vie
  • se sentir perplexe quant à quel algorithme et comment l'implémenter, celui qui a été intégré dans Java qu'elle n'a jamais eu à s'inquiéter Au sujet...

Donc, maintenant, ma tâche est de vous aider à vous sentir en sécurité, confiant et motivé avant d'apprendre le C/C++!

Mon conseil est de commencer par C, car

  • C possède à lui seul tous les concepts que vous n'avez jamais eu à affronter avec Java
  • en tant que programmeur Java, vous avez déjà une approche de classes, et à partir de C++, vous pouvez être tenté de vous en tenir aux principes Java OO
  • Les principes C sont limités à quelques-uns. C ressemble au tout dernier humain chose avant d'entrer dans le monde sombre de langage d'assemblage.

Ce que je soulignerais au cours de l'étude C est, par exemple

  • Pointeurs Java utilise bien sûr des pointeurs, mais cache son accès tout en passant des classes aux méthodes en tant que pointeurs. En C, vous devrez apprendre la différence entre par value et par reference. En outre, la différence la plus subtile entre char x[3] et char *x = "ab". Et comment les pointeurs sont pratiques pour passer par un tableau,etc... vous savez *++x ou *x++. Beaucoup a été dit sur les pointeurs, mon conseil serait

    1. toujours garder le contrôle, c'est-à-dire ne pas mettre trop d'indirections quand ce n'est pas nécessaire
    2. ne pas typedef pointeurs, comme typedef int *pointerToInt; cela semble plus facile au début (pointerToInt pi au lieu de int *pi) après quelques niveaux, je préfère compter les étoiles que le 'pointerTo' [certains grands cies le font]. Sauf peut-être les pointeurs vers les fonctions, illisibles de toute façon.
  • Mémoire Lorsque vous avez besoin de la mémoire, vous allouer, et quand vous n'en avez plus besoin, vous gratuit. Facile. La chose est d'allouer le bon montant, et non de le libérer deux fois... Pour s'habituer à cela. Et habituez-vous au tas, à la pile... Et lorsque votre programme s'exécute et adresse NULL (0), vous pouvez avoir une exception visible. Peut-être pas.

  • Structure de données Donc vous voulez utiliser un HashMap pratique? Bien sûr, après vous l'avez développée. Ou il y a des bibliothèques que vous pouvez lier qui font ce genre de chose, il suffit de choisir celui de droite. Pour être juste, lors de la programmation en C, vous [devez] penser différemment, et pouvez trouver un algorithme plus approprié qu'une carte pour un problème donné.

Dans l'ensemble, vous vous sentirez désorienté au début, mais finalement (sauf si vous avez des cauchemars) vous trouverez devant vous beaucoup de place pour le plaisir et le plaisir. C permet à une personne de programmer en toute liberté: C va selon vos idées, pas le contraire.

 25
Author: Ring Ø, 2010-08-21 21:42:24

Si l'objectif est de faire de vous un meilleur codeur, visez des langues qui essaient réellement d'être différentes. Java, C++ et C sont tous étroitement liés.

Certes, on est avant tout un langage procédural, on essaie vraiment de faire semblant d'être POO, et on est un mélange d'au moins 4 paradigmes différents, mais ce sont tous des langages impératifs, ils partagent tous beaucoup de syntaxe, et fondamentalement, ils font tous partie de la même famille de langages.

Apprendre C ne vous apprendra rien de radicalement nouveau. Il peut vous apprendre un peu plus sur disposition de la mémoire et, mais vous pouvez apprendre beaucoup d'autres façons, et c'est juste pas très pertinent pour un programmeur Java.

D'autre part, le langage est relativement facile à prendre en main, et largement utilisé pour beaucoup de logiciels Linux, donc si vous voulez contribuer à l'un de ceux-ci, apprendre le C est une bonne idée. Cela ne fera tout simplement pas de vous un bien meilleur programmeur Java.

Quant à C++, l'appelant un " mastodonte cauchemardesque d'un langage" n'est probablement pas loin de la vérité. Il est grand et complexe et plein de bizarre pièges pour les imprudents débutant.

Mais il a aussi quelques qualités rédemptrices. D'une part, c'est l'un des seuls langages à prendre en charge le paradigme de programmation générique, ce qui vous permet d'exprimer de nombreux concepts avancés de manière très concise, et avec un haut degré de flexibilité et de réutilisation de code.

C'est un langage qui vous fera probablement à la fois détester C++ pour être un tel gâchis, et tous les autres langages pour les fonctionnalités C++ manquantes qui auraient rendu votre code tellement plus simple.

Encore une fois, apprendre C++ ne fera pas une énorme différence pour vous en tant que programmeur Java, sauf que cela révélera un certain nombre de lacunes en Java que vous n'étiez pas au courant jusqu'à présent.

Apprendre l'une ou l'autre langue est bon, mais ce qui est mieux, c'est d'apprendre quelque chose dedifférent .

Apprendre SML ou Scheme ou Haskell. Ou Ruby, Python ou Smalltalk. Que diriez-vous d'Erlang ou d'Occam? Ou Prolog.

Apprenez quelque chose qui n'est ni le frère ni l'ancêtre de Java, quelque chose qui est conçu à partir de zéro pour n'avoir rien en commun avec Java. Apprenez un langage fonctionnel comme SML, ou un langage typé dynamiquement comme Python, ou un langage qui change radicalement la façon dont vous gérez la concurrence, comme Erlang.

 11
Author: jalf, 2010-08-21 21:17:21
  1. Cela dépend de ce que vous voulez apprendre. Je pense qu'il est probablement préférable de s'asseoir et de réfléchir à la raison pour laquelle vous voulez vraiment le faire. Si Java fait ce que vous voulez, et que vous le faites simplement par sens du devoir déplacé, je pense qu'il existe probablement de meilleures façons de passer votre temps. La réputation de C++ comme un" mastodonte cauchemardesque " se propage principalement par des programmeurs Java non sécurisés essayant de justifier ce qu'ils savent avoir été dans leur cœur un second ordre choix1.
  2. Il existe quelques livres spécifiquement écrits pour les programmeurs Java apprenant le C et/ou le C++. Bien que ce ne soit pas spécifiquement pour les programmeurs Java, si vous décidez de C++ plutôt que de C, je considérerais Acclerated C++.

1Je plaisante au moins, bien sûr, mais il y a un nombre presque incroyable de programmeurs Java qui semblent avoir une puce sur leur épaule. Si vous dites à quelqu'un qui utilise Python ou Ruby (pour seulement un couple d'exemples) que c'est lent, la réaction typique est qu'ils ont l'air un peu perplexes et disent quelque chose comme: "Si vous le dites -- cela me semble assez rapide."Suggérer la même chose à propos de Java est pratiquement garanti pour produire des affirmations selon lesquelles vous êtes évidemment ignorant et n'exprimez que de la haine aveugle.

Edit: En ce qui concerne le choix entre C et C++, pour quelqu'un habitué à Java, C sera simplement un exercice de frustration. La différence de langue exigerait beaucoup ajustement de toute façon, mais passer d'une bibliothèque de la taille de Java à une bibliothèque de la taille de C entraînera simplement la destruction de sa productivité pendant un certain temps, et est plus susceptible de lui nuire à nouveau toutes les langues avec "C" dans le nom que de l'aider à apprendre quoi que ce soit.

Passer directement de Java à C, c'est comme prendre quelqu'un dont l'idée d'une voiture sportive est quand il conduit la Lincoln Town Car au lieu d'être chauffeur dans la limousine, et quand il décide que la course est cool, vous jetez-le directement sur le siège d'une voiture de sprint hors-la-loi. Donnez-lui une chance dans (non seulement beaucoup plus sûr, mais en fait plus rapide) voiture de sport légale de rue d'abord...

 7
Author: Jerry Coffin, 2010-08-22 00:22:31

En ce qui concerne (1), je dirais probablement C. C'est beaucoup plus étranger. Puisque votre objectif est d'être multilingue pour lui-même, aller vers un langage très différent de Java sera probablement plus utile que d'apprendre le C++, ce qui vous mettra probablement en colère. C++ reçoit beaucoup de merde de la part des gens, et ce n'est pas nécessairement horrible, mais la raison principale est qu'il essaie de forcer un nouveau paradigme dans la structure de C, qui ne fonctionne pas aussi bien qu'un langage qui commence par ce paradigme dans la première place.

Pour (2), je recommande vivement K&R. Il suppose une certaine familiarité de programmation, est bref, au point, mais est également assez profond pour expliquer les concepts. Il n'inclut pas d'exercices, cependant, que vous devrez trouver ailleurs. J'ai appris C sur le tas, j'ai peur (et je paie toujours pour ça!) donc je ne peux pas vous donner de l'aide instruite là-bas.

 5
Author: spencer nelson, 2010-08-21 18:49:44

Puisque vous faites cela pour l'épanouissement personnel et l'apprentissage, je dis go for broke et essayez C++.

Une petite préface avant d'élaborer: je travaillais principalement avec C++ et je n'ai jamais travaillé avec du code C de taille significative. Maintenant, je travaille avec C# pour la plupart, en utilisant uniquement C++ à de rares occasions.

Je pense que C++ est une meilleure option parce que:

  • C'est un super-ensemble partiel de C: Les programmes C ne compileront généralement pas en tant que programmes C++, mais le chevauchement entre les deux langues est assez important qu'il ne devrait pas être difficile pour vous de re-cibler vos compétences pour travailler avec du code C si vous en avez besoin.
  • C++ vous présentera plus de concepts: Vous aurez tout le plaisir de la gestion de la mémoire et du bit twiddling que vous pouvez faire en C. Mais vous pourrez également voir des génériques comme vous ne les avez jamais vus auparavant, comment les algorithmes peuvent être écrits indépendamment des conteneurs, comment faire du polymorphisme au moment de la compilation, comment en fait utile parfois ...
  • Vous apprendrez à apprécier beaucoup plus la conception du langage Java: C++ est un langage compliqué avec de nombreux cas de gotchas et edge (voir laFAQ et laFQA pour quelques exemples). En les expérimentant par vous-même, vous serez en mesure de mieux comprendre la plupart des décisions de conception qui ont été prises à la fois en Java et en C#.

Cela se résume à ceci: Plus vous apprenez, plus vous serez en mesure d'apprendre. Et C++ force beaucoup d'apprentissage sur vous, certainement plus que C. Et c'est une bonne chose.

 4
Author: Mhmmd, 2010-08-22 02:14:23

C++ vous semblera probablement plus familier que C, et sera probablement plus facile à obtenir productif dès le départ. Cependant, C est une langue beaucoup plus petite et devrait être raisonnablement simple à apprendre (bien que méfiez-vous; en apprenant C, vous risquez des lésions cérébrales permanentes). Ma référence personnelle est "C: A Reference Manual" de Harbison & Steele (actuellement 5ème édition). Pour C++, j'utilise juste le livre O'Reilly nutshell.

En tant que programmeur C avec une certaine expérience C++ et actuellement en faisant la transition vers Java, je peux vous dire les choses sur C qui vont probablement vous faire trébucher presque immédiatement:

  • C a très peu d'abstractions; les pointeurs et les flux d'octets le sont à peu près. Il n'existe aucun type de conteneur standard (listes, cartes, etc.). Vous voulez quelque chose de plus sophistiqué qu'un tableau de longueur fixe, vous devrez lancer le vôtre (ou utiliser une bibliothèque développée par quelqu'un d'autre).
  • Il n'y a pas de collecte des ordures dans C. Chaque octet que vous allouez dynamiquement (via malloc() ou calloc()) vous êtes sur le crochet pour la désallocation (via free()).
  • Les tableaux en C ne pas se comportent comme des tableaux en Java; il existe des règles géniales concernant les types de tableaux qui, à première vue, n'ont pas de sens (et ne le feront pas tant que des lésions cérébrales suffisantes ne se sont pas installées). Il n'y a pas de vérification des limites sur les tableaux, et certaines fonctions de bibliothèque standard (notamment gets() et scanf()) font des exploits de dépassement de tampon un risque réel.
  • C déclaration la syntaxe peut être assez tordue. Bien que vous ne voyiez probablement rien d'aussi laid, des déclarations comme int *(*(*(*f)())[10])(); sont possibles (f est un pointeur vers une fonction renvoyant un pointeur vers un tableau de 10 éléments de pointeurs vers des fonctions renvoyant un pointeur vers int`.
  • Les limites d'implémentation de
  • C peuvent varier d'une plate-forme à l'autre; par exemple, la norme de langage ne prescrit que des plages minimales de pour des types comme short, int, et long, mais ils peuvent être plus larges que les exigences minimales. Si vous vous attendez à ce qu'un int soit toujours de la même taille quelle que soit la plate-forme, vous avez des surprises.
  • Le traitement de texte en C est une douleur dans le ass . Sérieusement. C n'a pas de type string en tant que tel.
 2
Author: John Bode, 2010-08-22 02:35:00