3 Punkte von GN⁺ 2023-12-24 | 1 Kommentare | Auf WhatsApp teilen

Analyse des Codes xmas.c

  • Der 1988 entstandene C-Code namens xmas.c gewann den International Obfuscated C Code Contest.
  • Dieser Code ist kleiner als seine Ausgabe und zeigte eine neue Richtung für Standards zur Textkomprimierung auf.
  • Wenn man den Code kompiliert und ausführt, funktioniert er ohne Parameter und sieht auf amüsante Weise so aus, als hätte jemand zufällig auf die Tasten einer Schreibmaschine gehämmert.

Ausgabe des Codes

  • Führt man den Code aus, wird der Liedtext von "The Twelve Days of Christmas" ausgegeben.
  • Der ausgegebene Inhalt ist der Liedtext, der die Geschenke vom ersten bis zum zwölften Weihnachtstag aufzählt.

Analyse

  • Um den Code zu verstehen, muss man ihn in eine besser lesbare Form umschreiben.
  • Beim Umschreiben wird sichtbar, dass mit einer bestimmten Zeichenkette eine Substitutionschiffre entschlüsselt wird.
  • Die Variable t spielt eine wichtige Rolle bei der Steuerung der Richtung der Rekursion.
  • Der Code entschlüsselt über Rekursion die Substitutionschiffre und gibt den Liedtext des Weihnachtslieds aus.

Vereinfachung

  • Sobald man das Programm verstanden hat, kann man es mit einigen Schleifen und C-String-Bibliotheksfunktionen vereinfachen.
  • Am Ende lässt sich der Code so weit vereinfachen, dass nur noch das Ausgeben des Liedtexts übrig bleibt.

Meinung von GN⁺

  • Höhepunkt der Kreativität: Der Code xmas.c ist ein hervorragendes Beispiel für obfuskierten Code mit Substitutionschiffre und Rekursion. Er zeigt, wie sich Kreativität in der Programmierung ausdrücken kann.
  • Didaktischer Wert: Die Analyse und das Verständnis des Codes können für angehende Software Engineers eine gute Übung sein, um ihre Programmierfähigkeiten zu verbessern.
  • Spaß und Interesse: Dieser Code bietet die Gelegenheit, den Spaß an der Programmierung zu entdecken und die Freude am Lösen komplexer Probleme zu erleben.

1 Kommentare

 
GN⁺ 2023-12-24
Hacker-News-Kommentare
  • Ein ähnliches Beispiel aus der TeX-Welt ist xii.tex:

    • Wenn man komplex aussehenden Code in ein TeX-Dokument einfügt und pdftex ausführt, kann man ein anderes Ergebnis erhalten als erwartet. Das lässt sich auf shreevatsa.net ansehen.
  • Dieser Code erinnert an Kolmogorov-Komplexität:

    • Zu sehen, wie schwer verständlicher Code das gewünschte Ergebnis erzeugt, weckt die Neugier, ob es ein kürzeres Programm gibt, das dasselbe Ergebnis liefert, und wie man es finden könnte.
  • Ich habe diesen Code bekommen, als er ursprünglich veröffentlicht wurde, aber unter einem anderen Dateinamen:

    • Er war unter dem Namen "carol.c" gespeichert, und als ich ihn auf einem modernen System kompiliert und ausgeführt habe, gab der Compiler Warnmeldungen aus.
  • Der IOCCC (International Obfuscated C Code Contest) ist auch 2023 noch sehr aktiv:

    • Es gibt eine hervorragende Erklärung zum IOCCC, die man unter www.ioccc.org finden kann.
  • Wenn man die Warnungen abschaltet, funktioniert es auch im aktuellen Code-Repository (trunk):

  • Auch auf Rosetta Code gibt es eine ähnliche Aufgabe:

    • Dort gibt es ein Programmbeispiel, das das immer länger werdende Lied "Old Lady Swallowed a Fly" wiederholt erzeugt. Es ist auf rosettacode.org zu finden.
  • Ich habe gute Erinnerungen daran, wie ein Professor dieses Codefragment im letzten Semester an der Universität zu Beginn der Vorlesung gezeigt hat:

    • Es ist eine Erinnerung daran, diesem Code 2022 erstmals in der Vorlesung des Professors begegnet zu sein.
  • Aus meiner Studienzeit erinnere ich mich, dass dieser Code in gedruckten Lernunterlagen zur C-Sprache stand und ich ihn einmal selbst abgetippt habe:

    • Beim Lernen von C habe ich den Code tatsächlich selbst eingegeben, was die Erfahrung besonders einprägsam gemacht hat.
  • Dieser Code verwendet eine sehr alte Version der C-Sprache:

    • Es wird die Ansicht geäußert, dass die Signatur der main-Funktion den alten K&R-Stil verwendet und deshalb heute nicht mehr kompilieren würde.
  • Einer der interessanten Punkte ist die Verbindung zwischen Larry Walls zwei IOCCC-Siegen und der Tatsache, dass er Perl entworfen hat:

    • Dass der Entwickler von Perl beim IOCCC ausgezeichnet wurde, vermittelt den Eindruck, einige Eigenschaften der Sprache Perl zu erklären.