56 votes

Ressources pour apprendre la conception de programmes en langage C

Provenant d'un background orienté objet (C#/java), je suis à la recherche de ressources pour apprendre à concevoir des programmes en langage C pur de manière efficace.

Alors que je suis familier avec la syntaxe du C et que je peux écrire de petits programmes, je suis incertain de l'approche à adopter pour des applications plus importantes, et des techniques à utiliser. Auriez-vous des recommandations à me faire ?

EDIT : Je suis prêt à complètement abandonner la programmation orientée objet dans le but de programmer en C, mon intérêt est d'apprendre comment structurer un programme sans l'orienté objet. Je souhaite apprendre de bonnes méthodes pour concevoir des programmes dans des langages procéduraux comme le C.

10 votes

Apprendre le langage C est probablement l'une des meilleures choses que vous puissiez faire pour vraiment étendre votre ensemble de compétences. Je sais que ce n'est probablement pas ce que beaucoup de programmeurs "modernes" ont l'habitude d'entendre ces jours-ci, mais c'est vrai. Je pense que votre désir de l'apprendre est une très bonne initiative.

0 votes

Géniale question, je suis dans la même position. C lui-même est plutôt petit mais lors de l'écriture d'applications plus grandes, je suis également coincé sur la façon de les concevoir...

59voto

Cette affectation propose une liste de livres sur UNIX qui comprend la plupart des ouvrages classiques sur C/Unix. Pour la programmation C sous Windows, Petzold's Fenêtres de programmation est probablement le meilleur point de départ.

En ce qui concerne la conception de programmes en C, certains livres de programmation UNIX vous fourniront des extraits, mais je ne connais pas de livre sur l'architecture de programmes en C.

Si vous êtes habitué à java, voici quelques conseils pour la programmation en C :

  1. Faire utiliser de pile . Souvent, lorsque vous appelez une procédure, vous voudrez avoir des variables allouées dans le cadre de la pile de l'appelant et passer des pointeurs vers elles dans la procédure que vous voulez appeler. Ceci sera sensiblement plus rapide que d'allouer dynamiquement de la mémoire avec la commande malloc() et beaucoup moins sujettes aux erreurs. Faites-le partout où cela est nécessaire.

  2. C ne fait pas le ramassage des ordures, L'allocation dynamique d'éléments de données est donc plus compliquée et vous devez en garder la trace pour s'assurer qu'ils soient libérés. Les variables allouées sur la pile (voir 1) sont plus "idiomatiques" lorsqu'elles sont applicables. De plus, vous n'avez pas besoin de les libérer - c'est un avantage pour les variables locales.

  3. En ce qui concerne le point (2), envisagez une architecture dans laquelle vos fonctions renvoient un code d'état ou d'erreur et font entrer et sortir des données en utilisant la pile comme au point (1).

  4. Apprenez à connaître setjmp() y longjmp() faire. Ils peuvent être très utiles pour les mécanismes génériques de gestion des erreurs au lieu d'une fonctionnalité structurée de gestion des exceptions.

  5. Le C ne supporte pas les exceptions. Voir (3).

  6. Peluche est votre ami. Attelle est encore plus sympathique.

  7. Apprenez ce que le préprocesseur et ce que vous ne devriez pas faire avec, même si vous le pouvez.

  8. Apprenez les tenants et aboutissants de Endian-ness , alignement des mots , arithmétique des pointeurs et autres arcanes architecturales de bas niveau. Contrairement à l'opinion générale, il ne s'agit pas d'une science de pointe. Si vous vous sentez prêt, essayez de vous initier au langage d'assemblage et d'acquérir une connaissance pratique de ce langage. Cela vous aidera beaucoup à comprendre ce qui se passe dans votre programme C.

  9. Le C n'a pas de concept de portée de module, donc planifiez votre utilisation des includes, des déclarations de prototypes, et l'utilisation de extern y static pour rendre les scopes privés et les identifiants d'importation.

  10. La programmation de l'interface graphique en C est fastidieuse. tous plateformes.

  11. A propos de (10) apprendre l'API C d'au moins un langage de script tel que Tcl , Lua o Python. Dans de nombreux cas, la meilleure utilisation du C est en tant que moteur central à hautes performances pour une application qui est essentiellement écrite dans un autre langage.

  12. L'équivalent d'un constructeur est une fonction d'initialisation dans laquelle vous passez un pointeur à l'élément que vous voulez configurer. Souvent, vous pouvez voir cela sous la forme d'un appel à la fonction qui ressemble à setup_foo(&my_foo) . Il est préférable de séparer l'allocation de l'initialisation, car vous pouvez utiliser cette fonction pour initialiser un élément que vous avez alloué sur la pile. Un principe similaire s'applique aux destructeurs.

  13. La plupart des gens trouvent Notation hongroise à peu près aussi lisible que le hongrois écrit. L'exception à cette règle est constituée par les locuteurs natifs du hongrois, qui trouvent généralement la notation hongroise à peu près aussi lisible que le hongrois écrit. Cunéiforme. . Malheureusement, la notation hongroise est largement répandue dans les logiciels Windows et toute l'API Win32 l'utilise, avec les effets attendus sur la lisibilité des logiciels écrits sur cette plate-forme.

  14. Les livres sur C/Unix, même les très bons livres comme ceux écrits par le regretté W Richard Stevens, sont généralement disponibles d'occasion à un prix assez bas sur le marché d'Amazon. Sans ordre particulier, procurez-vous un exemplaire de K&R, Stevens APUE y UNP 1 & 2, el Livre du dragon, Rochkind, Perles de la programmation, Petzold y Richter (si vous travaillez sous Windows) et tous les autres ouvrages classiques de C/Unix. Lisez, griffonnez dessus avec un crayon et interagissez généralement avec les livres.

  15. Il y a beaucoup, beaucoup de bonnes Programmation C/Unix ressources sur le web.

  16. Lire et comprendre le Les dix commandements de la programmation en C et une partie de la méta-discussion sur le pourquoi et le comment des commandements. Dans une certaine mesure, cela montre son âge, bien que la plupart de ces textes soient toujours pertinents et que d'obscurs compilateurs soient toujours en activité. assez courante dans le monde des systèmes embarqués .

  17. Lex et Yacc sont vos amis si vous voulez écrire des analyseurs syntaxiques.

  18. Comme Navicore souligne ci-dessous (+1) Hanson. Interfaces et implémentations en C est un exposé sur la conception d'interfaces et d'implémentations pour l'architecture modulaire, accompagné d'un grand nombre d'exemples. J'ai entendu parler de ce livre et j'en ai entendu de bonnes choses, mais je ne peux pas prétendre l'avoir lu. En dehors des idiomes C que j'ai décrits plus haut, ce concept est sans doute au cœur d'une bonne conception procédurale. En fait, d'autres langages procéduraux tels que Modula-2 rendent ce concept explicite dans leur conception. C'est peut-être ce qui se rapproche le plus d'un livre sur l'architecture des programmes C.

  19. Lire l'article C FAQ .

2 votes

Ce sont définitivement de bons points de repère. Je suis surpris de voir setjmp et longjmp mentionnés de manière si proéminente. Bien que puissants, l'utilisation de ces deux derniers devrait être assez rare, n'est-ce pas? Si vous pensez que l'abus du goto est mauvais (la plupart des gens semblent le penser), imaginez l'abus de setjmp et longjmp (ouh là là!). En ce qui concerne l'assembleur, j'ajouterais qu'il est important non seulement de se lancer dans l'écriture de votre propre assembleur, mais aussi d'analyser l'assembleur généré par le compilateur C pour comprendre ce qui se passe réellement.

1 votes

Setjmp fait un peu plus que goto. Il met de côté le contexte local de la fonction. Vous l'utiliseriez normalement pour construire des gestionnaires d'erreurs génériques à la place d'un mécanisme d'exception structuré. Le conseil est de comprendre comment fonctionne ce mécanisme.

2 votes

En C, il n'y a pas d'exceptions comme en Java, et utiliser goto pour implémenter quelque chose de similaire est la chose à faire.

6voto

navicore Points 374

Mes préoccupations en passant de OO à C ont été traitées dans "Interfaces et implémentations en C" de David Hanson.

Interfaces et implémentations en C

Sérieusement, son approche a fait une énorme différence en évitant de construire accidentellement le grand écheveau que beaucoup de systèmes non orientés objet finissent par devenir.

1 votes

+1 - merci de me le rappeler. J'ai déjà entendu parler de ce livre mais je ne l'ai jamais lu. Les interfaces/implementations sont une méthodologie procédurale clé et sont rendues explicites dans Modula-2. Je vais pointer vers cela dans mon message car je pense que cela pourrait être la chose la plus proche d'un livre sur l'architecture en 'C' que j'ai jamais entendu parler. Bonne réflexion 99 ;-}

2voto

Kieveli Points 7162

Voici quelques réponses intéressantes d'une question différente concernant la programmation orientée objet en C. J'ai fait un post sur du code C avec lequel j'ai travaillé qui implémentait essentiellement l'orientation objet en s'arrêtant juste avant en ne incluant pas de méthodes virtuelles.

Si je faisais du codage en C, j'utiliserais cette technique pour définir des 'objets'.

Je trouve qu'il est toujours utile de garder les Design Patterns à l'esprit, et peut être implémenté dans la plupart des langages.

Voici un joli PDF discutant de la programmation orientée objet en C.

1 votes

Si vous voulez faire de la POO en C, vous devriez vraiment utiliser C++. Si vous voulez utiliser le C, vous devriez écrire un code procédural clair et agréable.

1 votes

"Si vous voulez utiliser C, vous devriez écrire un code procédural agréable et clair." Seriez-vous en mesure de recommander des ressources pour apprendre à le faire? C'est le genre de chose que je recherche.

0 votes

Il existe des cas où l'utilisation de C est nécessaire. Tous les processeurs n'ont pas de compilateurs C++ - surtout si vous travaillez dans un environnement embarqué. Lorsque vous travaillez avec du code devant s'exécuter sur du matériel de bas niveau, il est toujours préférable de le coder en C, puis d'avoir une enveloppe C++.

2voto

Peter Miehle Points 3753

Minix par tanenbaum

1voto

JustJeff Points 6070

Applications plus grandes ? La force de C se manifeste lorsque vous devez traiter des choses de bas niveau comme les pilotes de périphériques, les planificateurs et d'autres éléments spécifiques aux systèmes d'exploitation.

Vous pouvez concevoir du C qui fonctionne comme de la programmation orientée objet, mais cela finira par ressembler à une réinvention de la roue.

0 votes

Ceux-ci peuvent être des applications assez importantes, je sais par exemple que le noyau Linux est écrit en C, mais je demande essentiellement des informations sur les techniques sur la manière dont vous structurez un programme C une fois que vous dépassez environ 500 lignes. Je sais que beaucoup de gens semblent avoir mal lu la question et pensent que je veux utiliser la POO en C, mais je suis en fait intéressé par TOUTES les techniques qui peuvent être utilisées pour structurer de plus grands programmes C.

0 votes

Oh d'accord - eh bien, une approche commune consiste à essayer de diviser l'application en modules puis à attribuer chaque module à un fichier .c, en 'faisant la publicité' de ses mérites dans des fichiers d'en-tête (.h), puis en utilisant des #includes pour résoudre les dépendances source. Cela fonctionne assez bien jusqu'à quelques milliers de lignes de code. Là où les choses déraillent généralement, c'est lorsque les dépendances deviennent incontrôlables, et que les fichiers .h commencent à inclure d'autres fichiers .h, ou que plusieurs répertoires source deviennent nécessaires, ou l'horreur ultime, quelqu'un commence à mettre des déclarations de variables dans des fichiers .h.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X