- C-Kurs
- C-Kurs: Exkurse
Dieser Kurs hat zum Ziel, C-Programmierung mit dem Cross-Compiler cc65 für den Commodore 64 zu vermitteln.
Es wird vorausgesetzt, dass der Leser praktische Erfahrungen mit BASIC und Assembler auf dem C64 gesammelt und damit Grundkenntnisse über die Maschine hat. Die Idee für diesen Kurs entstand im Forum64 (www.forum64.de). Für Diskussionen und Fragen zu den hier vorgestellten Themen werde ich deshalb auch dorthin verlinken.
Im Laufe des Kurses werden gelegentlich Sachverhalte vereinfacht oder unvollständig beschrieben, um das Thema für Anfänger möglichst einfach zu halten. Oft finden sich auf solchen Seiten Verweise auf spätere Lektionen oder externe Seiten, auf denen genauere Details zu finden sind.
C wird oft als „portierbares Assembler“ bezeichnet, obwohl es das ja eigentlich nicht wirklich ist. Aber der Begriff beschreibt ein paar wesentliche Vor- und Nachteile von C:
Es lassen sich in C Programme schreiben, die fast so nah an der Maschine sind wie Assembler. Das ist auch der Grund, aus dem die meisten neueren Betriebssysteme in C geschrieben sind.
Auf 8-bit Prozessoren ist der Unterschied zwischen Programmen in handgeschriebenen Assembler und kompiliertem C noch deutlich zu bemerken, was Geschwindigkeit und Code-Größe angeht. Bei modernen Prozessoren, die für Compiler optimiert sind (und umgekehrt) kann es sogar sein, dass ein Compiler besseren Code erzeugt als ein Mensch, weil dieser nicht mehr alle Eigenschaften des Prozessors im Kopf haben kann.
Theoretisch (und praktisch) kann natürlich ein Compiler nie so guten Code erzeugen wie ein sorgfältig denkender Mensch, aber der große Mehraufwand komplizierte Algorithmen in Assembler zu implementieren ist oft nicht zu rechtfertigen. Und außerdem: „premature optimization is the root of all evil“. Deshalb ist es oft sinnvoll, das Programm in C zu schreiben, bei Bedarf Engpässe zu identifizieren (Speicher, Geschwindigkeit) und dann bestimmte Teile in Assembler neu zu implementieren.
Nun aber zu einem wesentlichen Nachteil von C: Ein BASIC-Interpreter oder andere höhere Hochsprachen bemerken relativ viele Fehler und können angemessen reagieren.
Ein Beispiel: Greife ich in BASIC auf das sechste Zeichen eine Strings mit fünf Buchstaben zu, wird der Interpreter das bemerken und sich z.B. mit einer Fehlermeldung beschweren.
Das andere Extrem ist Assembler: Ein Assembler „weiß“ nicht mal, dass das ein String ist. Wenn ich LDA string,X programmiere, tut er es einfach. Was auch immer an der Stelle gerade steht.
Bei diesem konkreten Beispiel ist C sehr dicht an dem, was ein Assembler tut: Normalerweise werden solche Sachen nicht geprüft und das Programm führt sie später einfach aus. Das Ergebnis können müllige Daten und hängende Programme sein, oder auf modernen Prozessoren der bekannte „Segmentation Fault“ bzw. die „Schutzverletzung“. Passiert sowas im Betriebssystem-Kern gibt's Erlebnisse wie den „BSOD“ oder unter Linux die „Kernel Panic“.
Das mit dem String ist nur ein Beispiel unter vielen.
Noch ein interessantes Thema in C ist der Dialekt. Der älteste Quasi-Standard ist „K&R“ (Kernighan & Ritchie, die ursprünglichen Entwickler von C). Später gab es ANSI- und ISO-Normen für C in mehreren Versionen mit Namen wie C89, C90 und C99. Viele Compiler implementieren die Standards nicht wirklich vollständig. Wir werden zunächst Sprachelemente benutzen, die irgendwo zwischen C89 und C99 liegen und die prinzipiell jeder ANSI-C-Compiler fressen sollte.
Die Programme, die wir hier in den ersten Tagen behandeln werden, verzichten erstmal auf maschinenabhängige Erweiterungen in den Compilern und Bibliotheken. Sie lassen sich dadurch auf praktisch jedem Computer, der eine Tastatur und einen Bildschirm oder wenigstens eine serielle Schnittstelle hat, übersetzen und ausführen. Vom embedded System in sd2iec-Größe, modifiziertem DSL-Router oder PDAs über PCs bis zu Großrechnern.
Das ist auch der Grund, warum wir vorerst auf conio.h oder gar c64.h verzichten. Aber keine Angst, spätestens nächste Woche huschen auch ein paar Sprites über den Bildschirm.
Ein weiterführender Link mit noch mehr Links um unteren Ende:
In diesem Thread im Forum64 können Fragen zu dieser Lektion gestellt werden:
(Bei Fragen bitte einen neuen Thread aufmachen, ich verlinke den dann hier)
In diesem Thread diskutieren Experten, was hier nicht stimmt und wie der Kurs verbessert werden kann:
http://www.forum64.de/wbb3/index.php?page=Thread&threadID=27594
Los geht's mit: 01-abend1