In sehr einfachen Worten, was ein Programm plattformübergreifend macht, ist Ihre Fähigkeit, die Quellen aus einer Umgebung zu entnehmen, sie in einer anderen zu kompilieren und das fertige Produkt wie erwartet arbeiten zu lassen.
In weniger einfachen Worten gibt es eine vollständige Überschneidung zwischen dem, was das Programm erwartet, und dem, was Ihre Zielumgebungen bieten. Sobald Sie etwas getan haben, bei dem die Überlappung weniger als 100% beträgt, z. B. die Verwendung einer umgebungsspezifischen Bibliothek oder eines Sprachfeatures mit undefiniertem Verhalten, haben Sie Ihr Programm an die Umgebungen gebunden, die die nicht überlappenden Features bereitstellen können.
("Plattform" ist ein ziemlich matschiges Wort. Die Leute können über Windows und Unix als Plattformen oder Linux, OS X, BSD und Solaris als Plattformen sprechen, obwohl sie alle nominell Unix sind Hardware-Architekturen und Dinge werden noch nebulöser. Nachdem ich das gesagt habe, werde ich anfangen, das Wort zu verwenden.)
Glücklicherweise gibt es Standards, um dieses Problem zu lösen:
Sprachen. Sie schreiben C ++, das 1998 erstmals von der ISO standardisiert wurde. Jedes Programm, das Sie schreiben und das diesem Standard entspricht, kann mit den erwarteten Ergebnissen auf jeder Plattform mit einem konformen Compiler und einer entsprechenden Laufzeit kompiliert und ausgeführt werden. Der Größe oder Komplexität des Programms sind keine Grenzen gesetzt, solange es nicht vom Standard abweicht. Wenn ein Programm, das nachweislich den Standard erfüllt, auf einer bestimmten Plattform nicht wie erwartet ausgeführt wird, wird die Implementierung der Sprache auf dieser Plattform verdächtig. Viele Sprachen verfügen über sorgfältig gestaltete Testsuiten, mit denen die Konformität überprüft werden kann.
Java wird besonders erwähnt, weil es nicht nur eine Sprache standardisiert, sondern auch Objektcode standardisiert, wodurch seine Programme überall ohne Neukompilierung ausgeführt werden können. Dies wird erreicht, indem der Konformitätspunkt um eine zusätzliche Ebene in eine plattformangepasste virtuelle Maschine (oder sogar Hardware) verschoben wird, auf der der Objektcode ausgeführt werden kann.
APIs. Die Aufrufe, die Sie tätigen, damit Ihr Programm bestimmte Dinge ausführt, können ebenfalls standardisiert werden. Wie Sprachen können diese APIs und die Bibliotheken, die sie implementieren, so eingerichtet werden, dass sie sich so verhalten, wie es die Aufrufer erwarten, indem sie eine zugrunde liegende Implementierung verwenden, die für eine bestimmte Plattform geeignet ist. Eine solche API sind die POSIX- Standards des IEEE , die entwickelt wurden, um die Fragmentierung einzudämmen, die in den 1980er Jahren unter Unix stattfand. (Ich war damals in der Nähe; dieser Aspekt hat keinen Spaß gemacht.) Durch die Definition von Standardaufrufen und -verhalten konnten Systemanbieter ihren Kunden das Vertrauen geben, dass die Migration auf ihr Betriebssystem nicht so viel Arbeit bedeuten würde wie in der Vergangenheit. POSIX wurde weit verbreitet eingesetzt und ist fast 30 Jahre später immer noch weit verbreitet.
Ich habe zahlreiche Projekte durchgeführt, die sich sklavisch an die Standards hielten, weil ich wusste, dass sie auf mehreren Plattformen ausgeführt werden mussten. Was ich für meine Probleme bekam, war Code, der überall funktionierte, wo ich ihn ausführen wollte, und mich bei einigen angenehm überraschte, bei denen ich es nicht getan hatte.