Welche Möglichkeiten gibt es um ein Programm möglichst portabel zu gestalten?

Hier werde ich einige Möglichkeiten vorstellen und ihre Pros und Kontras erläutern.

Java

Das Konzept von Java ermöglicht theoretisch eine 100% Portabilität, was aber in der Realität nicht erreicht wird. Dazu muss man das Prinzip hinter Java verstehen:

Das Java-Programm wird in Bytecode compiliert. Das kann unter jedem System geschehen, für das es einen „Java-Compiler“ gibt. Dieser Bytecode wird dann von der Java-Plattform oder Java-VM Interpretiert oder teilweise compiliert um den Code zu Optimieren.

Das heißt auf jedem Betriebssystem, für das es eine Java-VM gibt, funktioniert auch das in Bytecode übersetzte Programm. Doch auch dies stimmt nicht ganz.

Durch unterschiedliche Java-Versionen und Emulatoren laufen Java-Programme nur beschränkt. Eine Java-Anwendung beispielsweise, die für ein Handy programmiert wurde, könnte eventuell nicht an einem PC ausgeführt werden, da sie Funktionen nutzen könnte, die es in der Java-VM für den PC nicht gibt.

Und hier zeigt sich das Problem: Auf einem Hobby-OS, für das es keine Java-VM gibt, läuft auch kein Java-Programm und auf jedem Betriebssystem, auf dem die spezifische, von dem Programm benötigte, VM nicht gibt, läuft das Programm auch nicht.

Bibliotheken

Gemeint sind Programmierbibliotheken (Librarys) die eine gewisse Plattformunabhänigkeit garantieren, da man die selben Funktionen für verschiedene Betriebssystem Programmiert hat.

Solche Bibliotheken wären z.B: wxWidgets, QT, SDL, OpenGL, libUSB usw.

Das Problem hierbei ist, das sie nur für die im Projekt vorgesehenen Plattformen verfügbar sind, das sind in der Regel: Windows, Linux, meistens noch Mac, teilweise noch andere Unixe und BSD.

Und das Programm muss für jedes OS neu Compiliert werden.

Emulatoren

Ein Emulator ist ein Programm, das versucht alle wichtigen API-Funtkionen eines OS bereitzustellen. In der Regeln sind das System-Calls, Streams usw.

Das Problem mit Emulatoren ist, das sie zusätzliche Leistung benötigen und nicht genau so gut sind wie das Original und es häufig an Funktionen fehlen, die erst kürzlich durch neue Updates hinzugekommen sind.

Ein Emulator gehört eigentlich nicht zum Thema „plattformunabhängige Programmierung“, sollte aber erwähnt werden, da ein Emulator das selbe Ziel verfolgt.

Wine

Einer der bekanntesten Emulatoren ist Wine. Wine versucht eine Windowsumgebung zu Simulieren, was mehr oder weniger gelingt.

Das Problem bei der Verwendung von Wine ist, das man nie genau weiß, wie weit Wine das Programm noch unterstützt. Es kann sein, das das Programm startet und auch stabil läuft, aber dann bei der Funktion auf die es ankommt schlapp macht.

Wine unterstützt außerdem keine .NET Programme, solange man nicht Mono für Windows herunterlädt und installiert.

Auch hat Wine Probleme mit den neueren DirectX Versionen.

Mono

Mono ist das Gegenteil zu Wine, Mono unterstützt nur .NET Programme. Dabei gilt aber selbes wie bei Wine, es kann funktionieren muss aber nicht. Bei Mono kann es zudem auch vorkommen, das Programme nicht das tun, was sie sollten. Ich hatte z.B bei einem C# Programm, das Mono eine Multiplikation nicht ausgeführt hat, was zu Verzerrungen auf dem durch das Programm angezeigtem Bild hatte.

Andere Emulatoren

Es gibt noch haufenweise Emulatoren, z.B einen iPhone Emulator, einen DOS-Emulator usw.

Bei dieser Unmenge an Emulatoren kann es große Qualitative Unterschiede geben. Der iPhone Emulator wurde von Apple entwickelt und kann deshalb das iPhone sehr gut simulieren, während es z.B Wine nur schwer schafft ein Programm wirklich fehlerfrei laufen zu lassen.