Plattformunabhängigkeit
# Plattformunabhängigkeit

Die Plattformunabhängigkeit – genauer als plattformübergreifend (engl. cross-platform) und allgemeiner portabel – bezeichnet in der Informationstechnik jene Eigenschaft, die ein Computerprogramm auf verschiedenen Computerplattformen ausführbar macht.

## Einschränkungen

Ein Computerprogramm benötigt in der Regel eine Laufzeitumgebung, in der es ausgeführt (oder gestartet) werden und über den gesamten Ausführungszeitraum hinweg stabil laufen kann.
Mit der Eigenschaft plattformunabhängig oder, etwas genauer, plattformübergreifend werden Programme näher beschrieben, die auf verschiedenen Plattformen lauffähig sind – also auf Rechnersystemen mit Unterschieden in Architektur, Prozessor, Übersetzer, Betriebssystem (in diesem Fall auch betriebssystemübergreifend genannt) und weiteren Dienstprogrammen, die zur Übersetzung oder Ausführung notwendig sind.
Der Grad der Plattformunabhängigkeit wird auch als Portierbarkeit (zudem weiter übersetzt: [die] Übertragbarkeit) oder Portabilität bezeichnet (aus dem englischen portability). Darunter wird nicht nur die Plattformunabhängigkeit verstanden, sondern auch der geschätzte Arbeitsaufwand, der benötigt würde, um ein Programm in ein plattformübergreifendes umzuwandeln. Dieser Vorgang wird auch Portierung oder Migration genannt.

## Formen
### Webanwendungen

Bei Webanwendungen, welche vom Browser ausgeführt werden, ist das Betriebssystem egal, nur der Browser muss bestimmte Voraussetzungen erfüllen.

### Hybrid-Apps

Hybrid-Apps sind Anwendungen, die auf unterschiedlichen Betriebssystemen und unterschiedlichen mobilen Endgeräten ausgeführt werden können.

### Multi-Channel-Apps

Multi-Channel-Apps sind Anwendungen, die unabhängig von Endgerät und Betriebssystem ausgeführt werden können. Anders als bei Hybrid-Apps können die Endgeräte sowohl mobil als auch stationär sein.

### In Zwischencode vorliegende Software

In Zwischencode vorliegende Software sind Programme, die vorliegen:
* in Form von Bytecode, wie hauptsächlich Java-Programme, oder
* in Form eines portablen, interpretierbaren Quellcodes (Programme in Python, Perl, PHP und anderen).

### Fat Binaries und Universal Binaries

Fat Binaries und Universal Binaries sind Programmpakete, die mehrere lauffähige Versionen enthalten; das Betriebssystem startet ohne Zutun des Anwenders die passende Version.

#### Fat Binaries

Beispiele für „fat binaries“ sind das OpenStep-Programmformat und die „fat binaries“ unter Mac OS, die sowohl auf Motorola-680x0-basierten Macintosh-Rechnern als auch auf PowerPC-Macs ausführbar sind. Voraussetzung dafür, dass eine „fat binary“ überhaupt erstellt werden kann, ist die Portabilität des Quellcodes (s. u.), insbesondere bezüglich der Byte-Reihenfolge (endianness) und der Länge einer Zeigervariable.

#### Universal Binaries

Universal Binaries unter macOS laufen sowohl auf PowerPC als auch auf x86-32-Bit oder x86-64-Bit.

### Quellcode-Portabilität

Quellcode-Portabilität ist häufig bei C-Programmen für Unix anzutreffen: der Quellcode enthält Anweisungen, die es erlauben, die Betriebssystemunterschiede auszugleichen. Zu diesem Zwecs existieren reichlich Hilfsmittel, z. B. GNU Autoconf.
Eine weitere Möglichkeit ist die Verwendung systemunabhängiger Bibliotheken wie Qt und GTK+. Viele im Quellcode portable Programme stehen bereits in vorgefertigten Versionen plattformübergreifend bereit.

### Eingeschränkte Plattformunabhängigkeit

Eingeschränkte Plattformunabhängigkeit ist gegeben, wenn z. B. das Programm nur auf einem bestimmten Prozessortyp lauffähig ist, ansonsten aber auf verschiedenen Hardware-Architekturen. Dies ist häufig bei Programmen der Fall, die in Assemblersprachen geschrieben sind und wie man sie früher bei Microcomputern unter CP/M oft antraf; heute wird Assemblersprache meist nur noch für zeitkritische Programmstellen verwendet, und zwecks Plattformunabhängigkeit ist meist noch eine hochsprachliche Version der gleichen Programmfunktionen beigegeben.
Auch Programme, die unabhängig vom Prozessortyp nur auf einer bestimmten Betriebssystem-Familie funktionieren, sind eingeschränkt plattformunabhängig.

### Server

Im Server-Bereich, wo schon sehr früh mit virtuellen Maschinen und virtuellen CPUs gearbeitet wurde, sieht es beim Thema Plattformunabhängigkeit etwas anders aus, als man es von klassischen Unix-/Linux-Portierungen her kennt – letztere fassen zwar zunehmend im Desktop-Bereich Fuß, verursachen durch die starke Ausrichtung auf x86-PCs in Sachen Plattformunabhängigkeit allerdings oftmals eher mehr Kopfzerbrechen als klassische Unix-Anwendungen.
Heute wird eine relative Plattformunabhängigkeit am häufigsten durch die Verwendung von Laufzeitumgebungen von Sprachen wie Java oder .NET erzielt. Allerdings wird diese scheinbare Unabhängigkeit durch eine Abhängigkeit von der Laufzeitumgebung erkauft, die nunmehr im Kern die Plattform ist.
Allerdings trifft der Begriff „Portabilität“ in beiden Fällen nicht den Kern der Sache, da es sich von Beginn an um plattformunabhängige Konzepte handelte – also auch alle APIs auf jedem Zielsystem im Voraus so nachgebildet werden müssen, dass die Software zwangsläufig lauffähig ist. Ansonsten wäre beispielsweise eine Java VM nicht zertifizierungsfähig.
Die Laufzeitumgebungen selbst müssen auch nicht auf jeder Plattform verfügbar sein. Falls Portierungen aus lizenz- oder patentrechtlichen Gründen nicht möglich sind, kann ebenso nur von einer Form von eingeschränkter Plattformunabhängigkeit gesprochen werden.

## Metriken

Die Portabilität kann z. B. geschätzt werden über: $P=1-{\frac {U+A}{E}}$
mit
* Übertragungsaufwand Ü (insbesondere Neukompilierung)
* Anpassungsaufwand A (Änderung des Quellcodes, z. B. bei Austausch von Betriebssystemschnittstellen)
* Entwicklungsaufwand E für Neuentwicklung.
Dabei entspricht
* eine Portabilität von 1 der Kompatibilität, das Programm ist also ohne Änderung auf dem Zielsystem lauffähig: $P=1\Leftrightarrow U+A=0$
* eine Quellcode-Portabilität in der Regel einer Gesamt-Portabilität von > 90 %: $A=0\Rightarrow P=1-{\frac {U}{E}}>0.9\Leftrightarrow U<0.1E$
* eine Portabilität nahe 0 einer naheliegenden Neuentwicklung des Programmes: $P\approx 0\Rightarrow U+A\approx E$.
Portabilität ist kein Maß für die Lauffähigkeit eines Programmes auf der Zielplattform, d. h. selbst eine Portabilität von 99 % bedeutet nicht unbedingt, dass das Programm nutzbar ist, sondern lediglich, dass eine Portierung im Vergleich zu einer Neuentwicklung deutlich weniger Aufwand erfordert.