Rédaction tutoriel C

(auto)recrutement

a marqué ce sujet comme résolu.

Il y a une chose qui a été dite et que j'approuve plus que tout : un tutoriel détaché des langages et qui enseigne l'algorithmique. Si quelqu'un en sort un demain, je me lance dessus directement car c'est quelque chose que je n'ai pas encore trouvé dans les tutoriels axés sur un langage en particulier, ni ailleurs.

poliorcetics

Ça existe pourtant. Voici rapidement deux ressources, une de chez nous et une plus académique.

+0 -0

A quelle technique réfères-tu dans le document de 120 pages que tu linke (mal) ?

Stranger

Pour arriver directement dessus commence à la page 87. Ça résumé bien l'alignement des données en memoire suivi d'une lecture via incrementations de pointeurs.

Et oui désolé pour le lien je suis encore sur mon tel… Je corrige en rentrant.

+0 -0

Ça existe pourtant. Voici rapidement deux ressources, une de chez nous et une plus académique.

simbilou

Comment j'ai pu louper ça … M'enfin merci du coup :D !


EDIT:

Comme je me suis écarté du sujet, voici mon avis:
Je pense qu'actuellement, un tutoriel C serait une bonne chose. Après, pour être en pleine phase d'apprentissage sans réellement savoir où je vais finir, je pense que j'ai l'avis dont parlait GuilOo, celui d'une personne n'étant pas une experte, ni en C ni même dans un autre langage.

Pour un tutoriel C, je pense donc que l'une des solutions serait de faire un tronc final commun sur les notions avancées.
Pour le début du tuto, il serait séparé en deux parties bien distinctes:

  • Une partie pour le débutant absolu et le débutant moyen.
  • Une partie pour le mec qui sait déjà programmer et qui veut juste venir apprendre le C pour X raison.

Je n'ai pas de plan plus précis car je ne suis pas du tout qualifié pour en proposer un, toutefois si quelqu'un veut de l'aide pour l'orthographe ou un avis sur un tuto, je suis partant :) .

+0 -0

Salut,

On dirait bien que le sujet est detrerré. Pour ma part j'aimerai ajouter que l'on utilise pas le C pour tout et rien. Meme si dans la pratique rien ne nous en empeche, on pourrait très bien faire un site web en C. Mais dans un veritable projet, le C ne s'utilise que dans certains cas precis. Et dans la plus part de ces cas on privilégiera souvent le C++ avec eventuellement quelques bouts de C.

Loptr

Juste pour dire : serait-il possible d'arrêter d'employer ce genre de tournure qui laise penser qu'un tel choix est ridicule ou insensé ? Oui, le choix du C n'est plus la norme aujourd'hui et est souvent décrié dès qu'une alternative est possible (avec des arguments plus ou moins fondés).

Cependant, ce n'est pas parce que son utilisation est considérée comme atypique qu'un projet n'est pas crédible et/ou viable. Puisque l'exemple du web est cité : le projet OpenBSD a récemment produit un mini-serveur HTTP tout ce qu'il y a de fonctionnel. Est-ce ridicule ? Non, cela va juste a contre-courant.

Il semble que nous soyons plus ou moins tous d'accord pour dire qu'un débutant aura tout intérêt à commencer plutôt par du Python, du Haskell ou un langage équivalent que par du C, aussi bien en terme de simplicité que de stabilité du code. Que s'il veut vraiment commencer par un langage assez bas niveau, le C++ a beaucoup plus d'avantages par rapport au C qu'il n'a d'inconvénient.

Dominus Carnufex

De manière générale, non, je ne suis pas d'accord avec cette assertion.

D'où mon idée : plutôt qu'un cours destiné à apprendre le C pour développer avec, pourquoi ne pas faire un cours de C destiné à simplement comprendre ce que les autres écrivent dans ce langage ? À l'issue de ce cours, l'apprenant serait capable de lire du code C écrit par quelqu'un d'autre de manière à le porter dans son propre langage, et de comprendre pourquoi son propre langage réagit d'une certaine manière du fait de ses soubassements de C : par exemple, on comprend mieux pourquoi la fonction file() de PHP renvoie un résultat bogué quand on essaye d'ouvrir un binaire, quand on sait que c'est une limitation des fonctions C utilisées en sous-main.

Dominus Carnufex

Il ne me paraît pas possible d'apprendre un langage sans l'utiliser… C'est un peu comme si tu voulais enseigner la cuisine à quelqu'un en lui lisant uniquement des recettes, a priori cela ne fonctionne pas.

+2 -2

Je pense sincèrement que la prog fonctionnelle n'est spécialement difficile que pour quelqu'un qui a déjà la tête remplie de prog impérative, parce qu'il faut tout réapprendre. À mon avis, quelqu'un qui débute totalement n'aura pas plus de difficulté dans un paradigme que dans l'autre.

Dominus Carnufex

Je dirais même qu'il est possible qu'il soit plus facile d'apprendre du fonctionnel dans le sens où l'on baigne très tôt avec des concepts mathématiques qui sont largement sous-jacents dans la programmation fonctionnelle. Par exemple la définition de liste en compréhension est d'une puissance incroyable et pourtant l'approche ensembliste la plus naturelle qui soit et dans laquelle on baigne à l'école depuis le plus jeune âge. Apprendre le fonctionnel comme premier paradigme me semblerait au contraire tout à fait pertinent de ce point de vu là.

Juste pour dire : serait-il possible d'arrêter d'employer ce genre de tournure qui laise penser qu'un tel choix est ridicule ou insensé ? Oui, le choix du C n'est plus la norme aujourd'hui et est souvent décrié dès qu'une alternative est possible (avec des arguments plus ou moins fondés).

Taurre

Tu sais que qu'à chaque fois que tu défendras le C, je serais là pour contre-balancer. :p Je ne pense pas que dire Mais dans un veritable projet, le C ne s'utilise que dans certains cas precis veut dire ridicule ou insensé. Il veut dire que chaque langage à son cadre d'application, qui varie au cours du temps en fonction notamment de l'apparition de nouveaux langages plus adaptés à certains domaines. Typiquement, faire du développement web en C n'a jamais été dans le cadre de pertinence du langage C. Par contre, des applications graphiques pouvaient être un choix pertinent à une époque où l'on ne disposait pas de Java, de Python ou du C# qui permettent n'ont que des avantages pour 99% des applications « grand public » aujourd'hui.

Le champ des domaines pertinents pour le C a fondu au cours du temps, et il reste à peu près que l'embarqué et la programmation système, même si d'autres langages essayent de percer.

Sans des contraintes économiques, le langage C aurait très probablement disparu ou serait encore plus un langage de niche. Pour sur, on ne s'embête pas à réécrire un paquet de code du C vers un langage plus moderne même si cela ne propose que des avantages si le coût de réécriture ne compense pas le coût de maintenance. Le meilleur exemple est le maintien du COBOL dans la finance et le milieu bancaire où le coût de maintenant bien que prohibitif est compensé par les volumes d'argent en jeu.
Du coup, sans ses contraintes, le langage C serait probablement à l'état du langage que l'on utilise sur des projets personnels parce qu'on le trouve sympathique, historique, ou pour n'importe quelle raison que tu puisses imaginer.

Un choix de langage est ridicule ou insensé vis à vis d'un critère. C'est généralement un compromis sur l'ensemble des critères qui semble pertinents qui fait que l'on adopte un langage pour un projet précis. Sur un projet dans la vraie vie, on va regarder en particulier au final le coût avec un horizon plus ou moins court (malheureusement dans certains cas): facilité de maintenance (le C est out par rapport à d'autres langagues), vérification statique (le C est out également), gestion fine des erreurs et usage critique (le C est encore une fois out), programmation mathématique hors calcul numérique (le C est trop bas niveau), rapidité de développement (le C est out par rapport à plein d'autres langages), etc, etc.

Je vais abonder dans le sens de Höd, et j'espère que Taurre prendra le temps de prendre mes remarques à leur juste valeur.

Le C a des qualités indéniables, que personne ne s'aviserait de remettre en cause. La plus sensible, c'est qu'il n'existe aucun langage (hors assembleur) qui permette de produire des programmes aussi rapides, peu gourmands en mémoire et de petite taille que ceux bien programmés en C. Évidemment, sur un algorithme donné, on peut trouver une implémentation en un autre langage qui fasse mieux que du C (genre ce truc où JavaScript met la misère au C, en temps de calcul comme en taille de l'exécutable, au prix d'un peu plus d'utilisation de mémoire), et cet autre langage est la plupart du temps le C++. Mais en moyenne, le C arrive indiscutablement premier. Et quand je dis premier, je veux dire que les langages à la mode comme Python 3, Ruby ou PHP tournent souvent 50 à 100 fois plus lentement, et bouffent 10 à 100 fois plus de mémoire.

Une autre qualité indéniable, c'est la batterie proprement monstrueuse de bibliothèques écrites dans ce langage. Mais une fois qu'on a reconnu ses qualités, il faut quand même s'intéresser à ses défauts, sinon ce serait malhonnête. Et pour moi, être obligé de dégainer malloc chaque fois que je veux manipuler quelque chose d'un peu plus complexe que les types de base, c'est un putain de gros défaut. Pour moi, être obligé de placer le prototype d'une fonction avant le premier endroit où on y fait appel, c'est juste ridicule : même mon assembleur est capable de retrouver une fonction déclarée après l'appel. Pour moi, le mélange des genres entre tableaux et pointeurs, c'est crade. Etc.

Alors est-ce que j'aime le C ? Oui. Il est très pratique pour certaines choses. Et ça, je n'en démordrai pas, le C est pratique pour certaines choses et uniquement certaines choses. L'exemple que tu donnes est emblématique de ce que nous disons sur l'utilité à l'heure actuelle du C : pour faire un mini-serveur HTTP, qui prenne peu de place, peu de mémoire et tourne vite, le C est particulièrement adapté. On est exactement dans son cœur de cible. Mais utiliser du C dans n'importe quel projet par pur dogmatisme, c'est aussi idiot que d'écrire un système d'exploitation en Ruby. Sérieusement, à moins d'une contrainte extérieur particulièrement forte, pourquoi est-ce que j'irais me rendre marteau à faire du traitement de chaînes de caractères avec string.h plutôt qu'avec les expressions régulières de Perl ?

Alors est-ce que je le recommanderais à un débutant total ? Plus maintenant. Maintenant, je lui dirais d'aller voir du côté du Haskell. Seulement, pour des raisons historiques, dont j'ai parlé plus haut, il est difficile (et un peu suicidaire je pense) d'être totalement ignorant du C quand on commence à avoir un niveau avancé. D'où l'utilité de savoir lire du C sans pour autant en maîtriser toutes les subtilités, il y a assez de catalogues de référence pour cela. Parce que…

Il ne me paraît pas possible d'apprendre un langage sans l'utiliser… C'est un peu comme si tu voulais enseigner la cuisine à quelqu'un en lui lisant uniquement des recettes, a priori cela ne fonctionne pas.

… ben, en fait, a priori, ça fonctionne. Adapté à un vrai langage, ça s'appelle être un locuteur passif. Ça consiste à être capable de comprendre les locuteurs actifs, ceux qui maîtrisent le langage, donc à pouvoir lire ce qu'ils écrivent, mais à être soi-même incapable de produire un énoncé élaboré ou même correct. Et, sur le papier, un langage informatique n'est pas différent d'un langage naturel : il est parfaitement possible d'acquérir le statut de locuteur passif.

Sinon.

Je dirais même qu'il est possible qu'il soit plus facile d'apprendre du fonctionnel dans le sens où l'on baigne très tôt avec des concepts mathématiques qui sont largement sous-jacents dans la programmation fonctionnelle. Par exemple la définition de liste en compréhension est d'une puissance incroyable et pourtant l'approche ensembliste la plus naturelle qui soit et dans laquelle on baigne à l'école depuis le plus jeune âge. Apprendre le fonctionnel comme premier paradigme me semblerait au contraire tout à fait pertinent de ce point de vu là.

Je n'osais le dire. ^^

+2 -0

Le meilleur exemple est le maintien du COBOL dans la finance et le milieu bancaire où le coût de maintenant bien que prohibitif est compensé par les volumes d'argent en jeu.

Et encore, j'ai eu écho que les banques migraient doucement. Le C a encore de beaux jours en embarqué et programmation système. Même si le C++ gagne beaucoup de terrain ces derniers temps.

+0 -0

Le meilleur exemple est le maintien du COBOL dans la finance et le milieu bancaire où le coût de maintenant bien que prohibitif est compensé par les volumes d'argent en jeu.

Et encore, j'ai eu écho que les banques migraient doucement. Le C a encore de beaux jours en embarqué et programmation système. Même si le C++ gagne beaucoup de terrain ces derniers temps.

Renault

C'est vrai. Tout simplement parce que les quelques caractéristiques intéressantes techniquement comme le support du calcul en virgule fixe sont supportés nativement par d'autres langages plus récents ou par des bibliothèques éprouvées. De plus, le coût de maintenance devient de plus en plus élevé avec le temps alors que le coût de migration soit constant, soit plus faible. Fatalement, on viendra un jour à migrer mais l'inertie est proportionnelle à ce ratio économique modulo l'horizon d'investissement.

D'ailleurs, pour ce qui concerne la finance de marché, ce n'est plus vrai depuis un moment où le C++ est grand maître pour ses performances, que ce soit pour les automates de HFT, ce qui est plus ou moins évident vu les contraintes de performances, mais également pour les progiciels où les performances, toute proportion gardée, importe moins1.


  1. 3615 ma life, j'ai été approché par Murex et c'était uniquement pour des postes en relation avec du C++. 

+0 -0

Salut,

Je n’ai pas (encore) relu la discussion depuis le début et je ne sais plus exactement tout ce qui y a été dit (donc pardon si c’est de la redite), mais je profite de la relance du sujet pour proposer mon idée.

Je crois avoir déjà dit désapprouver un cours qui persisterait à présenter le C comme un langage d’usage courant. La particularité principale du C est qu’il est bas-niveau, à peine une surcouche structurée de l’assembleur. Ce constat me semble être ce dont on devrait partir pour enseigner le langage, au lieu de le refouler plus ou moins. Ça, et les endroits ou le C apparaît aujourd’hui : place particulière et d’héritage dans les unixoïdes, vaste couche de bibliothèques interfacée par les autres langages, applications encore actuelles dans l’embarqué.

Du coup, ce qui m’intéresserait vachement plus, ce serait un cours qui présente le C sous un angle historique. Ce ne serait pas un cours de C brut, mais plutôt un cours général de système et d’histoire de la programmation. Il présenterait le C avec le contexte technique de son invention et de son évolution, en expliquant par ce contexte les caractéristiques du langage. Du coup, un tel cours ne parlerait pas que de C, il présenterait en fait le fonctionnement général d’un ordinateur (le processeur avec ses registres, la mémoire, etc.), le fonctionnement d’un processus (la pile, le tas, etc.), les interactions avec l’environnement (signaux, pipes, etc.), on pourrait même y faire un brin d’assembleur pour mieux appréhender le tout…

Si un tel cours voyait le jour, je pense que cette approche originale (à ma connaissance), serait un vrai plus par rapport à tous les tutoriels existants. Et je pense que cette façon d’enseigner le C

  • d’une part clarifierait tout de suite ce pour quoi le C est réellement intéressant/utile sans faire miroiter à des débutants des applications insensées (lutter contre le précepte que le C est un langage généraliste, désolé Taurre),
  • et d’autre part aiderait à mieux comprendre la philosophie du langage.

Je suis plutôt d'accord, mais le C impose une rigueur (notamment sur le typage) qui permet d'apprendre les bonnes manières de programmer assez rapidement et de ne plus être perdu dans d'autres langages. Les gens qui commencent par le PHP ne feront pas de distinction entre caractère et chaîne de caractère, ce qui ne sera pas le cas en C !

Louis_A

Faut et archi-faux ! Au contraire, le C est laxiste sur le typage, notamment au niveau des pointeur ou bien en utilisant des casts. Certes plus strict que le PHP où le Javascript mais on ne peut pas dire pour autant qu'il soit rigoureux. Regarde du côté des langages fonctionnelles pour avoir une rigueur sur les types.

En C il y a plein d'exemples où il se fout du typage. Tu prends les opérateurs +,- . Tu peux me donner un type pour ces opérateurs ?

Saroupille

Pour appuyer Saroupille, n’importe quel langage à typage fort (OCaml, Haskell, Scala, Java…) t’apprendras à distinguer caractères et chaînes. Au contraire, ce n’est certainement pas un typage aussi laxiste que celui de C qui va t’apprendre la rigueur sur ce point. J’ai tiré de ma pratique du C un goût prononcé pour le hack (genre *(unsigned*)&truc), mais certainement pas pour la discipline.
Cette façon de raisonner me paraît un peu curieuse : c’est un peu comme enlever les barrières exprès pour se mettre au défi de résister au gouffre. En prenant le risque que parfois, on tombe quand même.

Ceci dit, quand tu parlais de caractères et de chaînes, je pense voir ce que tu veux dire (corrige-moi si je me trompe). Le C nous fait comprendre que ce sont deux objets distincts en nous laissant voir à quel point ils sont différents en mémoire. Du coup, avec le C on a une meilleure compréhension des structures sous-jacentes à ce qu’on fait dans d’autre langages plus haut niveau. Mais ce n’est pas vraiment le système de types qui intervient ici, et ce n’est pas une question de rigueur.


Quand je parlais de rigueur dans le typage, je parlais en terme de débutant. Il me parait assez difficile de commencer par de la prog' fonctionnelle !

Louis_A

Les gens disent que la programmation fonctionnelle, c’est comme les maths, c’est trop compliqué et on n’y comprend rien. Je pense sincèrement qu’en effet, c’est comme les maths : le blocage, c’est dans la tête des gens. La programmation fonctionnelle peut être par certains aspects plus naturelle et plus agréable à manier, sauf évidemment aprês s’être formaté à penser impératif et s’être laissé convaincre par d’autres programmeurs impératifs sans essayer soi-même que le fonctionnel c’est tordu et compliqué (je ne dis pas ça pour toi hein).

+2 -0

Intéressante ton idée. Mais, remarque: dans l'angle historique, il y a le B et son typage.

Pour impératif/fonctionnel, l'homme est formaté impératif. Je n'ai jamais vu donné des indications d'itinéraire en fonctionnel, et encore moins des recettes de cuisine en fonctionnel. Les maths sont une abstraction, et le fonctionnel est dans la lignée. Mais notre mode naturel est l'impératif.

EDIT: s/ininteressante/intéressante

La particularité principale du C est qu’il est bas-niveau, à peine une surcouche structurée de l’assembleur.

Si on oublie les 150 passes d'optimisation de GCC qui changent ton code au point qu'il ne soit méconnaissable, oui…


Je n'ai pas tout lu, mais j'ai l'impression que ce fil tourne au troll du meilleur langage (pour débuter). Personnellement, j'apprends rarement un nouveau langage parcequ'il va me servir dans « la vraie vie ». Je préfère m'attaquer à des langages qui vont élargir mes horizons et m'apporter de nouveaux concepts, de nouvelles façons de réfléchir : au hasard, Haskell, Common Lisp, SmallTalk, Forth, Erlang, C… Le jour où j'aurai besoin de faire un projet en Java (pour X raisons, bonnes ou mauvaises), j'apprendrai le Java sur le tas.

À mon humble avis, cette motivation est une raison tout à fait valide d'apprendre le C. Même si on ne s'en sert jamais dans « la vraie vie », l'étude de ce langage peut nous faire toucher du doigt diverses problématiques intéressantes : représentation des valeurs en mémoire, alignement, caches, pipelines d'instructions, appels systèmes, etc.

Certes, il est possible d'étudier ces problématiques dans d'autres langages, de la même façon qu'on peut s'amuser à faire de la programmation fonctionnelle en C. Toutefois, c'est en C que l'on trouve le plus de documentation autour de ces sujets, et cela fournit un bon prétexte pour du changement (nouveau langage → remise en cause des habitudes → bon moment pour intégrer de nouvelles choses).

C'est pour celà que l'écriture d'un cours de langage C me paraît encore pertinente aujourd'hui, à condition de soigneusement choisir les exemples et thèmes abordés. Je pense que le TP final devrait être quelque chose de l'ordre de « implémente ton propre garbage-collector », plutôt que « implémente ton propre Tetris ».

Si un cours part dans cette optique, il ne devrait présupposer aucune connaissance en programmation. En effet, l'idée est de faire voir au lecteur les choses d'une façon différente : le programmeur Python aguerri ne pense pas une « variable » de la même façon qu'un programmeur C aguerri. Donc autant reprendre le concept de « variable » depuis le début, et en profiter pour expliquer la spécificité des variables du C.

Happy trolling,

GuilOooo

+5 -0

Tu sais que qu'à chaque fois que tu défendras le C, je serais là pour contre-balancer. :p

Höd

Un jour, tu passeras à côté d'une de mes interventions, et ce jour là… Je serai extrêmement déçu. :p

Sans des contraintes économiques, le langage C aurait très probablement disparu ou serait encore plus un langage de niche. Pour sur, on ne s'embête pas à réécrire un paquet de code du C vers un langage plus moderne même si cela ne propose que des avantages si le coût de réécriture ne compense pas le coût de maintenance.

Höd

Je n'en suis pas aussi convaincu que toi. D'une part, il n'y a a priori pas de remplaçants crédibles dans « les domaines pertinents du C » et, d'autre part, il est impossible de savoir ce qu'entraînerait la suppression de contraintes économiques, les programmeurs étant alors libre de choisir un langage en fonction de critère purement personnels (ce qui est sûr en revanche, c'est qu'il y aurait probablement une diversité accrue).

[…] Pour moi, être obligé de placer le prototype d'une fonction avant le premier endroit où on y fait appel, c'est juste ridicule : même mon assembleur est capable de retrouver une fonction déclarée après l'appel.

Dominus Carnufex

Oui, sauf que la comparaison ne tient pas la route : le concept de type n'existe pas en Assembleur (celui de fonction non plus d'ailleurs), du coup il ne lui est pas nécessaire de disposer d'une déclaration pour vérifier la concordance des types entre le prototype et l'appel.

[…] Mais utiliser du C dans n'importe quel projet par pur dogmatisme, c'est aussi idiot que d'écrire un système d'exploitation en Ruby.

Dominus Carnufex

Le nœud de nos divergences se situent ici, je pense. Comme l'a remarqué Maelan, je suis d'avis que le C est un langage généraliste et qu'en conséquence il peut être utilisé pour n'importe quel projet. Qu'est ce qui justifie un tel point de vue apparemment anachronique et dogmatique ? Pas grand chose si ce n'est une recherche personnelle de contrôle et de performance. Comme tu l'as dit : « il n'existe aucun langage (hors assembleur) qui permette de produire des programmes aussi rapides, peu gourmands en mémoire et de petite taille que ceux bien programmés en C » et c'est précisémment une des raisons qui me pousse à utiliser le C et à considérer l'utilisation de la plupart des autres langages comme une hérésie étant donné leur consommation monstrueuse de ressources comparé au C.

Aussi, non, utiliser le C pour n'importe quel projet ne me paraît pas ridicule en comparaison du choix de Rubis pour réaliser un système d'exploitation.

C'est pour celà que l'écriture d'un cours de langage C me paraît encore pertinente aujourd'hui, à condition de soigneusement choisir les exemples et thèmes abordés. Je pense que le TP final devrait être quelque chose de l'ordre de « implémente ton propre garbage-collector », plutôt que « implémente ton propre Tetris ».

GuilOooo

Une focalisation plus importante sur la programmation système et sur les détails techniques me paraît une bonne idée (c'est d'ailleurs l'objectif que nous avons en têtes pour la rédaction du cours C actuellement sur PdP). Le sujet des interfaces graphiques, jeux vidéo, etc ayant à mon sens plutôt sa place dans des cours dédiés à des bibliothèques précises (GTK+, SDL, OpenGL, etc).

+0 -0

Le nœud de nos divergences se situent ici, je pense. Comme l'a remarqué Maelan, je suis d'avis que le C est un langage généraliste et qu'en conséquence il peut être utilisé pour n'importe quel projet.

Construire sa maison en partant du feu et du silex est une option envisageable : il faut simplement recréer tous les outils dont tu vas avoir besoin. C'est techniquement viable, juste ni productif ni efficace, surtout quand tu peux avoir accès à des outils modernes. Quand c'est la seule option envisageable, bah on la saisis, car ca reste mieux que de devoir redécouvrir le feu.

+0 -0

Sauf que construire une maison et apprendre à construire une maison n'a strictement rien à voir. Il existe d'ailleurs des courants pédagogiques, en accord avec les recherches sur l'expertise, qui mettent en garde contre cette erreur assez courante : pour former des experts, on ne doit pas faire réfléchir les élèves comme des experts de manière trop précoce(et donc leur faire utiliser des outils d'experts).

Pour revenir à ton analogie, tu peux (et tu dois) certes utiliser directement tes outils modernes pour construire une maison, mais le faire lors de l'apprentissage donnerait certainement des choses assez invraisemblables. Par exemple, est-ce que tu accepterais qu'un mathématicien ne sache pas compter et n'aie aucune maitrise des formules trigonométriques ou analytiques de base juste parce qu'on a des outils modernes comme des calculettes ou des logiciels de calcul formels ?

Et ce genre de chose a lieu en informatique : regardez un petit peu les messages précédents postés dans ce sujet, et regardez le nombre de ceux qui vantent un abord trop précoce de l'algorithmique, de la programmation orientée objet, de la programmation fonctionnelle (totalement incompatible avec la méthode de raisonnement par simulation mentale utilisée par les apprentis programmeurs : Voir quelques études récentes de Johnson-Lair), ou de la fabrication de code robuste (si si) avant même que les bases essentielles soient acquises. Au passage, les bases en question sont la notional machine (au moins, le C force à l'aborder, contrairement aux autres langages), puis les primitives de base des langages procéduraux . Mine de rien, ces bases posent de gros problèmes aux débutants, et il est facile de brûler les étapes.

C'est un erreur d'invoquer des arguments du type : pas besoin de faire un tutoriel pour débutant sur le C, vu que celui-ci n'est utilisable nulle part en milieu professionnel ou dans un projet. Au contraire : plus un langage est utile pour le programmeur expert, plus il a de chances d'être mauvais pour le programmeur débutant. Un langage pour l'apprentissage n'a rien à voir avec un langage utilisable dans un projet. Autant dire que bon nombre d'arguments contre le C comme premier langage ne sont pas recevables.

+2 -1

Mewtow > T'es totalement HS sur mon message là. Surtout je me recite cite

Le C est en 201[5] un langage de niche (embarqué, logiciel bas niveau, glue universelle). Il ne devrait être enseigné qu'à de gens qui savent ce qu'ils en feront. Personne ne devrait plus s’initier à la programmation avec le C.

Je suis juste en désaccord profond avec Taurre qui affirme que le C est un langage généraliste. Il le fût quand il n'y avait rien d'autre. Mais l'utiliser comme tel aujourd'hui revient à se compliquer la vie inutilement.

La seule réponse que je devrais donner à l'avenir sur le C est un langage généraliste est la suivante :

Yeah, yeah, but your [programmmers] were so preoccupied with whether or not they could that they didn't stop to think if they should.

Dr. Ian Malcolm

+2 -0

Sauf que le fait que le langage à apprendre soit ou non un langage généraliste n'est pas pertinent pour débuter en programmation. Si quelqu'un veut commencer par le C comme premier langage pour se préparer à d'autres langages, il en a parfaitement le droit, et écrire un tutoriel pour ce genre de personnes est une bonne chose (c'est le sujet du topic, non ?) : c'est d'ailleurs pour cela que j'ai décidé de migrer le tutoriel C de PDP ici.

+1 -0

Oui, sauf que la comparaison ne tient pas la route : le concept de type n'existe pas en Assembleur (celui de fonction non plus d'ailleurs), du coup il ne lui est pas nécessaire de disposer d'une déclaration pour vérifier la concordance des types entre le prototype et l'appel.

Attends, je te la refais. Pour moi, un langage qui est capable de vérifier la concordance des types dans ce code source…

1
2
3
4
5
6
7
int mafonction (int param1, char param2) {
    return 42;
}

int main() {
    return mafonction(12, 'a');
}

…mais pas dans celui-ci…

1
2
3
4
5
6
7
int main() {
    return mafonction(12, 'a');
}

int mafonction (int param1, char param2) {
    return 42;
}

…j'appelle ça un langage teubé. Mais j'ai bien conscience que c'est une conception personnelle, hein. :D

c'est précisémment une des raisons qui me pousse à utiliser le C et à considérer l'utilisation de la plupart des autres langages comme une hérésie étant donné leur consommation monstrueuse de ressources comparé au C

Je comprends cette logique de la recherche de performances, mais j'avoue me poser la question de sa pertinence quand :

  • on a des machines au moins mille fois plus puissantes que celles pour lesquelles le C a été optimisé, et que certains langages de très haut niveau comme le Haskell arrivent la plupart du temps à générer un exécutable qui tourne à peine 2 à 3 fois plus lentement que son équivalent en C ;
  • cette performance s'obtient au prix d'un temps considérable passé sur la programmation, parce que pour citer Natalya (grande amatrice du C, je rappelle) « pour réinventer la roue, il faut redéfinir la géométrie ».

C'est surtout ce dernier point sur lequel nous achoppons. En codant en assembleur, on peut parfois obtenir des programmes plus rapides et dix fois plus petits que leurs homologues en C, mais rien que convertir un nombre en chaîne de caractères est un calvaire : le C produit un code moins optimisé, mais le gain en confort de programmation en vaut la chandelle. Ben c'est pareil pour le C vis-à-vis de certains langages de plus haut niveau (pas tous, hein, je parle pas de PHP).

En outre, les langages de haut niveau permettent généralement de réduire le temps de déboguage et d'augmenter la réutilisation du code existant. En programmation fonctionnelle ou logique, par exemple, si une fonction pure fonctionne au moment de sa programmation, elle fonctionnera toujours quel que soit le contexte dans lequel elle sera réutilisée, parce qu'elle ne permet pas les effets de bord. L'absence d'accès trop direct à la mémoire garantit aussi de ne pas se manger une erreur de segmentation un jour ou l'autre. Etc.

En résumé, la perte de temps à l'exécution est avérée mais apparaît négligeable au regard du gain de temps à la programmation et à la correction, ainsi qu'au regard des erreurs évitées à l'exécution.

Par exemple, est-ce que tu accepterais qu'un mathématicien ne sache pas compter et n'aie aucune maitrise des formules trigonométriques ou analytiques de base juste parce qu'on a des outils modernes comme des calculettes ou des logiciels de calcul formels ?

Ne pas savoir compter risquerait, en effet, d'être rédhibitoire. Cela étant, si un apprenti mathématicien est capable de penser directement en termes de groupes, corps et anneaux, que le fait de ne pas voir de différence fondamentale entre additionner des entiers, additionner des vecteurs et combiner des symétries lui simplifie la vie et lui permet d'accéder plus vite aux résultats que nous mettons actuellement une bonne décennie de maths à atteindre, je ne vois aucune raison de lui enseigner autrement.

Après tout, c'est comme ça qu'on fait dans l'apprentissage de la grammaire, surtout d'une langue étrangère : on présente la structure générale et on donne des exemples de mise en pratique. Pourquoi ne pas présenter la structure générale (les groupes) et ensuite des exemples particuliers (les entiers, les vecteurs) ? Mis à part que cela nous paraît inhabituel ? Cette bataille à couteaux tirés nous montre qu'il n'est pas forcément judicieux d'introduire le concept « de base » de nombre dans l'enseignement des maths, vu qu'en progressant on finit par se rendre compte qu'il est excessivement difficile à définir.

Et c'est un point qui m'a fait tiquer plusieurs fois dans ton intervention : à aucun moment on ne définit une méthodologie pour décider de ce qui est « de base » et de ce qui ne l'est pas, on se contente de considérer que ce que l'on enseigne actuellement en début de formation constitue les bases. Mais ce n'est pas nécessairement le cas. On peut tout à fait sauter directement à un niveau d'abstraction différent et enseigner à partir de là sans se préoccuper de ce qu'il y a en dessous, du moins jusqu'à ce qu'ayant acquis un niveau avancé on touche aux limites que ce niveau d'abstraction tient du niveau inférieur.

Pour faire une analogie, je n'ai pas besoin de comprendre quoi que ce soit à la chimie sous-jacente pour apprendre que les pâtes sauce au poivre sont plus réussie si je fais cuire les pâtes dans la sauce qui si j'ajoute la sauce aux pâtes préalablement cuites : je suis à un niveau d'abstraction supérieur, et il vaut mieux apprendre les bases de ce niveau d'abstraction directement plutôt que passer plusieurs années à étudier la chimie pour préparer du risotto.

Et je doute sincèrement que « les primitives de base des langages procéduraux » soient un pré-requis indispensable à l'apprentissage de la programmation. Se représenter SHA-1 comme un compacteur qui prend des entrées de taille fixe pour les fusionner les unes dans les autres et obtenir une sortie de la même taille quel que soit le nombre d'entrées est à mon avis plus efficace et plus simple que se le représenter comme un ensemble de cases mémoires auxquelles on fait subir un certain nombre de déplacements et opérations. La programmation fonctionnelle est tout à fait abordable par un parfait débutant, à condition de réserver pour plus tard la compréhension fine du fonctionnement réel de la machine deux niveaux d'abstraction plus bas.

Si quelqu'un veut commencer par le C comme premier langage pour se préparer à d'autres langages, il en a parfaitement le droit, et écrire un tutoriel pour ce genre de personnes est une bonne chose

Si quelqu'un qui connaît le Python veut découvrir le Ruby pour savoir ce qu'il a de différent avec le Python, il en a parfaitement le droit, mais ce n'est pas pour autant que le tutoriel « Ruby pour les Pythonistes » est un choix pertinent pour un cours unique de Ruby sur le ZdS. Parce que la politique éditoriale ici est de ne pas multiplier les tutos qui abordent un thème très similaire, et en particulier, de n'avoir qu'un seul big-tuto from scratch par langage. Dans ces conditions, il faut écrire un cours de C dont l'approche sera pertinente pour le plus de visiteurs possibles et non parce qu'une catégorie donnée d'iceux « a le droit » d'avoir le tuto de ses rêves. Et en l'occurrence, on est nombreux à penser que l'approche pertinente est de considérer le C comme un langage du type « découvrez de plus près comment fonctionne votre machine » au même titre que l'assembleur.

+2 -0
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