Site WWW de Laurent Bloch
Slogan du site

ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

Forum de l’article

Que penser du langage C ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rappel de la discussion
Que penser du langage C ?
B. - le 10 novembre 2017

Bonjour,

Je suis assez surpris des critiques que vous faites au C, langage assez critiquable certes mais pas forcément pour les raisons que vous mettez en avant ! En particulier, votre remarque sur le symbole d’affectation me laisse un peu pantois.

D’une part, on peut voir sur Wikipedia par exemple que "=" un symbole très largement utilisé pour l’affectation, pas moins que " :=". Bien sûr la majorité n’a pas forcément raison, mais le fait que de nombreux langages, dont un certain nombre postérieurs au C, fassent ce choix laisse tout de même penser que ce n’est pas une mauvaise idée du C dont il faudrait se débarrasser.

L’autre argument contre le signe "=" pour l’affectation est la confusion avec le signe "=" en mathématiques, argument que j’ai souvent entendu et qui me chagrine un peu. Le signe "=" en mathématiques a fondamentalement deux significations ! Quand on écrit "soit x = p/q ..." (dans une démonstration disons), on l’utilise bien pour l’affectation. Et quand ensuite on écrit "donc x = p/q", on utilise son sens d’égalité. Si ambiguïté il doit y avoir, elle vient des mathématiques. Au contraire, l’informatique rend explicite ce double sens. Il faut donc, dans un soucis de clarté, associer deux symboles distincts pour ces deux sens. Ensuite, choisir de remplacer le "=" de l’affectation par " :=" (ou "<-" voire "←") ou le "=" de l’égalité par "==" ne me semble pas fondamentalement différent !

Que penser du langage C ?
Laurent Bloch - le 10 novembre 2017

L’énoncé mathématique « Soit x = p/q ... » ne correspond pas à l’affectation informatique (en Scheme « (set ! x (/ p q)) ») mais très précisément à l’établissement, dans le contexte considéré, d’une liaison entre le symbole x et une valeur, soit en Scheme : (let ((x (/ p q))) ... )

On peut toujours utiliser les symboles que l’on veut, le problème, pour l’enseignement aux débutants, est qu’ils ont appris depuis l’école primaire que « = » était le symbole de l’égalité, et que l’utiliser pour l’affectation est source d’incompréhensions et de confusions dont j’ai fait de nombreuses fois l’expérience, d’autant plus que les deux notions ne sont pas sans relations mutuelles. Et que tous les langages qui ont succédé à C aient repris la même voie est plus un phénomène à soumettre à des sociologues, voire des psychologues, qu’un argument positif.

Que penser du langage C ?
Laurent Bloch - le 11 novembre 2017

À propos du concept d’égalité, je conseille vivement cet article de David Monniaux :

http://david.monniaux.free.fr/dotclear/index.php/post/2017/11/01/L-%C3%A9galit%C3%A9%2C-concept-plus-difficile-qu-il-n-y-para%C3%AEt

Que penser du langage C ?
Robert Ehrlich - le 13 novembre 2017

A l’école primaire, il n’ont pas appris que "=" désigne l’égalité, ils ont appris que c’est la même chose que "font", 2 plus 2 "font" 4. Le "=" de l’école primaire, c’est un peu (mais pas tout à fait) celui des calculettes, qui veut dire "dis-moi combien ça fait".

Le "=" du C n’est ni celui de l’école primaire, ni celui des mathématiciens, c’est normal, on est dans un autre domaine où les mots et symboles utilisés ailleurs peuvent avoir un autre sens, ce n’est pas inusuel. La réflexion de la collégienne devant x = x + 1 est du même tonneau que celui qui, lisant pour la première fois dans une recette de cuisine "faire revenir les oignons" s’étonnerait : "mais ils ne sont pas partis".

L’argument de brièveté pour l’emploi d’un symbole court me semble tout à fait recevable, c’est comme ça que fonctionnent toutes les langues naturelles, évoluant au besoin pour que les termes devenant plus fréquents deviennent plus courts. Ainsi le récepteur de télévision est devenu "la télé", ce qui n’empêche pas de comprendre que le télétravail n’a rien à voir avec ça.

Le := n’est pas meilleur en tout cas, il est parfois employé en maths pour dire "égal par définition". Si j’avais à refaire le langage, j’opterais plutôt pour le "@", en échangeant l’ordre des opérandes, à gauche ce qu’on calcule, à droite là ou on le met. Ou bien le symbole "<-", comme en APL, en gardant l’ordre, mais en sacrifiant la brièveté.

D’ailleurs LISP et ses dérivés ont aussi évolué dans le sens de la brièveté, PLUS, MINUS, etc. sont devenus +, -, etc. tout en conservant éventuellement les équivalents anciens.

De toute façon il faut bien insister pour les débutants sur le fait que certains symboles utilisés qu’on emploie en mathématique n’ont pas le même sens. Déjà sur le plans général, en programmation il s’agit de faire quelque chose et non d’affirmer quelque chose. Mais plus précisément des symboles bien plus familiers que celui de l’affectation n’ont pas (tout à fait) le même sens qu’en mathématique. Ainsi l’addition désignée par "+" n’est pas tout à fait celle des mathématiques. Pour les entiers elle se fait la plupart du temps modulo une puissance de 2. Pour les "flottants" elle est approximative, avec comme conséquence qu’elle n’est plus associative. Corollaire : une somme de nombreux termes dépend de l’ordre dans lequel on les additionne. Corollaire du précédent : une série dont le terme général tend vers 0 converge toujours si on la calcule dans l’ordre "naturel" ; en effet le terme général finit toujours par devenir suffisamment petit pour que son addition à la somme des précédents ne change rien, à partir de là cette somme devient constante. Leçon à en tirer : si on approxime quelque chose par une série, d’abord calculer le nombre de termes qu’il faut pour avoir l’approximation voulue, ensuite les sommer en partant de la fin pour que l’effet cumulé des plus petits ait plus de chances de se faire sentir sur les plus gros.

Que penser du langage C ?
Laurent Bloch - le 14 novembre 2017

La qualité et la subtilité des arguments ne m’échappent pas, ils sont plus consistants que ce que l’on entend d’habitude sur ce sujet, mais je ne m’y range pas pour autant.

Qu’un langage soit adapté à l’enseignement suppose qu’il soit expressif et que chaque expression ne soit ni un rébus ni une devinette. Et comme on ne cesse d’apprendre, ce qui vaut pour l’enseignement vaut pour la pratique professionnelle. Évidemment, pour qui est friand de rébus et de devinettes, C est parfait, et C++ encore mieux, mais je crains que ce ne soient divertissements pour adolescents.

Que penser du langage C ?
B. - le 17 novembre 2017

Je ne comprends pas entièrement votre raisonnement. Je veux bien discuter le fait que le symbole "=" de "Soit x = p/q" ne soit pas une affectation, mais ce n’est pas non plus un test d’égalité ! C’est une façon, comme vous le dites, de lier la symbole x à la valeur p/q. Il a donc une toute autre nature que le même symbole dans "donc x = p/q". Je trouve que l’informatique permet de faire comprendre cette distinction.

J’aurais dû le préciser dès mon premier commentaire, mais mon étonnement et ma remarque viennent du fait que je n’ai pas du tout l’expérience que vous avez vis-à-vis des programmeurs débutants. J’ai beau enseigner tous les ans depuis un certain nombre d’années l’introduction à la programmation, ce qui m’a permis de voir passer des cargaisons de débutants, je n’ai jamais relevé une particulière difficulté concernant l’affectation notée par =. Qu’elle soit notée =, :=, let ou que sais-je, je n’ai pas remarqué de différence chez les étudiants. La construction "x reçoit la valeur x + 1" (avec le symbole que vous voulez pour "reçoit la valeur") a toujours posé problème à quelques étudiants, et cette légère difficulté est vite surmontée. Cependant, je ne remets pas en cause votre expérience, et je serai attentif la prochaine fois que j’aurai à enseigner l’affectation avec le symbole "=", pour me rendre compte s’il n’y a pas effectivement une difficulté particulière venant du symbole utilisé que je n’aurais simplement pas su déceler jusqu’à maintenant.

Que penser du langage C ?
Laurent Bloch - le 18 novembre 2017

Il me semble que le problème gît justement là : les étudiants acceptent sans difficulté une notation beaucoup plus équivoque qu’il n’y paraît. Comme dans ma génération nous acceptions sans broncher la démonstration des cas d’égalité des triangles héritée d’Euclide, alors que depuis déjà belle lurette Hilbert avait montré que ce n’était pas une démonstration. De cette acceptation initiale trop facile découlent des erreurs à venir. Pour cette question d’égalité, je renvoie au texte de David Monniaux

À l’époque où mes propres idées sur le sujet étaient inexistantes, je ne me posais pas de questions, mais lorsqu’un collègue eut attiré mon attention sur cette distinction entre affectation et égalité, j’ai compris rétrospectivement que cette confusion avait été à l’origine de beaucoup de mes erreurs antérieures. Alors autant éviter ces divagations dès le départ.

Que penser du langage C ?
Frédéric Lefebvre-Naré - le 6 décembre 2017

Double merci pour cette discussion : d’abord elle me console avec ma propre aversion pour C ; d’autre part elle prouve que l’on peut se poser à bon escient, sur les langages informatiques, des questions très basiques — des questions accessibles dès la toute première heure d’apprentissage. Je suis moi-même allergique au = pour l’affectation, que l’on retrouve à l’identique en Scala (= pour l’affectation, == pour la comparaison). Donc, allergique à l’incohérence avec l’usage de < ou de > … pour la comparaison bien sûr… où j’attendrais, logique, << et >>. Mais il me semble que ma propre allergie est due au fait que j’ai appris les maths avant l’informatique et que je continue à pratiquer occasionnellement les maths. Je crains que tôt ou tard, ce soit aux mathématiciens de s’aligner et d’écrire une équation "3x - 6 == 0"… Ils pourront toujours écrire "Soit f(x) = 3x - 6"…

La remarque au passage sur l’orienté objet est instructive pour moi. Dans certains cas, la déclaration d’objets me semble rendre le programme plus lisible, parce qu’elle explicite le lien entre les différentes valeurs, de nature éventuellement différente. Par exemple (pseudocode pourri) "mean(dataPoint.value) where (dataPoint.timestamp < currentTime)". Dans d’autres cas, je m’arrache les cheveux ; je me disais que c’était mon incompétence, mais si des experts ont le même réflexe, ça me rassure !

Que penser du langage C ?
Laurent Bloch - le 6 décembre 2017

Derniers commentaires

Une illustration de la concurrence monopolistique
Attention : les GPU sont très forts en produits scalaires, (en multiplication de matrices par (...)

Python
"on dit plutôt maintenant développeurs" ... Il y a (au moins) deux expressions qui (...)

À la Commission de développement de l’informatique du Ministère des Finances
Article tout aussi instructif que plaisant à lire. On pensera aussi à "Comédies Françaises", (...)

À la Commission de développement de l’informatique du Ministère des Finances
Dans le style qui t’est caractéristique, j’avoue que j’ai bien aimé ! J’ai même eu l’occasion (...)

Informatique confidentielle
La clé pour comprendre est peut-être qu’il s’agit ici de "machine virtuelle" et non de (...)