Ein paar grundsätzliche Tipps für die Programmierung an der Virtuellen Zockhalle.
Besorgen sie sich Doxygen, wenn sie es noch nicht haben! Nachdem sie sich Doxygen besorgt haben, tippen sie im Projektverzeichnis make doc und machen sie sich wenigstens oberflächlich mit der generierten Dokumentation vertraut! Sie werden diese noch häufiger benutzen. Es ist keine besonders gute Dokumentation, aber sie ist sehr viel besser als gar keine Dokumentation.
Wenn sie unerfahren in C sind, erschrecken sie sich nicht vor Funktionspointern! Diese sind ein elementares und im Prinzip einfaches Konzept. Jedes Objekt hat eine Adresse im Speicher, das gilt auch für Funktionen - irgendwo im Speicher muss ihr Code ja sein. Die Virtuelle Zockhalle wimmelt nur so von derartigen Pointern. Ich trenne auf diese Weise die allgemeine, in jedem Fall wiederverwendbare Programmlogik von der Implementation, und diese Vorgehensweise ist sehr klar, wenn sie erst einmal durchschaut wurde. Wenn sie Erfahrungen in einer objektorientierten Sprache haben, denn werden sie sofort die Nähe zum weniger elementaren Konzept der virtuellen Funktionen oder - ein anderer Begriff für den gleichen Gedanken - der späten Bindung bemerken. Es gibt aber einen Unterschied. Die Pointer lassen sich direkt in CPU-Anweisungen übersetzen und sie im Gegensatz zum Lookup in einer virtual table sehr performant, da nur eine einzige Dereferenzierung erforderlich ist.
Verändern sie zum Entwickeln im Verzeichnis src im Makefile die Zeile DEBUG=0 in DEBUG=1! Auf diese Weise werden etliche leicht zu machende Fehler zur Laufzeit mit assert() geprüft. Ein Programmabbruch unter Angabe der Zeile, in der eine essenzielle Bedingung nicht erfüllt war, ist sehr viel einfacher zu verstehen als ein rätselhaftes Fehlverhalten oder ein sporadisch auftretender Programmabsturz, dem man erst einmal mit einem Debugger auf die Spur kommen muss.
Haben sie keine Hemmungen, einen Debugger zu benutzen! Wenn sie den Debugger in ihrer Entwicklungsumgebung noch nie benutzt haben, arbeiten sie sich kurz ein, indem sie seine Dokumentation einmal querlesen, damit sie ein Gefühl für die Möglichkeiten und die Bedienung bekommen! Die dafür aufgewändete Zeit erhalten sie schnell zurück. Die vielen Callback-Funktionen führen zu oft schwer verständlichen Abläufen. Natürlich wird die Virtuelle Zockhalle mit der Option -g compiliert, wenn sie DEBUG=1 gesetzt haben. Ich habe nämlich auch keine Hemmungen, einen Debugger zu benutzen.
Denken sie vor dem Programmieren nach! Nicht währenddessen und schon gar nicht erst nachher! Ja, ich weiß, wie arrogant so eine Aufforderung klingt. Aber ich habe schon berufsmäßige Programmierer erlebt, die diese sehr einfache Regel nicht beherzigen. Was dabei an Code entstanden ist, wirkt zwar fröhlich und bunt wie ein Goldhamster auf LSD, wird aber zum Horrortrip, wenn man die Fehler darin beseitigen will oder muss. Vielleicht hilft es ihnen, wenn sie wissen, dass der größte Teil der Virtuellen Zockhalle in meinem Notizbuch entstanden ist. Als ich mit dem Coden begann, war das Programm schon fertig, es war nur noch nicht geschrieben. Obwohl ich unter eher ungünstigen Umständen code, entstanden die knapp 8.000 Zeilen des ersten Kernsystems in weniger als drei Tagen, weil sie schon fertig waren. Zu meinem eigenen Erstaunen waren nur drei schwere Fehler darin, und nur einer dieser Fehler erforderte umfangreichere Änderungen, die sich auf mehr als hundert Zeilen erstreckten - es handelte sich um einen Denkfehler. Die Programmiersprache und die Programmierumgebung sind dafür da, ein Programm zu coden, sie können niemals Analyse und Nachdenken ersetzen4.4. Ich habe insgesamt deutlich länger am Verfassen der Dokumentation4.5 als am »Absondern« von Codezeilen gesessen.
Bevor sie mit ihrem Automaten beginnen, werfen sie einmal einen Blick in z_oldstl.c! Darin sind Golden Jack (3.3) und Rotomat Krone (3.5) implementiert, zwei einfache und leicht durchschaubare Geräte4.6. Versuchen sie, ein Gefühl dafür zu bekommen, wie ein virtuelles GSG implementiert wird! Werfen sie für die verwendeten Funktionen und structs einen Blick in die Dokumentation. Vieles klärt sich, wenn ein Beispiel vor Augen steht.