web-dev-qa-db-fra.com

Je ne sais pas C. Et pourquoi devrais-je l'apprendre?

Mon premier langage de programmation était PHP ( gasp ). Après cela, j'ai commencé à travailler avec JavaScript. J'ai récemment fait du travail en C #.

Je n'ai jamais regardé des langages de bas ou moyen niveau comme C.

Le consensus général dans la communauté de programmation en général est qu '"un programmeur qui n'a pas appris quelque chose comme C, franchement, ne peut tout simplement pas gérer des concepts de programmation tels que des pointeurs, des types de données, passer des valeurs par référence, etc."

Je ne suis pas d'accord. Je soutiens que:

  1. Parce que les langages de haut niveau sont facilement accessibles, plus de "non-programmeurs" y plongent et font des dégâts
  2. Pour vraiment faire quoi que ce soit dans un langage de haut niveau, il faut comprendre les mêmes concepts similaires que la plupart des partisans de "apprendre à bas niveau en premier" évangélisent.

Certaines personnes ont besoin de connaître C; ces personnes ont des emplois qui les obligent à écrire du code de bas à moyen niveau. Je suis sûr que C est génial, et je suis sûr qu'il y a quelques mauvais programmeurs qui connaissent C.

Pourquoi ce parti pris? En tant que bon programmeur honnête et affamé, si je devais apprendre le C (pour une raison imprévue), j'apprendrais le C. Compte tenu de la multitude de langages, les bons programmeurs ne devraient-ils pas se concentrer sur ce qui nous fait avancer? Ne devrions-nous pas savoir ce qui nous intéresse? Ne devrions-nous pas utiliser notre temps fini pour avancer vers l'avant ? Pourquoi certains programmeurs sont-ils en désaccord avec cela?

Je crois que la recherche de l'excellence dans ce que vous faites est le trait déterministe fondamental entre les bons programmeurs et les mauvais.

Quelqu'un a-t-il des exemples concrets de la façon dont quelque chose écrit dans un langage de haut niveau - par exemple Java, Pascal, PHP ou JavaScript - a vraiment bénéficié d'une connaissance préalable de C? Des exemples seraient les plus appréciés.

58
Stephen

L'avantage de connaître C est que vous avez une très bonne idée du fonctionnement d'un ordinateur. Pas seulement comment fonctionne votre modèle de programmation, mais comment la mémoire est disposée, etc.

Le seul niveau en dessous de C est l'assembly parlé par un processeur particulier.

(J'ajouterais que la connaissance de C vous permet également d'apprécier combien moins de travail vous avez à faire dans une langue de niveau supérieur. Et j'espère que vous apprécierez les coût impliqués dans le travail dans cette langue de niveau supérieur.)

113
Frank Shearar

Je ne pense pas que l'une des réponses ici soit vraiment ce que le PO recherchait, alors je vais jeter mon propre avis.

Ecoutez, je suis un snob C sans excuse. Mon attitude est que si vous ne connaissez pas C, dans une certaine mesure, vous ne savez pas vraiment ce que vous faites en tant que programmeur. Donc, je pense que je suis le genre de personne "partiale" dont vous parlez ici.

Cependant, en pratique, que vous vraiment sachez ce que vous faites en tant que programmeur ne vous empêche pas nécessairement de développer un logiciel vraiment génial et utile à l'aide d'outils de haut niveau. Je veux dire, le créateur de Stack Overflow, Jeff Atwood, ne connaît apparemment même pas C, et pourtant je dirais que Stack Overflow est une sacrément bonne application web.

Que vous décidiez ou non d'apprendre le C (ou C++, ou Assembly) dépend du type de programmeur que vous voulez être. Si vous voulez simplement développer des applications Web ou des applications professionnelles sympas, c'est bien - pas vraiment besoin d'apprendre C. Mais si vous voulez vraiment Excel à ce que vous faites - si vous voulez vraiment travailler - cool projets qui poussent l'état de l'art, alors vous devez vraiment vous prendre suffisamment au sérieux en tant que programmeur pour vraiment comprendre comment les ordinateurs fonctionnent. Étant donné que C est essentiellement l'OS lingua franca, ainsi que le langage qui alimente à peu près tout le reste (du noyau Linux à la plupart des machines virtuelles Java, aux Python = et Ruby interprètes, bases de données SQL, serveurs Web et à peu près tous les pilotes de périphériques), une compréhension intime de la langue va très loin.

Sans oublier que la connaissance du C (ou du C++) ouvre une énorme opportunité pour contribuer à de grands projets open source qui impactent des millions (ou des centaines de millions) de personnes. Vous voulez travailler sur l'amélioration de l'interpréteur Python ou le navigateur Web Chromium? Eh bien, vous devez connaître C pour le premier et C++ pour le second.

C'est pourquoi comparer C à des langues naturelles mortes comme le latin ou des technologies obsolètes comme le cheval et la calèche est complètement faux. Une grande partie de notre infrastructure logicielle du 21e siècle est alimentée par le code C, c'est pourquoi C reste toujours aussi pertinent aujourd'hui.

Donc, si vous devez ou non apprendre le C dépend vraiment de ce que vous attendez de votre carrière de programmeur.

72
Charles Salvia

Une règle pratique est que vous devez comprendre au moins un niveau d'abstraction inférieur à celui dans lequel vous travaillez habituellement. Considérez que votre PHP ou interpréteur JavaScript peut en fait être implémenté en C ou C++. Finalement, vous allez rencontrer un bogue dans l'interpréteur ou même une erreur d'exécution C. Si vous ne comprenez pas C, vous allez être limité à envoyer un rapport de bogue au responsable, en espérant qu'il puisse le reproduire et s'en soucier, et ensuite tourner les pouces. Si vous connaissez C, vous pouvez leur dire exactement où est le problème et de quoi il s'agit.

Cela signifie également que si vous travaillez en C/C++, vous devriez au moins être capable de lire Assembly sur votre plateforme.

Quant à l'apprentissage du C quand vous en avez besoin: mon observation est que la plupart des programmeurs peuvent apprendre Perl/Python/Javascript à la demande, mais l'assembleur/C/LISP semble nécessiter beaucoup plus de temps, donc cela vaut la peine d'apprendre au moins quelques notions de base avant le besoin se pose.

12
Charles E. Grant

Je ne suis pas d'accord pour dire que vous devez apprendre C d'abord, mais je crois que vous devriez apprendre C éventuellement. Toutes les abstractions fuient et la compréhension de C facilite la compréhension de ce qui se passe réellement lorsque vous utilisez une abstraction sophistiquée de haut niveau. Cela dit, je pense également que tous les programmeurs sérieux devraient éventuellement apprendre à lire au moins l'assembleur, pour la même raison.

L'apprentissage de ces concepts de bas niveau donne une capacité surprenante à raisonner sur des choses de haut niveau. Par exemple, en C++ et D, les arguments par défaut des fonctions virtuelles sont déterminés par le type statique (au moment de la compilation) de l'objet, et non par le type dynamique (au moment de l'exécution). Cela n'a de sens que si vous comprenez comment fonctionnent les vtables et les conventions d'appel et pourquoi il serait extrêmement difficile d'implémenter des fonctions virtuelles de la manière opposée.

7
dsimcha

Le parti pris est celui du statu quo. Autrefois (années 80 et antérieures), le C/C++ était à peu près une exigence pour les applications de performance. Cela a changé, mais les développeurs seniors viennent généralement de cet arrière-plan ancien et voient les choses dans ce contexte.

Pour le développement réel, d'autres langages sont utilisés - C # est un langage populaire, tout comme Java, tandis que PHP et Python sont populaires pour projets internes et il est toujours utile d'avoir quelqu'un à portée de main avec au moins des connaissances de base dans ce domaine au cas où vous choisiriez un projet open source PHP projet pour, disons, votre système de suivi des bogues. Cependant, le travail les spécifications semblent toujours provenir de ce modèle standard qui a été écrit il y a 25 ans.

7
JohnL

Quelle grande fête des limaces! (Comme ils disent soi-disant: est-ce un combat privé, ou quelqu'un peut-il participer?)

J'étais professeur, et ce que j'ai trouvé (après quelques essais et erreurs), c'est qu'il était beaucoup plus facile de guider les étudiants à travers les concepts complexes de la programmation s'ils comprenaient, au niveau de base, ce que faisait un ordinateur. Pas dans tous les détails, mais dans le principe de base, comme la mémoire, les instructions, etc. Ce que j'aime chez C, c'est qu'il est proche de la machine.

Cela ne veut pas dire que d'autres enseignants sont venus au même endroit. Ils ont commencé dans le langage de haut niveau (BASIC :-) et ont continué à partir de là, sans effets néfastes évidents.

Donc, en fin de compte, Stephen, vous pourriez avoir raison. Je ne pense pas, mais je me suis trompé avant.

6
Mike Dunlavey

Bien que je déteste publier le blog obligatoire de Joel, je suis d'accord avec lui ici . C est la lingua franca de la programmation. Je ne peux penser à aucun langage de haut niveau qui ne puisse pas interagir avec lui d'une manière ou d'une autre. Pour cette raison, C est toujours un choix populaire pour les choses de type programmation de systèmes. Vous ne pouvez tout simplement pas vous interfacer avec certaines choses au niveau du système d'exploitation sans C.

En plus de cela, que comptez-vous faire lorsque votre langue de haut niveau n'est pas assez rapide? Savoir écrire C est particulièrement important lorsque vous utilisez un langage de haut niveau et typé dynamiquement comme Ruby, Python ou PHP. Mais même Java et C # doivent de temps en temps descendre en C).

6
Jason Baker

Je suppose que c'est un progrès.

Il y a vingt ans, la sagesse conventionnelle était que vous deviez apprendre l'assembleur afin de comprendre ce que vous gagniez des langages de niveau supérieur comme C (c'est pourquoi j'ai dû suivre un cours d'assembleur au collège en utilisant VAX Macro; suppose combien cela s'est avéré utile lors de l'obtention du diplôme).

Il y a une superstition selon laquelle, car C est quelque peu difficile à apprendre et qu'il fournit presque non abstractions (les pointeurs et les flux d'octets le sont à peu près), l'apprendre fera en quelque sorte de vous un meilleur programmeur ou vous donnera une meilleure compréhension sur la façon dont les choses fonctionnent au niveau matériel.

Ce n'est pas nécessairement vrai. Le standard C ne vous rapproche pas plus du métal que tout autre 3GL (Pascal, Fortran, etc.). Certains C implémentations peuvent fournir des crochets qui vous donnent un meilleur accès à certaines zones, mais en général, les pointeurs nus sont à peu près aussi proches que vous, ce qui n'est pas du tout proche. Vous ne pouvez pas accéder directement aux registres ou aux mots d'état, par exemple.

En fin de compte, tout se résume aux opcodes et aux modes d'adressage, donc si vous êtes vraiment intéressé par la façon dont les choses fonctionnent au niveau inférieur, vous seriez mieux servi d'apprendre l'assembleur sur C.

En soi, l'apprentissage de C ne fera pas (nécessairement) de vous un meilleur programmeur. Cela vous donnera certainement une appréciation des types de chaînes réels et des bibliothèques de conteneurs standardisés.

4
John Bode

Procoativement demandé: demandez-vous confirmation que vous n'avez pas à apprendre le C? Si vous apprenez pur C (pas C++ nécessairement), vous aurez une compréhension approfondie du modèle d'exécution d'un ordinateur. Surtout sur la mémoire et l'allocation. Ce truc est également important pour les personnes qui programment dans des langages de niveau supérieur.

Pour un programmeur PHP, la façon dont le code est exécuté sur la machine donnée est un peu moins transparente. Peu importe pour le programmeur PHP puisque le transfert réseau est le goulot d'étranglement). dans l'application, etc.

PHP/Python/C # simple a beaucoup de couches d'abstraction entre le langage et le CPU. ces couches sont si épaisses qu'elles ne vous permettent pas de les regarder. Lorsque vous apprenez le C, il y a une mince feuille entre vous et le CPU et le système d'exploitation. Cela ne facilite pas la programmation (et ce n'est peut-être même pas mieux). Mais vous pouvez réellement apprendre comment fonctionne le CPU. Une fois que vous connaissez le C "intermédiaire", vous pouvez réellement commencer à lier cette connaissance vers le haut au langage de niveau supérieur. C'est l'avantage immédiat que vous gagnerez.

À mon avis, un programmeur devrait toujours passer du temps à apprendre différents concepts de programmation. Il vaut vraiment la peine de jeter un œil à C, mais aussi à jetez un œil à des langages de programmation de niveau encore plus élevé tels que Clojure, Haskell, Prolog.

Vous n'avez pas besoin de devenir un maître dans ces domaines, ils vous apprendront simplement que les "niveaux" des langages de programmation ne sont pas binaires mais il y a beaucoup de niveaux. Apprenez à les connaître, de haut en bas (Assembleur). Cela fera de vous un meilleur programmeur.

2
wirrbel

Vous devez connaître suffisamment C pour lire le code écrit en C, en raison de la grande quantité de code très important écrit dans le langage. C'est à peu près tout ce que vous retiendrez de bien parcourir un manuel complet sur le sujet (j'ai utilisé la "programmation en C" de Kochan) sans avoir à coder dans la langue, de toute façon. Si jamais vous vous retrouvez dans une situation qui vous oblige à utiliser la langue de manière extensive, vous aurez une bonne base sur laquelle bâtir. Vous voudrez probablement étudier quelque chose comme le livre d'assemblage Duntemanns si la machine est une boîte noire abstenue pour vous. Je recommande également le "Code" de Petzold.

En dehors de cela - alphabétisation de base en C et familiarité de base avec la machine sous-jacente - vous seriez mieux servi de passer votre temps d'étude sur des choses réelles, comme SICP, TCP/IP Illustrated ou des livres sur les mathématiques concrètes, les algorithmes ou la structure de données . Les vrais trucs.

Passer beaucoup de temps à étudier le C tout en codant en PHP ne vaut tout simplement pas le coût d'opportunité. Il y a des choses plus utiles à apprendre. C n'est vraiment qu'un autre langage que vous ne pouvez bien apprendre qu'en étudiant et utiliser, mais peut ramasser quand vous en avez besoin.

Faites suer les choses dures.

2
naftalimich

Une langue est un outil. Si vous n'avez qu'à écrire des pages Web et autres, je suis sûr que vous pouvez vous en tirer sans avoir à apprendre le C, de la même manière que si vous ne faites que des maquettes en plastique, vous n'avez besoin que d'un couteau et de colle pointus, une clé n'est généralement pas requise.

J'écris du code pour les systèmes embarqués avec des ressources de mémoire très restreintes (le plus gros que j'ai fait récemment est 16 Ko et c'était ÉNORME) Sur ce marché, alors C ou l'assembleur sont les seules options et l'un des langages moelleux de niveau supérieur ne fonctionne tout simplement pas.

2
uɐɪ

D'après mon expérience, pendant un certain temps, C/C++ était un bon tampon qui séparait les bons programmeurs des codeurs VB6. Après avoir fait cinq années impaires de C/C++, j'ai obtenu un travail en VB6. J'ai été étonné de la qualité (ou de son absence) des codeurs. Ils s'intéressaient peu aux tripes de la langue, au design ou à la performance. Malheureusement, lorsque la société est passée au .Net, les codeurs C/C++ et les codeurs .Net utilisaient les mêmes outils. Les codeurs VB étaient encore pires pour les codeurs VB.Net. La situation a empiré lorsque tout le développement est allé à ASP.NET. Soudainement, quiconque pouvait glisser-déposer un contrôle était un programmeur.

Sur le marché du travail, cependant, il n'y avait pas grand chose à différencier les codeurs hard-core (ex C/C++) et les touristes.

En tant que tel, avoir C ou C++ sur votre CV peut vous aider à vous différencier du riff-raff.

2
dave

C (et peut-être C++) est la mer dans laquelle vous nagez. L'OS qui exécutera votre code est probablement codé en C (et C++). Votre API native pour accéder aux services OS sera donc en C.

Si vous pouvez vous passer de ce qui se trouve ci-dessous, il n'est pas nécessaire de savoir C. Cependant, la plupart des programmeurs doivent plonger dans des niveaux inférieurs à un moment donné de leur vie.

Il est également basé sur votre spécialisation dans les domaines de développement. Par exemple, un développeur Web qui écrit du HTML, Javascript et certains scripts côté serveur n'aura peut-être jamais besoin de connaître quoi que ce soit sur C, mais un développeur de système distribué ou de jeux le fera.

Cela ne fait jamais de mal de passer quelques semaines à apprendre quelque chose d'aussi fondamental pour votre profession.

1
Mert Akcakaya

C est la langue utilisée pour écrire d'autres langues. Il vous permet d'être aussi intime avec le CPU et les autres matériels que vous le souhaitez.

Si vous ne connaissez pas C, vous ne savez pas comment les autres langages obtiennent les résultats qu'ils obtiennent.

L'abstraction est un concept important, bien sûr, et tout le monde n'a pas besoin de savoir comment son cadre de choix atteint les résultats qu'il promet. Vous n'avez pas besoin de passer 20 ans à écrire C, ni à penser à ce qui arrive à vos vtables lorsque vous utilisez l'héritage multiple, pour écrire du bon code.

Désormais, vous pouvez conduire une voiture sans comprendre le fonctionnement d'un moteur 4 temps ou bien sans pouvoir utiliser un levier de vitesses (boîte de vitesses manuelle).

Cependant, si vous comprenez ce qui se passe sous le capot, vous pourrez, de temps en temps, obtenir des résultats exceptionnels que quelqu'un sans cette connaissance aura du mal à reproduire.

1
Bill Michell

C présente de nombreux avantages:

  1. C est un langage de bas niveau. Vous pouvez utiliser c pour développer le noyau et le pilote.
  2. C est le langage le plus rapide. De nombreux logiciels d'alimentation sont développés par c. Par exemple: memcached, redis, nginx, Apache, mysql etc.
  3. C est un langage multiplateforme. Le programme développé par c peut fonctionner sur toutes les plateformes. D'autres langages multiplateformes ne peuvent pas faire cela. Java, python, php, etc. ne peuvent pas fonctionner sur la plate-forme iOS.
  4. C++ ne peut pas fonctionner sur de nombreux systèmes embarqués.
1
Edward Shen