Rédaction tutoriel C

(auto)recrutement

a marqué ce sujet comme résolu.

Naooon, pas glibc...

Ben globalement, ça fait faire le tour du C tout ça.

  • Structures de contrôle & structures tout court
  • Préprocesseur
  • Pointeurs
  • Bibliothèque standard

lesmon

Tu peux enlever les structures de contrôles. Entre un if en C et en python, c'est globalement la même chose. La seule structure de données contestable c'est le for.

Mais oui, ça n'empêche pas de faire le tour du C, seulement tu peux faire la supposition que l'utilisateur s'y connait déjà en programmation. Et surtout tu peux faire ça en utilisant des exemples, ou par le biais de TP.

Pourquoi ne pas bien décomposer le tutoriel au pire ? La partie 1 se basera sur les notions standard de ce type de programmation (avec les if, les variables, etc..) tandis que la partie 2 parlera de sujets un peu plus avancés comme les différents outils de la libC, les pointeurs et les tableaux (bien faire la distinction), la gestion de la mémoire, puis une ouverture à d'autres tutos qui traiteront d'autres aspects du C comme avec les sockets, les processus, les fichiers, le précompilateur de A à Z, et l'algorithmique ?

Et pourquoi pas non plus parler de C11 en plus de C99 ?

+0 -0

Pourquoi ne pas bien décomposer le tutoriel au pire ? La partie 1 se basera sur les notions standard de ce type de programmation (avec les if, les variables, etc..) tandis que la partie 2 parlera de sujets un peu plus avancés comme les différents outils de la libC, les pointeurs et les tableaux (bien faire la distinction), la gestion de la mémoire, puis une ouverture à d'autres tutos qui traiteront d'autres aspects du C comme avec les sockets, les processus, les fichiers, le précompilateur de A à Z, et l'algorithmique ?

SylafrsOne

Tu as lu le sujet depuis le début ? Tu as compris le débat qu'il y avait ou pas ? Car ton message me laisse supposer que non.

J'ai compris que vous ne vouliez pas refaire un tuto sur la programmation dans tous les langages. (mais que vous vouliez tout de même faire un (et un seul) tuto sur la programmation en général, pour débuter)

Que pour cela, vous vouliez choisir un langage en particulier comme le Python afin que, pour le langage C, on se mette directement dans le vif du sujet en redirigeant les grands débutants vers ce tuto ou d'autres sites (s'ils veulent à tout prix QUE du C).

Je comprend pourquoi, mais je ne vois pas non plus en quoi ça pose problème si quelqu'un est prêt à le faire, les tutos peuvent avoir pas mal de parties, pourquoi ne pas en profiter ? Le hic, c'est que ça peut être long, mais si on est plusieurs, ça peut aller..


Maintenant, il est tout aussi possible que j'ai mal saisi, auquel cas, je suis désolé ^^'

+0 -0

J'ai compris que vous ne vouliez pas refaire un tuto sur la programmation dans tous les langages. (mais que vous vouliez tout de même faire un (et un seul) tuto sur la programmation en général, pour débuter)

Pas forcément. Ce que je ne veux surtout, surtout pas est que les débutants se jettent sur le tuto C alors qu'ils n'ont jamais programmé. Qu'ils fassent du Python, du Java ou du Malbodge à la place, peu m'importe ; mais s'ils arrivent sur notre tuto C sans savoir ce qu'est une boucle, il y a un problème quelque part.

J'ai moi aussi commencé le C comme premier langage de programmation, et j'estime aujourd'hui que ça a été une perte de temps. Entendons-nous bien : apprendre le C n'a pas été une perte de temps, loin de là. Mais batailler avec des concepts mystiques que je ne comprenais pas parce que je devais en même temps apprendre ce qu'était une boucle, si. J'aurais dû les apprendre plus tard.

Au passage, si tu utilises le préprocesseur pour faire de la méta-programmation, il y a une erreur de design quelque part ; il n'est pas fait pour ça. À ce stade, il vaut mieux utiliser des outils externes (au hasard, m4 ou awk ou quelque chose du style).

Aussi, je te conseille de réviser les notations de Landau. La simplification de code que tu proposes dans ton exemple est bonne, mais pas pour les raisons que tu indiques. Un compilateur C moderne sera (presque) toujours capable de trouver l'ordonnancement d'instructions optimal et l'utiliser. Tu ne gagnes absolument rien. Par contre, ta deuxième version est bien plus lisible, ce qui est fondamental en programmation et critique en langage C, où il est très facile de faire n'importe quoi.

Pour en revenir au problème de débuter avec le langage C, l'idée est qu'il n'est pas fait pour ça. C'est un langage compliqué, bourré de pièges, et qui ne bonne pas une bonne vision de certains concepts de programmation. Par exemple, les gens qui commencent par le C ont tendance à s'imaginer que le code qu'ils écrivent est exécuté tel quel par le processeur, que la compilation est une opération relativement directe. C'est typiquement ce qui t'a mené à faire une erreur d'appréciation sur les performances de ton exemple de code.

J'estime nécessaire d'expliquer, dans un cours de C, que c'est une sensation trompeuse, et que GCC (par exemple) fait plus de 180 passes d'optimsiations qui rendent le code assembleur exécuté méconnaissable par rapport au source C. Ce n'est pas le genre de choses que tu peux aborder sereinement dans un cours qui « part de zéro ». Les novices n'ont pas encore l'expérience de s'être faits mordre par un compilateur, et cette information restera totalement abstraite pour eux. Ils l'auront oubliée dans les 24h, et ne s'en souviendront pas le jour où ils commenceront à entendre parler de cache processeur, par exemple.

Voici d'autres sujets spécifiques au C (ou du moins, rares dans d'autres langages) qu'on ne pourrait que difficilement aborder avec des gens qui viennent de commencer :

  • les problématiques d'aliasing ;
  • les problématiques d'alignement mémoire, et le structure packing éventuellement ;
  • ce qu'est le cache du CPU, et pourquoi il ne faut surtout pas s'en inquiéter à notre niveau de programmation ;
  • idem pour le pipeline CPU ;
  • le fait que les flottants ne sont pas fiables ;
  • conventions d'appel (pour lier le C à d'autres langages de programmation) ;
  • goto ;
  • les unions…

Je ne prétends pas qu'on va aborder tous ces sujets, ni même qu'on va en aborder un seul. Mais certains me paraissent important pour comprendre ce que l'on fait en C et leur étude est relativement spécifique au C. En d'autres termes, si ce genre de trucs ne t'intéresse absolument pas, tu n'as aucune raison de faire du C (et si tu penses aux «performances», tu devrais te documenter sur les techniques de compilation modernes). À l'inverse, si ce genre de trucs t'intéresse, tu as plutôt intérêt à savoir ce qu'est une boucle pour commencer à les étudier.

C'est dans cet esprit que je voyais le cours de C. Partir des bases (Conditions, boucles) et expliquer un peu mieux les entrailles de la machine, via le C. Après, tu as tout à fait le droit de faire un autre cours, en parallèle, qui soit 100% orienté débutants. Le site n'en sortira que plus riche et les nouveaux-venus pourront choisir ce qu'ils préfèrent. :)

+6 -0

Je vois, merci pour cette réponse :)

L'idée est donc d'expliquer comment le C fonctionne avec l'OS et la gestion de la mémoire ?

Juste ce qu'il le différencie des autres langages, sans trop aborder les fonctions qui existent ?


C'est assez bizarre sinon, j'ai l'impression que tu te contredis dans ton message :

Tantôt tu dis que tu ne veux pas que les débutants commencent avec le C, tantôt tu dis qu'un autre tuto 100% pour débutant rendra le site plus riche..

+0 -0

Hmm.. le préprocesseur permet également d'être plus productif. C'est ce qui fait tourner les templates en C++, ça permet de faire de la meta-prog.

(HS : non, le préprocesseur ne s'occupe pas des templates)

+0 -0

Bonjour, je suis nouveau sur le forum :) Ce post ma donné envie de vous rejoindre; J'ai lu la discussion, navré s'il y a une redite.

Ce que je lis là, c'est en gros le tuto que j'ai attendu pendant 5 ans… A chaque fois que je commence un tuto sur un langage de programmation, on me propose vite les arcanes du langage alors que c'est pas ce qu'un débutant souhaite. Savoir qu'un int est plus petit qu'un long… quand j'apprends ce qu'est une variable je m'en fiche, on peut me donner cette subtilité plus tard.

Ce serait super que le tuto sur la programmation en général ne soit pas un plan monolithique mais plein de micro-tutos. Je m'explique: après les bases sur python, le débutant pourrait être aiguillé vers le système (GNU/Linux, C…), le web (HTML, Django…) ou d'autres sujets .

Perso, je me suis penché par la suite sur Linux. Les expressions régulières par exemple reviennent au moment des scripts bash, mais il y en a dans d'autres langages… En tant que débutant, je n'ai pas besoin d'un tableau énorme pour un langage précis. Mais si un même tutoriel explique le concept, donne des exemples avec 5-6 langages types ce serait super. De sorte qu'on pioche dans des "chapitres" individuels au besoin. Perso, quand je vois un tuto avec 6 parties de 10 chapitres chacuns, je fuis ;)

Enfin, ce qui m'a plu dans le tuto de C du SdZ et que j'ai pas assez retrouvé ailleurs, c'est les exemples à foison, et leurs corrections. Si on pouvait ne pas avoir à pourrir le forum de nos essais infructueux ^^

Désolé c'est un peu long, mais ce post m'a donné envie de vous joindre. Si je peux vous être utile…

+0 -2

Désolé, je ne réponds pas à tout, je fais simplement une digression sur une infime part du message de GuilOooo (que j’approuve totalement par ailleurs).

Voici d'autres sujets spécifiques au C (ou du moins, rares dans d'autres langages) qu'on ne pourrait que difficilement aborder avec des gens qui viennent de commencer : […]

  • le fait que les flottants ne sont pas fiables ;

  • le fait que les flottants ne sont pas fiables ;

GuilOooo

Ce n’est pas du tout spécifique au C, me semble-t-il, puisque le codage des flottants est le même partout, avec les mêmes problèmes (tout comme le fait que les entiers machine soient finis). Si tu pensais à des solutions de type calcul multiprécision, ça me paraît plus l’exception que la règle (mais je peux me tromper).

Édit : Constatez au passage le bogue du zmarkdown qui dédouble la puce (elle ne figure bien qu’une fois dans le code).

+0 -0

@Maëlan: Effectivement, c'est un point très contestable de l'introduire dans un tutoriel réservé au C. On pourrait aussi dire que les autres problèmes énoncés par notre cher membre ne sont pas spécifiques au C, mais le bas niveau du C fait qu'il n'y a que dans ce langage que cela nous importe. Ce qui n'est effectivement pas le cas ici pour les flottants.

+0 -0

Est-ce-qu'il ne serait pas plus simple d'écrire toute une suite de mini-cours sur les thèmes qui vont sont chers (et sont tout à fait adaptés à un cours sur le C).

Quelqu'un a parlé de "commencer le cours par les pointeurs" ça me semble être une excellente idée. C'et une notion pas évidente à comprendre pour un débutant et qui mérite un petit cours à part entière.

Libre à nous de construire un cours global autour des mini-cours existant, quitte à les modifier lorsqu'il faut les intégrer.

  1. Ca permettra de partir sur du concret pour éviter 50 pages de discussions (non pas qu'elles ne soient pas nécessaires, entendons-nous bien) mais ça apportera de l'eau concrète au moulin de ce gigantesque morceau

  2. On connaît bien sûr tous l'effet tunnel, j'ai un peu peur qu'on tombe en plein dedans. Avec un cours parfait mais chimérique et des prises de bec qui ne mènent à rien

  3. Chacun s'occupe d'une partie qui lui est chère et/ou sur laquelle il se sent tout à fait compétent

  4. Les notions nécessaires à la compréhension d'une partie vont émerger d'elles-même. Quitte à faire des renvois fictifs dans les premières version d'un cours "cf. le cours sur les pointeurs de fonction, en cours de rédaction". A mon sens, l'oranisation générale du grand cours de C va émerger toute seule. "ah ça c'est nécessaire pour comprendre mon chapitre, mais c'est pas du C, vers quoi on renvoie ?".

  5. Certaines des idées avancées ici sont parfaites pour l'écriture d'un petit cours appliqué, qui trouvera tout à fait sa place comme "entracte" d'un gros cours. Je pense notamment à l'analyse d'une fonction standard comme malloc. Ca peut s'écrire tout seul dans son coin sans aucun problème. Ca dispose d'une valeur intrinsèque (si le cours reste tout seul dans son coin pendant des mois) mais ça s'intègre très bien dans un cours de plus grande envergure.

  6. Ca permet à tout le monde d'avoir la sensation d'avancer et de ne pas disserter pour rien (pas de reproche hein, la lecture de ce topic est véritablement instructive) et peut-être d'avoir une vision plus concrète de ce vers quoi vous voulez vous orienter.

  7. Si jamais un petit cours n'est pas intégré au cours global (parce que c'est trop débutant, parce que c'est trop difficile, parce que ça s'intègre mal) il conserve toute sa valeur en tant que mini-cours.

J'ai cité un exemple, je pense qu'il y en a quelques uns qui se dégagent déjà fortement notamment dans la partie de ce sujet concernant "les exercices vers quoi on veut aller". Typiquement, commencer par les exercices-TP-objectifs de fin de cours me paraît pas débile pour partir et construire le cours en remontant le fil du "qu'est-ce-que donc j'ai besoin pour comprendre tout ça ?".

+4 -0

Quelqu'un a parlé de "commencer le cours par les pointeurs" ça me semble être une excellente idée. C'et une notion pas évidente à comprendre pour un débutant et qui mérite un petit cours à part entière.

Il y a quand même des pré-requis… Notamment la notion de types (primitifs et standards) avant de pouvoir aborder les pointeurs de manière complète. Mais avant cela, il faut expliquer les principes du langage et sa syntaxe. Mais je suis d'accord qu'il ne faut pas attendre de parler de fonctions pour aborder les pointeurs.

+0 -0

Tantôt tu dis que tu ne veux pas que les débutants commencent avec le C, tantôt tu dis qu'un autre tuto 100% pour débutant rendra le site plus riche..

Je ne veux pas que les débutants commencent par le C, mais c'est mon point de vue. Si tu as un point de vue différent, tu peux le développer en un tuto, et le site sera enrichi puisqu'il proposera différents points de vue sur cette question. ;)

Si tu pensais à des solutions de type calcul multiprécision, ça me paraît plus l’exception que la règle (mais je peux me tromper).

En effet. Mais il y a peu de langages où on se soucie vraiment de la représentation bit à bit des structures de données qu'on manipule, et le C est l'un de ces langages-là. Ça me paraît donc être un cours pertinent pour aborder ces problématiques, que les langages modernes essaient (tant bien que mal) de cacher. Typiquement, les multi-précision sont le type par défaut pour les nombres en Python, et Common Lisp et Scheme essaie de caster en multiprécision lorsqu'un problème est détecté (bien que la détection ne soit pas parfaite).

L'idée qu'il faut retirer de mon message, c'est qu'on apprend pas du C pour le plaisir de faire du C. Si la raison de l'apprentissage est « je dois modifier un code déjà écrit en C », le lecteur n'a pas besoin d'un cours pour débutant total et il y a déjà des tonnes de ressources sur le Web. Ce qui pourrait faire la spécificité de « notre » cours de C, ce serait de parler de toutes les problématiques non-mentionnées dans les cours « débutant total » mais qui font la richesse de la programmation C (même si elles existent ailleurs).

Uknow : en effet, il va y avoir des prérequis, mais ce n'est pas grave ; comme le dit Javier, on pourra toujours renvoyer vers un tuto fictif qui sera écrit plus tard.

Personnellement, Javier, ton plan d'attaque me plaît beaucoup, mais il vaudrait peut-être mieux se mettre d'accord à l'avance sur qui fait quoi. Qu'on ait une vague idée de la liste des concepts traités, et des tutos pré-requis qui vont manquer.


Personnellement, je veux bien essayer de faire un tuto qui montre pas à pas comment réécrire un allocateur mémoire simple (au hasard, first fit). Si je suis toujours motivé, ça pourra évoluer vers des algorithmes plus compliqués (buddy blocks) voire même vers de la garbage collection (en se mettant dans la peau de quelqu'un qui écrit un interpréteur pour un langage de haut niveau). Mes prérequis seront :

  • les structures ;
  • les pointeurs (sans pointeurs de fonction) ;
  • les notions de pile et de tas.

Si un cours de C émerge, je pense pouvoir le transformer au format « TP ». Par contre, je ne commencerai l'écriture qu'entre août et septembre.

Je sais, je sais : ça ne parle pas de langage C directement. Mais c'est le genre de choses qui est tout de même spécifique au langage C (c'est rare d'implémenter un allocateur mémoire dans un autre langage), et ça permet de faire travailler à fond les pointeurs et la mémoire, ça me semble donc être un TP pertinent pour un cours de C.

Ça vous inspire quoi ? Quelqu'un est motivé pour faire un tuto qui présente le fonctionnement de la mémoire en général (registres, caches, RAM, disque, puis pile & tas), puis comment on interagit avec en C (malloc, variables locales, le qualificateur register, puis stdio.h et mmap) qui serait un prérequis de mon TP ?

Autre idée de tuto : un cours général sur les fonctions, version bas niveau. Ce cours s'appuierait sur celui concernant la mémoire, montrerait que le code d'une fonction est stockée en RAM (donc qu'on peut faire des pointeurs de fonctions et expliquerait la notion), que les paramètres sont passés sur la pile (et montrerait l'erreur classique de renvoyer l'adresse d'une variable locale), et que c'est ce mécanisme qui permet d'appeler des fonctions C depuis d'autres langages et réciproquement (avec pourquoi pas un exemple ou un TP).

+2 -0

@GuillOooo : je commence à cerner un petit peu comment tu imagines le cours, par contre je me permettrais d'exprimer ma réserve. L'allocation de mémoire en C, se récapitule à un appel à malloc, calloc ou realloc ; le résultat de l'appel est un pointeur vers un espace correctement aligné pour recevoir tout type d'objet. Sa durée de vie s'étend jusqu'à sa libération par free.

Voilà pour moi l'allocation de mémoire en C. Ton idée c'est d'aller plus loin en expliquant les mécanismes bas niveau d'une allocation sur certains environnements, c'est ça ?

+0 -0

L'idée de Javier est bonne mais ça risque de faire un certain nombre de renvois. Il faudra prévoir un plan à suivre (quels sujets vaut-il mieux aborder en premier). Sinon, le débutant (sous entendu sur les sujets traités) qui arrive risque de voir une liste très intéressante mais où il sera difficile de s'y retrouver.

Quelqu'un est motivé pour faire un tuto qui présente le fonctionnement de la mémoire en général (registres, caches, RAM, disque, puis pile & tas)

Juste sur ce point : mewtwo rédige un tutoriel sur le fonctionnement des OS et il parle d'une bonne partie du fonctionnement de la mémoire. Tu peux peut-être en reprendre une partie pour ton propre cours et/ou faire un renvoi vers celui-ci ?

Sinon, l'idée m'intéresse et j'approuve globalement.

Voilà pour moi l'allocation de mémoire en C. Ton idée c'est d'aller plus loin en expliquant les mécanismes bas niveau d'une allocation sur certains environnements, c'est ça ?

Mon idée est de faire un TP où les lecteurs recodent un malloc() et un free() à partir de l'appel système mmap. Ça montre comment les dessous de malloc/free fonctionnent, ce qui intéressant en soi, et en plus ça oblige à pratiquer les pointeurs (ce qui est le but pédagogique du TP). En plus, pour l'appel système mmap(), on peut expliquer que les algorithmes utilisés sont similaires (c'est une simplification pédagogique) et renvoyer vers le tuto de mewtwo lorsqu'/s'il sera migré.

+0 -0

Oui c'est sûrement intéressant, ça peut être aussi indexé comme TP sur la portabilité. Mais pour revenir au langage en lui même il y a beaucoup de choses à faire… Malheureusement les bons articles sont éparpillés un peu partout sur le net, si on peut consolider ici certains très bons, ce serait merveilleux.

+0 -0

Là où je me sens le plus à l'aise en C, c'est en gros l'interface avec l'assembleur. Donc un peu la gestion de la mémoire, comment fonctionne les pointeurs ? Qu'est-ce qu'un cadre de pile par exemple où voir les problèmes d'ambiguïtés du language du genre :

Qu'affiche printf ?

1
2
3
i = 2;
i = (i++)*(i++);
printf("i : \n", i);

Je ne sais pas si ça se recoupe avec ce que voulais faire GuilOoo dans sa gestion de la mémoire. Et je préférerai ne pas écrire ce tutoriel seul, notamment car on est pas à l'abri d'erreurs, et il y a toujours plein de subtilités dans ce domaine.

+0 -0

@ Saroupille : avec la deuxième ligne de ton petit code tu entres déjà dans les aspect très pointus du C. L'explication d'un tel comportement fait appel à une notion de "point de séquence" assez barbare lorsqu'on n'a pas été préparé par avant.

Un cours qui arrive à présenter à terme un code de ce genre, et que l'apprenti comprenne sa spécificité, c'est un idéal. Et on n'en trouve pas des tonnes de cours de ce genre…

+0 -0

@ Saroupille : avec la deuxième ligne de ton petit code tu entres déjà dans les aspect très pointus du C. L'explication d'un tel comportement fait appel à une notion de "point de séquence" assez barbare lorsqu'on n'a pas été préparé par avant.

Un cours qui arrive à présenter à terme un code de ce genre, et que l'apprenti comprenne sa spécificité, c'est un idéal. Et on n'en trouve pas des tonnes de cours de ce genre…

uknow

Je ne sais même pas de quoi tu parles. Pour moi ça fait parti des nombreux cas où le C à une sémantique ambiguë. Il faut faire un choix sur l'évaluation des expressions.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte