Envoyer un nouveau message privé
Radamanthe
Inscrit depuis le le 19/05/2009 à 12:57
Derniers messages de Radamanthe :
 
mouarf, 10 plus tard, Free remet ça Ca sera quoi en 2022 ?
 
Ce qui ne vous tue pas vous rend fort...
 
Je sais quand ça se lance !

Pour souhaiter la bonne et nouvelle année, FREE prévoit le 1er janvier une pub sur les tv.
Ca devrait se produire le donc à la fin du réveillon du 31 décembre.


Ha ouais, ça c'est rock'n'roll, j'aime bien free. Avec des abonnés par papa noël qui se pendent et du sang partout. Bon ça !
 
Il serait cependant difficile pour Microsoft de permettre aux utilisateurs de déinstaller IE. Metro, la nouvelle interface de Windows 8, est en effet largement basée sur le moteur d'IE et déinstaller le navigateur reviendrait à sacrifier Metro.


Hoo pitié... un truc que j'aimerais bien que Numerama comprenne une bonne fois pour toutes, c'est qu'un technicien possède une arme de destruction massive pour convaincre : l'ignorance.

Car l'excuse est non seulement facile, mais absurde. Il y a les API graphiques et les applications. Quand on fait un OS, même avec l'incompétence dont M$ peut faire preuve, on ne mélange pas tout et n'importe quoi ! S'ils veulent utiliser le moteur graphique de leur "machin explorer" pour afficher tous leurs bidules, rien ne les en empêche. C'est le navigateur en tant qu'application qui est en cause ici.

Ca m'étonne pas du tout que M$ utilise ce genre de sophismes pour convaincre des juges (compétents pour interpréter des lois, mais à la rue pour comprendre comment un OS ou même un simple programme fonctionne), surtout quand l'OS n'est pas open-source, alors là bien-sûr, on peut dire absolument n'importe quoi et personne pourra vérifier. Mais je parie tout ce que vous voulez que si on force l'effacement de l'exécutable de leur bouzin explorer, l'interface du système ne part pas en sucette dès qu'on bouge une fenêtre... pourtant, si c'était le cas, plus rien ne devrait pouvoir s'afficher.

Quant au fait que la place d'IE n'est plus la même qu'avant dans l'écosystème actuel, et qu'à ce titre, on ne pourrait pas les accuser de profiter d'une position dominante... super-bof, hein. D'abord, ils ont toujours une position dominante, ensuite, c'est un des stratagèmes qu'ils ont utilisé pour l'obtenir. Y'en a plus que marre de voir que les mêmes trucs fonctionnent toujours et encore, 30 ans plus tard, pour blouser la populace. Cessez de prendre leur déclarations pour des vérités, c'est exaspérant à la fin !
 
eduquons, le 21/10/2011 - 15:11
Ah les idolâtres vont tomber des nues en lisant cet article. Voila le vrai visage d'apple - sympa devant et qui fait mal derrière.


Cette dernière déclaration de Steve est ultra-connue et les idolâtres ne peuvent pas l'ignorer. Mais si une divinité à le droit de faire ce qu'elle veut, les mortels sont une autre histoire.

Ceci dit, c'est drôle que je n'ai jamais pensé balancer ça à la figure d'un fan-boy occasionnellement. On devrait leur marteler ça sans cesse jusqu'à plus soif. Quand la connerie va trop loin, il faut pas hésiter à faire mal.
 
pi3rr3-29, le 20/10/2011 - 19:03

Skynet : Google t'aide pour quand tu arriveras : comme on aura tous ces voitures de gres ou de force, tu n'aura plus qu'a envoyer la moitier de la Terre dans des precipices ou creer des accidents en allant a 200 en ville


T'inquiètes... Skynet sera bien assez malin pour trouver une solution plus efficace que celle-là pour éradiquer l'espèce humaine. En fait, le scénario de Terminator me semble plus réaliste, et on peut en imaginer pleins d'autres tout aussi dévastateurs.

et meme si il n'y a que les Googles Car qui en seraient equipées, une panne de satellite, et on a un beau p'tit accident au 1er carrefour.


Nul doute qu'en cas de défaillance quelconque, le programme devrait stopper le véhicule illico presto.

Sinon, je trouve que Google joue un peu avec le feu. Il est évident qu'en cas de problème (même si je pense que c'est moins probable avec une machine respectant le code à la lettre qu'avec un humain), les responsables seront tout désignés, qu'il y ait un flou juridique ou pas.
 
Centaurien, le 15/10/2011 - 16:53

Radamanthe, le 14/10/2011 - 03:35
Non, ça ne dépend pas d'un quelconque CPU (et merci, je faisait déjà du Z80 il y a 30 ans, c'est même avec ça que j'ai commencé à coder). Ca dépend du compilateur. Si le CPU n'est pas capable de faire ça en une instruction, quel que soit le langage, quel que soit le compilo, je l'ai déjà dit : même combat. C'est au compilateur (ou interpréteur) d'optimiser au mieux, le langage ne change rien à l'affaire.

En fait ma remarque portait surtout sur le fait que le format des "string" est plus adapté que celui des chaines à zéro terminal, puisque la taille est connue, il est donc possible d'utiliser les instructions machines de transfert ou de comparaison d'octets qui sont définies depuis plus de 30 ans dans les processeurs et qui sont plus rapides que les Est-ce que j'ai un zéro à copier ? oui, je sors et j'ajoute le zéro sur la destination : non, je copie 1 octet, et je boucle.


Tes leçons d'optimisation ne m'impressionnent guère Comme si copier était la seule opération qu'on puisse faire avec une chaîne... As-tu pensé aux nombreux cas, tout aussi fréquents, où l'on modifie une chaîne et où il faut recalculer la taille (correctement, sans bug) ? Et toutes les types de concaténations ? Les streams ? Et les chaînes croisées, les sous-chaînes (sans besoin de copier) ? D'autres leçons de bas-niveau à donner peut-être ?


Conceptuellement parlant, je pense que c'était une erreur. A cette époque, il était bien rare d'avoir des chaines de caractères de plus de 80 octets - taille des terminaux -


Bah voyons... c'est vrai que les chaînes à l'époque n'étaient utilisées que pour afficher des lignes en mode texte... surement pas pour définir des sous répertoires (entre autres)...

Je crois même qu'un imbécile d'informaticien, futur milliardaire, a même dit haut et fort qu'on aurait jamais besoin de plus de 640Ko de mémoire sur un ordinateur...

, définir un caractère spécial en plus pour spécifier la fin de chaine, ou 1 octet en début de chaine contenant la taille de la chaine, ne changeait pas la taille mémoire utilisée pour une chaine, au fil du temps on aurait pu avoir des string, des long string, huge string ... , la concaténation étant une addition des tailles de chaines, on avait donc également la gestion du dépassement de capacité.
En bref, le programme aurait utilisé des instructions machines existantes et plus rapides, si le langage n'avait pas défini les chaines ainsi. Mais bon, ce n'est que mon avis.


Oui, c'est ton avis, ça c'est sûr. Le mien, c'est que seuls les processeurs Intel (de la merde vite dépassée) avaient des instructions spécialisés pour les chaînes. Quelle idée saugrenue, mais bon, c'est vrai qu'avec des CISC, pourquoi se priver, hein... et puis les ordinateurs, ce n'était bon qu'à faire du traitement de texte après tout !

Pour moi, un langage bas-niveau doit rester minimaliste, comme un processeur. C'est pour ça qu'à ce niveau, une chaîne n'a pas plus de raison de contenir sa propre taille qu'un tableau, d'où C (et non pas Pascal ou Java).
 
wykaaa, le 15/10/2011 - 14:43

Croux, le 14/10/2011 - 13:03

Heureux de te voir reconnaitre l'existence du "caractère null" dont parlait wykaaa, quand bien même tu tiens à te refocaliser sur la macro NULL à laquelle wykaaa ne faisait nullement référence (jeu de mot)


Puisque Radamanthe semble être le seul à connaître le C ici :-), je cite le "Harbison et Steele Jr", la 4ème édition qui date de 1995.
Section 2.1 Character Set, page 13 tout en haut :
"The null character is used to mark the end of strings"


Tu t'enfonces... je vois toujours pas ce que Harbison et Steele viennent foutre dans la définition de ce qu'est le C (pas plus que wikipedia). De plus, ils n'ont pas eu la bêtise d'écrire "The NULL character...", eux. Tu viens juste de les citer toi-même.


Evidemment que je ne confond pas le "null character" (� et la macro NULL (en fait #define NULL 0 dans le C dit de K&R).


Le coeur de mon propos, ce n'est pas de savoir si TOI tu fais la confusion ou pas, mais que les débutants la fassent EUX en tombant par hasard sur tes crottes (aujourd'hui, demain, ou dans 20 ans)

Je parlais bien du C dit de K&R d'avant la norme ANSI C, car ensuite, il n'y a pas eu que Dennis Ritchie mais tout un comité pour définir la norme du langage C (ISO/IEC JTC1/SC22/WG14). C'est donc bien Dennis Ritchie et son compère Brian Kernighan qui sont responsables de la définition des chaînes de caractères avec cet horrible � de fin et aussi de la définition de NULL comme étant zéro (à l'origine).


Pas qu'à l'origine ! C'est justement plus subtil que ça. La vraie question, ce n'est pas la valeur exacte de NULL, mais celle de zéro dans un contexte bien précis. Voilà ce que le K&R dit à ce sujet :

Pointers and integers are not interchangeable. Zero is the sole exception: the constant zero may be assigned to a pointer, and a pointer may be compared with the constant zero. The symbolic constant NULL is often used in place of zero, as a mnemonic to indicate that this is a special value for a pointer.


Relis bien la seconde et la dernière phrase. En d'autres termes et en français, zéro est le seul cas où, assigné ou comparé à un pointeur, lui donne une valeur spéciale (ie. invalide, que, bit à bit, cela donne l'adresse 0, ou -1, ou 2 valeurs, ou "42 rue de la connerie", ça n'y change rien, ça donne un pointeur invalide). C'était déjà défini comme cela dans la première édition du K&R. NULL n'est qu'une macro pour améliorer la lisibilité du code, car C est faiblement typé.

Tu t'es joliment planté par la suite (et là, tu ne parlais pas de caractères mais bien de NULL) en prétendant que c'est C++ qui a mis les choses au point à ce niveau alors que c'est faux. Stroustrup n'a fait que suivre la définition de C sur ce point précis (il le dit lui-même vers le début de son pavé de 1000 pages, que c'est historique) avec une seule nuance : ne plus utiliser NULL, utiliser simplement 0. Plus besoin de NULL pour clarifier, puisque C++ est fortement typé. Pourtant, il existe encore des machines où 0 (bit à bit) est un pointeur valide. Stroustrup aurait-il fait la même erreur en pire ? Rooooh.

Ritchie n'a pas rajouté simplement #define NULL 0 comme tu le prétends, il a d'abord dit que 0 dans le contexte d'assignation ou de comparaison avec un pointeur vaut pour un pointeur invalide. C'est ça, la nuance. NULL, ce n'est que du sucre, ça l'a toujours été, mais un sucre à n'utiliser que dans le contexte de l'assignation ou la comparaison avec un pointeur. Point Final. Ce n'est que quand des gus ont commencé à utiliser cela dans d'autres contextes (notamment des pointeurs arguments de fonction, même ANSI n'a pas résolu ce problème) que ça a commencé à sérieusement merder. Contrairement à ce que tu as dis, la définition de K&R marchait correctement, même sur des machines où la valeur bit à bit 0 pour un pointeur n'était pas un pointeur invalide (c'était au compilo de se démerder).
 
Mouais, j'ai tout de même plus l'impression que le coup du "on le fait pas tout de suite par respect pour Steve" est une excuse facile pour ne pas dire "on a pris du retard, faut qu'on peaufine notre présentation"... mais bon, ne soyons pas mauvaise langue
 
Croux, le 14/10/2011 - 13:03

Radamanthe, le 14/10/2011 - 03:35
Croux, le 14/10/2011 - 01:46
wykaaa n'a pas parlé de "NULL" tout court mais du "caractère NULL" qui fait partie de la norme ASCII antérieure au langage C, et on en parle même dans le K&R .

[...]
Et si la norme parle effectivement de "null character", ça n'a toujours rien à voir avec NULL qui n'est pas un caractère, ni pour la norme, ni pour le K&R par ailleurs.


Heureux de te voir reconnaitre l'existence du "caractère null" dont parlait wykaaa, quand bien même tu tiens à te refocaliser sur la macro NULL à laquelle wykaaa ne faisait nullement référence (jeu de mot)


Ne fait pas l'imbécile. J'ai toujours très bien su à quoi wykaaa faisait référence, car j'ai justement les compétences pour repérer ce genre d'écart. S'il avait écrit "caractère null", ça ne m'aurait pas plus dérangé que cela (encore qu'on peut débattre aussi de la pertinence de représenter les chaînes de cette manière, il y a du pour, il y a du contre).


Maintenant, si tu penses que le fait de l'écrire en majuscules ou en minuscule ne change pas grand-chose, alors c'est que tu n'as pas fait suffisamment de C pour te rendre compte que ce genre de négligences a été la source de bien des confusions pendant bien trop longtemps.


Histoire de couper les cheveux en quatre :

* changer null en NULL en parlant du caractère de code ASCII 0 n'est pas une faute car cette dénomination en majuscule est bien usitée.


C'est bien ça le problème ! Autant les écarts dans l'usage des langages parlés, lus et écrits est tolérable, autant en ce qui concerne les langages informatiques, ça ne l'est pas. Et à fortiori C, plus que n'importe quel autre. Des erreurs anodines dans ce langage on déjà mis des vies en danger... par contre, corriger des idées reçues n'a jamais tué personne.

* lorsqu'on mélange l'expression écrite française et l'écriture de programme on prend parfois des raccourcis non rigoureux comme prétendre comme vous l'avez fait : "NULL n'est pas un caractère. C'est un pointeur invalide.", puisque NULL n'est pas non plus un pointeur, c'est une macro-instruction dans le langage C.


Mauvaise foi ou ignorance des conséquences ?

1. Prendre "parfois des raccourcis non rigoureux" est justement la source de bien des maux en C.

2. NULL est implicitement une macro puisque utiliser uniquement des majuscules pour un nom est à l'usage exclusif des macros (même si C permet de définir une variable de la sorte, c'est une très mauvaise pratique).

3. Ne pas indiquer cette règle implicite n'a pas de conséquence néfaste. Si NULL n'était pas une macro (un mot clé par exemple), ça aurait posé beaucoup moins de problèmes, même si cela violerait une règle implicite. Par contre, dans le contexte de C, indiquer qu'il s'agit d'un pointeur invalide et non pas d'un caractère est utile. Ne fait pas comme si on devait faire preuve du même formalisme que la norme dès qu'on parle de C : personne n'y comprendrait rien est on ne s'en sortirait bien évidement pas. Vulgariser ne signifie pas qu'on a le droit de manquer de rigueur.

4. Même ta référence à l'ASCII ne fait pas référence à NULL. On y voit "Nul", "null" ou encore "NUL". Ha si, tiens, dans les détails, en dessous, on y voit bien "NULL", et c'est une légèreté que je vais m'empresser de corriger (quand-bien même ASCII ne fait pas partie de la norme C, cette page de wikipedia fait tout de même référence au langage dans ce contexte). "NUL" me convient. Ca se joue à pas grand-chose, la rigueur, hein ? Tu dois sans doute me prendre pour un fanatique... t'inquiètes, j'ai eu moi aussi ma dose de tapage de doigt par les experts, il fût un temps, pour ce genre d'écarts (et même moins que ça).

Note que je ne m'amuse pas à reprendre chaque erreur des participants à ce fil de discussion : la grande majorité n'y connait pas grand-chose et j'ai, sois en assuré, autre chose à foutre que de corriger la ramassis de bêtises qui ont pu être écrites depuis le début de cette news. C'est justement parce-que wykaaa semble avoir un niveau plus élevé que la moyenne (si toutefois on peut encore parler de moyenne) que je l'ai repris pour ce manque de rigueur : à ce titre, il est censé faire attention à ce qu'il écrit. Toi également. Pour ma part, je pense avoir fait ce qu'il fallait, en coupant les cheveux en quatre, comme tu dis.

RIP, Ritchie.
 
Croux, le 14/10/2011 - 01:46

Radamanthe, le 14/10/2011 - 00:21
- Cet horrible caractère NULL à la fin des chaînes de caractères

Rien à voir avec NULL. En C, NULL n'est pas un caractère. Et moi, je lis la norme, pas wikipedia !


wykaaa n'a pas parlé de "NULL" tout court mais du "caractère NULL" qui fait partie de la norme ASCII antérieure au langage C, et on en parle même dans le K&R .


Depuis 1989 (22 ans), en C, c'est la l'illustre norme qui fait foi, pas le K&R. On ne se base pas simplement sur le K&R pour faire un bon compilateur C, quoi que tu en dises. Cela nécessite un véritable travail de formalisme et seule la norme apporte cela. Le K&R est une vulgarisation de C, pas une formalisation (même s'il précède la norme de + de 10 ans). Et si la norme parle effectivement de "null character", ça n'a toujours rien à voir avec NULL qui n'est pas un caractère, ni pour la norme, ni pour le K&R par ailleurs.

J'attend toujours tes références... voici la mienne (tirée de la norme) :

NULL macro expands to an implementation-defined null pointer constant.


et "null" ici, se traduit par "invalide". Pas de "char" dans la phrase, ni dans le paragraphe, ce n'est même pas dans le chapitre.

Et oui, C est vicieux à ce point. Comme tu le dis si bien, wikaaa a parlé de "caractère NULL" ce qui, sémantiquement parlant, est une hérésie qui tient en 2 mots. Maintenant, si tu penses que le fait de l'écrire en majuscules ou en minuscule ne change pas grand-chose, alors c'est que tu n'as pas fait suffisamment de C pour te rendre compte que ce genre de négligences a été la source de bien des confusions pendant bien trop longtemps. On ne compte plus les débats d'experts qui en ont plus que ras le bol de deboguer du code de merde à cause de ce genre d'anneries (et même celle-là en particulier).

Alors maintenant, oui, on est pas sur un forum d'experts en C, loin de là. Mais c'est pas ça qui m'empêchera de corriger des idées reçues, même si cela a déjà été fait un million de fois, même s'il y en a encore qui font preuve de "jmenfoutisme" à l'égard d'un langage qui n'est clairement pas destiné au premier venu.

Comme tu peux le constater, moi aussi j'en ai chié

La force de strcpy() est justement dans cette simplicité. Il n'existe aucune manière plus rapide de copier une chaîne en C que :

while(*dst++ = *src++);

En code machine, c'est on ne peut plus efficace.
ça dépend, en Z80...


Non, ça ne dépend pas d'un quelconque CPU (et merci, je faisait déjà du Z80 il y a 30 ans, c'est même avec ça que j'ai commencé à coder). Ca dépend du compilateur. Si le CPU n'est pas capable de faire ça en une instruction, quel que soit le langage, quel que soit le compilo, je l'ai déjà dit : même combat. C'est au compilateur (ou interpréteur) d'optimiser au mieux, le langage ne change rien à l'affaire.
 
fbattail, le 14/10/2011 - 01:04

Si tu veux des bons développeurs C mieux vaut prendre des personnes qui codent aussi en assembleur ; au moins elles savent ce qui ce cache derrière le code C pondu et savent jouer avec des pointeurs.

Le problème c'est pas le langage, c'est le développeur


Tout à fait. Sinon, si vous cherchez des experts en C, c'est sur Usenet que vous serez le plus susceptible de les trouver :

fr.comp.lang.c (français)
comp.lang.c (anglais)

(rajouter ++ à la fin pour c++).

Le forum français est très peu actif de nos jours, est c'est bien dommage, car c'est là qu'ils se trouvent. Pour C++ par exemple, Bjarne Stroustrup, même s'il poste très rarement, fréquente assez régulièrement comp.lang.c++.
 
zig, le 14/10/2011 - 00:21

Sophismes. La vérité, c'est que C est tout sauf un langage pour débutants. Il demande des années d'expérience pour être maîtrisé. On apprend pas à faire du C correct en lisant des tutos, mais en lisant et en écrivant du code, beaucoup de code... jusqu'à ce qu'on arrive à comprendre ce qui est correct et ce qui ne l'est pas, et surtout, pourquoi !

Baratin. Je ne travaillais pas avec des mecs qui avaient lus des tutos, mais avec des professionnels.
Et les pires programmeurs que j'ai jamais vu, débutants ou confirmés, ont toujours été des programmeurs C. On avait l'impression qu'il était physiquement impossible pour un programmeur C de produire du code de qualité.


Ce n'était qu'une impression. Il est tout à fait possible de produire du code C de qualité. Le vrai problème est que c'est difficile, même pour un gars qui a de la bouteille. Je le répète : ce langage nécessite des années d'expérience.

Ce que tu ne peux pas dire, c'est que C est un mauvais langage à cause de ça. C est un excellent langage pour ce à quoi il est destiné : faire de la programmation système portable de bas-niveau. Encore faut-il respecter la norme à la lettre, et j'en conviens, ce n'est pas évident. La norme C99, c'est environ 1Mo de texte pur ! Et comme toute norme qui se respecte (ISO), c'est extrêmement formel et difficile à lire. Mais ça ne laisse, en théorie, aucune place au doute.

Quant à ce qui est correct, si c'est l'exemple de la fonction strpy que l'on trouve dans le K&R, c'est bien le pire de la programmation : arriver à rendre incompréhensible une fonction très simple.


Bien au contraire, je trouve strcpy() très simple (par définition, le bas-niveau est simple, justement). Cette fonction fait exactement ce qu'elle dit. Et si tu lis correctement sa définition, tu es censé comprendre que c'est potentiellement explosif si le tampon de destination n'est pas assez grand : comportement indéfini. En anglais, "undefined behaviour" (UB). Et une UB, c'est par définition n'importe quoi. Le plus souvent quand on fait une erreur de ce genre, ça peut marcher pendant des années... jusqu'au jour où ça pète parce-que le contexte d'exécution est différent.

La force de strcpy() est justement dans cette simplicité. Il n'existe aucune manière plus rapide de copier une chaîne en C que :

while(*dst++ = *src++);


En code machine, c'est on ne peut plus efficace. Et s'il s'avère que l'opération existe en cablé, alors strcpy() devient une simple macro pour faire appel au hardware. Je ne demande rien de plus, du moment que ça fait ce que ça dit sans chercher à faire plus pour rattraper les erreurs des pseudo-spécialistes.

Dans cet esprit-là, j'ai même vu un formateur C rester bloqué pendant 1/4 d'heure pour comprendre une seule ligne de code.


Ce n'est pas nouveau qu'il existe tout un tas de "formateurs C" qui devrait plutôt apprendre aux gens à faire du tricot.

Sauf que multiplier des pointeurs est illégal en C. Il faut "caster" pour multiplier des pointeurs, ce qui revient à faire du mauvais C (et puis quand on fait du C correct, on ne fait pas d'arithmétique sur les pointeurs plus complexe que l'addition ou l'indexation). Donc, ne pas s'étonner du résultat.

Je ne m'étonne pas du résultat, c'était n'importe quoi, incompréhensible et inmaintenable. Par contre, je m'étonne de l'esprit tordu du programmeur. Et comme par hasard, c'était encore un spécialiste du C.


Pourquoi qualifier de spécialiste un type qui fait ça ? Pour moi, c'est un clown. Rien à battre de savoir qu'il a pondu un compilateur ou je ne sais quel bidule compliqué. Au passage, les compilateurs non-conformes sont légion en C, et ils ont eu peu de succès. Même les illustres GCC et autres Visual C++ ont encore des failles... extrêmement subtiles, certes, mais ils en ont encore. Il y a tellement de cas particuliers qui peuvent apparaître... mais toujours, c'est un problème de compilateur, pas de norme du langage.

En tous cas, cette triste réalité n'est pas spécifique au C...

Alors toi, tu es peut être pas du tout comme ça : je regrette d'autant plus de ne pas t'avoir rencontré. Cela m'aurait changé de tous ces programmeurs qui m'ont rendu C-sick


Le net est pollué à 99% de gens qui prétendent être des spécialistes de C. Je dis bien à 99%.
 
Croux, le 14/10/2011 - 00:05

Radamanthe, le 13/10/2011 - 23:21

- Cet horrible caractère NULL à la fin des chaînes de caractères

Encore du sophisme. NULL n'est pas un caractère.
[...]
Une chaîne C se termine par le caractère '\0' (anti-slash zéro).


Le caractère null existe bien c'est justement celui qui porte le code ASCII 0.


Rien à voir avec NULL. En C, NULL n'est pas un caractère. Et moi, je lis la norme, pas wikipedia !
 
wykaaa, le 13/10/2011 - 21:40

Je tiens à rendre hommage à Dennis Ritchie pour sa contribution à Unix mais certainement pas pour l'invention du langage C qui est un des langages de programmation les plus laids et les moins conviviaux qui a permis à plusieurs générations de programmeurs de perdre leurs cheveux en cherchant des vrais bogues aux tréfonds du code.


Ce n'est pas le langage qui fait les bugs, c'est le programmeur. La norme C n'est pas "boguée". Et d'ailleurs, le C original de D. Ritchie non plus. Il ne manquerait plus que ça, qu'on crée des langages bogués...

Je sais de quoi je parle


Ok, on va voir ça...

puisque je suis spécialiste des langages de programmation et des compilateurs et que j'ai "fait" avec une équipe un compilateur C depuis la page blanche pour une machine diffusée dans le monde entier.
Les deux traits de langages les plus absurdes du langage C sont :
- Cet horrible caractère NULL à la fin des chaînes de caractères


Encore du sophisme. NULL n'est pas un caractère. C'est un pointeur invalide. Quand on est expert en C, on fait très attention à la terminologie du langage quand on en parle. Et dans la norme C, NULL est un pointeur invalide. Il ne viendrait d'ailleurs pas à l'idée d'un véritable expert d'assigner NULL à un caractère (char). C'est une hérésie. En partant de ce postulat, c'est sûr que le premier guignol qui écrivait :

void *c = 0;

...tombait dans un piège. Si aujourd'hui, en C99, c'est valide (car 0 dans le contexte d'un pointeur vaut NULL, ou du moins se "transforme" en NULL à la compilation), ça n'a pas toujours été le cas.

Une chaîne C se termine par le caractère '\0' (anti-slash zéro).

alors que d'autres langages qui précédaient (comme PL/1 avec les "Varying Strings") avaient résolu la question élégamment. Voir ici pour les curieux : http://www.multicians.org/pl1-raf.html (j'ai connu R. A. FREIBURGHOUSE)
- L'équivalence pointeur/tableau qui a conduit à introduire en C++, l'horrible delete [] p car avec cette équivalence, un compilateur est infoutu de faire la distinction entre un pointeur et l'adresse d'un tableau (qui est un pointeur constant). Enfin c'est un peu plus compliqué que cela mais je résume.


Tu ne résumes rien. Les tableaux de C, tels que définis dans la norme C, n'ont rien à voir avec les tableaux des autres langages. C'est un concept bas-niveau, le même que celui des tableaux basiques en assembleur, à savoir une suite contigüe d'éléments en mémoire. Point.

Dans la norme C, c'est certes un peu plus velu : il faut un minimum de formalisme. Mais fondamentalement, il n'y a rien de plus.

En plus, avoir défini que NULL c'est zéro est également absurde.


Faux. Dennis Ritchie n'a JAMAIS défini NULL comme valant zéro, mais comme un pointeur invalide. Il y avait des implémentations de C qui définissaient concrètement NULL avec autre chose que zéro (-1, 0xFFFF, ou une forme de 0x0000:0000, ou que sais-je encore), et c'était tout à fait conforme.

Sans développer ici tout l'argumentaire, il y a des machines pour lesquelles l'adresse zéro est valide.


C'est le cas des x86 en mode paginé. D'ailleurs, une adresse dans ce mode n'est pas une valeur, mais une combinaison de 2 valeurs.

Le mot "adresse" (address en anglais) n'a pas de sens en C. Dans la norme, il n'y a aucune définition de ce que tu appelles des adresses. La seule chose qui s'en approche, c'est le pointeur. Mais un pointeur est plus qu'une simple adresse.

Heureusement cette absurdité a été levée dans C++.


Ce n'est pas une absurdité. De plus, on a pas attendu C++ pour lever cette définition (C90 ou C99, je ne sais plus). En fait, si D. Ritchie avait fait le postulat que NULL == 0, il n'aurait pas défini NULL : il aurait simplement utilisé 0. Et dans ce cas, presque personne n'aurait certainement jamais entendu parler de C, puisqu'il aurait été alors impossible d'implémenter C sur toutes les machines possibles et imaginables, et cela n'aurait été qu'un énorme flop.

La force de Brian Kernighan et Dennis Ritchie (K&R pour les intimes), c'est justement qu'ils avaient une vision suffisamment abstraite de l'informatique pour créer un langage implémentable sur n'importe quel babasse, présente ou future, tout en restant suffisamment proche de la machine pour ne pas être dépassé par d'autres langages en termes de potentiel de performances.

Tout ça pour dire que le langage C n'a pas fait avancer la science informatique mais l'a fait RECULER et pour longtemps tellement les traits de ce langage sont contraire à tous les facteurs qualité du logiciel. D'ailleurs tous les langages qui s'inspirent de C, et ils sont hélas nombreux, sont laids et devraient disparaître du paysage informatique car ils sont autant de verrues contraires à l'esthétique de la théorie des langages et des grammaires y afférent.


Bien au contraire, l'apparition de C a résolu bien des problèmes. L'idée étant déjà de ne pas avoir à apprendre ouatmille assembleurs pour porter les programmes sur diverses machines.

Enfin bon, t'inquiètes, c'est pas comme si tu étais le premier à dire n'importe quoi sur C.
 
zig, le 13/10/2011 - 18:44

darken33, le 13/10/2011 - 14:39

Mais de là à encenser le langage C, qui est probablement le langage le moins intuitif et celui qui permet les pires horreurs programmatiques, il y a un pas énorme.


Ha non le pire c'est C++ ;-) ou : comment mélanger de l'objet et des pointeurs...


C'est vrai que c'est une sacrée daube. la pire implémentation d'objet sur du C. Objective-C est déjà un peu mieux ; le meilleur étant le C-talk qui n'a hélas jamais vraiment pris car trop objet.

C'est justement pour ça que c'est un grand langage, il permet une grande abstraction et en même temps il permet de bidouiller au coeur des systèmes.

Quelle abstraction ?


Le C est un macro-assembleur. Ce n'est ni plus ni moins qu'une abstraction de l'assembleur.


Quand au bidouillage : hélas ! J'en ai vu des dizaines de code C où il y a tellement de bidouillages que l'auteur lui-même ne sait plus se qu'il a voulu faire. Donc maintenabilité = zéro.


Sophismes. La vérité, c'est que C est tout sauf un langage pour débutants. Il demande des années d'expérience pour être maîtrisé. On apprend pas à faire du C correct en lisant des tutos, mais en lisant et en écrivant du code, beaucoup de code... jusqu'à ce qu'on arrive à comprendre ce qui est correct et ce qui ne l'est pas, et surtout, pourquoi !

Le top du top : un programmeur qui arrivait à faire des multiplications de pointeurs ! Je n'ai jamais compris à quoi ça pouvait servir.


Sauf que multiplier des pointeurs est illégal en C. Il faut "caster" pour multiplier des pointeurs, ce qui revient à faire du mauvais C (et puis quand on fait du C correct, on ne fait pas d'arithmétique sur les pointeurs plus complexe que l'addition ou l'indexation). Donc, ne pas s'étonner du résultat.

Un autre truc qui nous a foutu 3 semaines dans la merde : des programmes qui bloquaient sans raison.


Ben voyons. C'est bien connu que les programmes C bloquent sans raison...

Jusqu'à ce qu'on se rende compte que lorsqu'on réservait X octets de mémoire, le compilateur arrondissait à la puissance de 2 supérieure, mais que lorsqu'on libérait X octets, il libérait le nombre indiqué. Moralité : tu alloues 50 octets, il arrondit à 64, puis tu les libères et tu perds 14 octets de mémoire à chaque fois. Au bout d'une heure, tu n'as plus un seul octet disponible. Ce n'est pas vraiment la faute au C


Ce n'est pas DU TOUT la faute au C.

, mais c'était un peu l'esprit général de ce qui tournait autour de C : de la bidouille.


Ca s'appelle de la programmation bas-niveau. Un peu comme jouer avec une bombe : la puissance est là, mais si tu fais n'importe quoi, ça te pète à la tronche. Rien de plus logique en somme.

Petite anecdote : le C a été initialement développé pour des ordinateurs PDP-11 et colle un maximum au jeu d'instruction du processeur de cette machine. En particulier, l'instruction "++" était idéale car le processeur du PDP possédait la post-incrémentation


Comme la grande majorité des microprocesseurs qui ont suivi. Après, si certains désirent créer des implémentations de la norme sur des CPU de merde, c'est leur droit. Du moment qu'ils respectent la norme (et la post-incrémentation en fait partie).

. i++ en C égale une instruction en langage machine PDP.
Mais quand cela a été porté sur d'autres processeurs où la post-incrémentation n'existait pas, la compilation de la syntaxe ++ demandait plusieurs instructions machines.


Même remarque. Et au passage, C ou autre chose : même combat. Je n'ai pas encore rencontré de langage et/ou de compilateur qui soit suffisamment "magique" pour améliorer l'architecture d'un microprocesseur ou rajouter des mnémoniques...

Et nous avions vu vérifier que sur PC, faire i++ était plus lent que faire i = i + 1 !


Sources ? (que je me marre un coup). Toutes les machines basées sur l'architecture Intel (ie. les x86, c'est le cas des PC) font de la post-incrémentation aussi facilement que de la pré-incrémentation depuis les tous premiers microprocesseur de cette famille. En l'occurrence, il s'agit d'un problème de compilateur, pas de langage.

Bref... sinon, je serai gré aux apprentis programmeurs (rédacteurs ou commentateurs) de ne plus poster de soit-disant programmes C. C'est certainement le meilleur hommage que l'on puisse faire à D. Ritchie.

RIP.

NB. : Je serais également gré au rédacteur de l'article de rajouter "int " devant son "main". Merci.
 
C'est pas la première fois que Google crée un langage : http://fr.m.wikipedi...ki/Go_(langage)

J'ai du pratiquer une bonne vingtaine de langages depuis 30 ans et franchement, je ne vois pas ce que celui-ci apportera de plus au moulin. M'est avis, après un premier coup d'oeil, que Google en a surtout gros sur la patate avec la situation catastrophique de Java, cette chose infâme adoptée par la majorité d'une industrie réputée élitiste qui se retrouve aujourd'hui bien emmerdée avec Oracle...
 
Mouais, faut pas trop mordre la queue du diable non plus. C'est grosso merdo ce que fait ouvertement Google, ce n'est imposé à personne et chacun fait bien comme il veut. Pas de quoi en faire un fromage...
 
vf, le 10/10/2011 - 09:17

Radamanthe, le 07/10/2011 - 22:55

Moi, ce que je trouve hallucinant, c'est que les majors ne soient pas encore mortes et enterrées avec toutes ces balles qu'elles se tirent dans le pied. Ca en dit long sur leur puissance économique...


si les majors étaient morts y'aurais plus de films pauvre pomme,ça t'arrive de réfléchir ???


De toute évidence, je réfléchissais avec un cerveau majeur et vacciné que t'étais même pas encore dans les burnes de papa, alors tu vas calmer fissa ton enthousiasme, vu ? T'as pas affaire à tes copains d'école, là !

Ensuite, pour ton information, on a pas attendu d'inventer le fric pour inventer la culture. Si cette notion t'échappe, t'inquiète pas, ça viendra quand on t'aura inculqué suffisamment de connaissances sur l'histoire de l'humanité (voire même sa préhistoire).

Sans blagues... je viens quand-même pas ici pour me faire insulter par des merdaillons boutonneux incapables d'aligner 3 mots sans faire de fautes
 
Ce que la vidéo ne montre pas, c'est la réaction de l'enfant face à une plaque chauffante...

Télécharger
Avira Antivir PE
Antivirus - Antivirus gratuit
 
DreamMail
Courrier email - Client mail inspiré de Foxmail
 
SC Audio CD Ripper
Graver ou numériser - Ripper un CD avec correction des erreurs
 
AVS Video Editor
Editeur audio/video - Logiciel de montage complet
 
CleanMyPC Registry Cleaner
Optimisation - Entretenez facilement la base de registre.
 
Matoumba
EntrepreNantes
Numerama est un site du réseau PressTIC