Portables C

Das Gegenteil zur Beschäftigung einer Optimierung von Quellcode auf bestimmte Prozessorarchitekturen, notfalls mittels Assembler, ist die Formulierung von Quellcode, der maximal portabel ist. Gerade C++ hatte da lange Zeit große Schwierigkeiten, da jeder Compiler den C++ Standard anders verstand, und insbesondere die Stanard-Bibliothek immer leicht verschieden funktionierten.

Demgegenüber hat C schon eine lange stabile Phase hinter sich, und die Compilerhersteller sind sehr viel erfahrener mit der Tatsache, dass ihr Compiler mit Quellcode konfrontiert werden, der eigentlich für andere Systeme geschrieben wurde. Das Hauptproblem ist bei C oftmals nicht die mangelnde Standardkompatibilität des Compilers, sondern die aggressive Optimierung - da wird alles gemacht, was irgendwie noch nach dem C Standard legal ist.

Das Ergebnis ist, dass beliebiger C Code meist portabel ist, wenn man alle Optimierungen des Compilers abschaltet. Die Kunst besteht jetzt darin, alle Legalitäten der Sprache C zu kennen, und Code so zu schreiben, dass man auf die höchste Optimierungsstufe schalten kann. Denn wenn man dieses macht, dann wird der Compiler gerade die Programmschleifen hoch optimieren, ja womöglich Parallelisieren, was die Ausführung dramatisch beschleunigen kann, - und ungenutzen oder wenig genutzten Code erkennen, sodass dieser verschoben oder gelöscht wird.

Wie man C Quellen portabel schreibt, dass gewinnt man vor allem durch Erfahrung - in dem man verschiedenste Projekte mit den unterschiedlichsten C Compilern auf den unterschiedlichsten Plattformen versucht zu übersetzen - und den Grund von auftretetenden Fehlern untersucht. Beim nächsten Quellcode weiss man schon beim Aufschreiben des Programms, worauf man achten muss, damit es keine bei späterer Portierung keine Probleme gibt.

Projekte

Ich habe die meisten meiner C/C++ Projekte tatsächlich in C geschrieben. Zum einen habe ich das objektorientierte Modell soweit verinnerlicht, dass ich Objekte auch in blankem C schreiben kann (das GTK Widget-Kit macht das übrigens auch). Dabei gewinnt man die Möglichkeit, dass die C Funktionen über Wrapper von anderen Hochsprachen genutzt werden können. Erst in jüngerer Zeit stabilisiert sich das C++ und die zugehörigen Wrappergeneratoren, dass diese auch solche Module hereinholen können.

Ich habe die meisten meiner C Funktionsbibliotheken auf verschiedensten Plattformen getestet - am meisten portiert worden ist sicher die ZZipLib, die auch von PHP zum Zip-Zugriff verwendet wird. Compiler, Systeme, Multithreaded, Largefile, und und und - von Unix, BSD, Windows bis Echtzeitsystemen wie VxWorks.

Aber auch das PFE, die Portable Forth Environment, habe ich auf die verschiedensten Plattformen gebracht - Unix, BSD, Windows, VxWorks - und dabei darüber hinaus noch einige optionale Optimierungen erlaubt, wenn man mit GCC arbeitet, wo sogar eine Reihe von Assember-Inlines auftreten.

Insbesondere das Verständnis von GCC reicht soweit, dass ich eigene Patches geschrieben habe, die den GCC für mein Zwecke modizieren - das Substruct-C Projekt ist so ein Steckenpferd von mir, da ich der Meinung bin, dass auch normales C eine vereinfachte Hilfestellung für objektorientierte Programmierung gut vertragen kann, und dabei keinerlei (oft rechte große) zusätzliche Laufzeitbibliotheken binden muss, wie das bei C++ der Fall ist.