die datenschleuder. - Chaosradio - CCC
die datenschleuder. - Chaosradio - CCC
die datenschleuder. - Chaosradio - CCC
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
STRIP INPUT.C<br />
Shortest Programming – Tipps<br />
und Tricks<br />
von Markus Schaber <br />
Eine beliebte sportliche Disziplin unter den Hackern ist es, das kürzestmögliche<br />
Programm für eine gegebene Aufgabe zu schreiben. Auch im <strong>CCC</strong> hat es schon solche<br />
Wettbewerbe gegeben (siehe auch http://ulm.ccc.de/shortest/ ). In <strong>die</strong>sem Artikel<br />
werden (anhand von Beispielen der Sprache C) ein paar der Tricks verraten, wie<br />
Hacker und Haeckse <strong>die</strong> letzten Bytes aus einem Programm quetschen kann. Allerdings<br />
wird nicht alles verraten – etwas “Hack Value” soll schon noch übrig bleiben...<br />
Warnung: Die hier gezeigten Methoden sind im allgemeinen<br />
das genaue Gegenteil von „gutem Programmierstil“, und<br />
können unter Umständen von Arbeitgebern, Übungsaufgaben-Korrektoren,<br />
Open-Source-Projektleitern, Einstellungsprüfern<br />
und anderen, denen man seinen Quelltext zukommen<br />
lässt, mit anscheinend unerklärlichen Anfällen von<br />
Mißfallen bedacht werden.<br />
Leerraum minimieren<br />
Betrachten wir mal das folgende Code-Fragment kritisch [1]:<br />
1. /* Multiply our number with 23<br />
2. * We call this function before each new<br />
base-23 digit is read.<br />
3. */<br />
4. void multiply(void) {<br />
5. int ueber=0;<br />
6. int pos=0;<br />
7. int zwi=0;<br />
8. int alt;<br />
9. do { alt = f[pos];<br />
10. zwi = f[pos] * 23 + ueber;<br />
11. f[pos] = zwi % 11;<br />
12. ueber = zwi / 11;<br />
13. pos++;<br />
14. } while (pos < MAX);<br />
15.<br />
16. if (ueber != 0) {<br />
17. printf(“SHIFT OVERFLOW”);<br />
18. exit(1);<br />
19. }<br />
20. }<br />
Natürlich sollten alle Bestandteile des Quelltextes, <strong>die</strong> den<br />
Compiler nicht interessieren, aus dem Programm entfernt<br />
werden. Dies sind zuallererst natürlich <strong>die</strong> Kommentare.<br />
Ausserdem können Leerräume (Leerzeichen, Tab, Zeilenumbruch)<br />
optimiert werden: Jede Folge von mehr als einem Leeraum<br />
kann zu einem Leerraum zusammengekürzt werden. Als<br />
allererstes kommen also alle Spaces und Tabs am Zeilenende<br />
weg, ebenso wie <strong>die</strong> Einrückung am Zeilenanfang, und sonstige<br />
Ansammlungen von Leerzeichen – damit kommen wir auf<br />
folgenden Quelltext:<br />
1. void multiply(void) {<br />
2. int ueber=0;<br />
3. int pos=0;<br />
4. int zwi=0;<br />
5. int alt;<br />
6. do { alt = f[pos];<br />
7. zwi = f[pos] * 23 + ueber;<br />
8. f[pos] = zwi % 11;<br />
9. ueber = zwi / 11;<br />
44 44<br />
#83 / 2004<br />
10. pos++;<br />
11. } while (pos < MAX);<br />
12. if (ueber != 0) {<br />
13. printf(“SHIFT OVERFLOW”);<br />
14. exit(1);<br />
15. }<br />
16. }<br />
Aber auch innerhalb <strong>die</strong>ses Quelltextes gibt es noch einige<br />
überflüssige Leerräume, <strong>die</strong> man eliminieren kann – vereinfacht<br />
gesagt, an allen Stellen an denen vor oder [2] nach dem<br />
Leerraum kein Bezeichner und keine Zahl steht. An den Stellen,<br />
an denen aus syntaktischen Gründen ein Leerraum bleiben<br />
muss, setze ich gerne Zeilenumbrüche ein – das stört den<br />
Lesefluss, und das Programm sieht optisch länger aus, als es<br />
wirklich ist. Das Programm sieht dann wie folgt aus:<br />
1. void<br />
2. multiply(void){int<br />
3. ueber=0;int<br />
4. pos=0;int<br />
5. zwi=0;int<br />
6. alt;do{alt=f[pos];zwi=f[pos]*23+ueber;f[pos<br />
]=zwi%11;ueber=zwi/11;pos++;}while(pos