3 points par GN⁺ 2023-12-24 | 1 commentaires | Partager sur WhatsApp

Analyse du code xmas.c

  • Le code C nommé xmas.c, créé en 1988, a remporté le Concours international de code C obscurci.
  • Ce code est plus petit que sa sortie, et propose une nouvelle direction pour les standards de compression de texte.
  • Si on le compile et qu’on l’exécute, il fonctionne sans paramètre et, de façon amusante, donne l’impression d’avoir été tapé au hasard sur un clavier.

Sortie du code

  • Lorsqu’on exécute le code, il affiche les paroles de la chanson « The Twelve Days of Christmas ».
  • Le contenu affiché est constitué des paroles énumérant les cadeaux du premier au douzième jour de Noël.

Analyse

  • Pour comprendre le code, il faut le réécrire sous une forme plus lisible.
  • Ce travail de réécriture révèle qu’il déchiffre un chiffrement par substitution à l’aide de certaines chaînes spécifiques.
  • La variable t joue un rôle important dans le contrôle du sens de la récursion.
  • Le code déchiffre ce chiffrement par substitution via la récursion, puis affiche les paroles de la chanson de Noël.

Simplification

  • Une fois le programme compris, on peut le simplifier en utilisant certaines boucles et des fonctions de la bibliothèque de chaînes de C.
  • À terme, cette simplification peut réduire le code à un simple affichage des paroles.

L’avis de GN⁺

  • Un sommet de créativité : le code xmas.c est un excellent exemple d’écriture de code obscurci à l’aide d’un chiffrement par substitution et de la récursion. Il montre comment la créativité peut s’exprimer en programmation.
  • Valeur pédagogique : analyser et comprendre ce code peut constituer un très bon exercice pour aider des ingénieurs logiciels débutants à améliorer leurs compétences en programmation.
  • Plaisir et intérêt : ce code offre l’occasion de découvrir l’aspect ludique de la programmation et le plaisir de résoudre des problèmes complexes.

1 commentaires

 
GN⁺ 2023-12-24
Avis Hacker News
  • Il existe un exemple similaire dans le monde de TeX : xii.tex

    • En insérant du code à l’apparence complexe dans un document TeX puis en exécutant pdftex, on peut obtenir un résultat différent de ce qui est attendu. C’est visible sur shreevatsa.net.
  • Ce code fait penser à la complexité de Kolmogorov :

    • Voir un code difficile à comprendre produire le résultat voulu éveille la curiosité de savoir s’il existe un programme plus court donnant le même résultat, et comment le trouver.
  • J’avais reçu ce code lors de sa publication initiale, mais sous un autre nom de fichier :

    • Il était enregistré sous le nom "carol.c", et lorsque je l’ai compilé et exécuté sur un système moderne, le compilateur a affiché des avertissements.
  • L’IOCCC (International Obfuscated C Code Contest) est toujours bien vivant en 2023 :

    • Il existe une excellente présentation de l’IOCCC, visible sur www.ioccc.org.
  • En désactivant les avertissements, cela fonctionne aussi sur le dépôt de code moderne (trunk) :

  • Rosetta Code propose aussi quelque chose de similaire :

    • On y trouve un exemple de programme qui génère de manière répétitive la chanson cumulative "Old Lady Swallowed a Fly". À voir sur rosettacode.org.
  • Je garde un bon souvenir du moment où, au dernier semestre à l’université, un professeur a montré cet extrait de code au début d’un cours :

    • Cela me rappelle la première fois que j’ai découvert ce code pendant son cours en 2022.
  • À l’époque de mes études, ce code figurait dans des supports imprimés pour apprendre le langage C, et je me souviens l’avoir retapé moi-même une fois :

    • En apprenant le C, le fait de saisir réellement ce code à la main en a fait une expérience mémorable.
  • Ce code utilise une très ancienne version du langage C :

    • L’opinion exprimée est que la signature de la fonction main utilise l’ancien style K&R, et qu’il ne compilerait donc plus aujourd’hui.
  • L’un des aspects intéressants de l’IOCCC est le lien entre le fait que Larry Wall l’a remporté deux fois et qu’il ait ensuite conçu Perl :

    • Le fait que le concepteur de Perl ait été primé à l’IOCCC donne l’impression d’expliquer certaines caractéristiques du langage Perl.