Eine Größe passt nicht für alle: Warum Software nicht universell kompatibel ist

Software ist auf jedem Betriebssystem gleich, oder? Falsch. Es könnte genauso aussehen und funktionieren ähnlich, aber es ist anders hinter den Kulissen.

Software ist auf jedem Betriebssystem gleich, oder?  Falsch.  Es könnte genauso aussehen und funktionieren ähnlich, aber es ist anders hinter den Kulissen.
Werbung

Sie haben gerade ein funktionsreiches Update auf Ihre bevorzugte Open-Source-App heruntergeladen. Alles funktioniert gut und du verwendest es auf deinen anderen Geräten - es ist also an der Zeit, es auch für diese Geräte zu nutzen.

Außer Ihrem glänzenden neuen Linux-Laptop ist nicht mit Ihrem Windows-Installationspaket kompatibel. Wie wäre es mit Ihrem Android-Tablet? iPhone? PS4? Warum kannst du nicht einfach diese Software nehmen und sie benutzen, wo immer du willst? Lassen Sie uns einige verschiedene Hindernisse für den Traum von "Einmal kaufen, überall rennen" erkunden.

Softwareentwicklung und Betriebssystemarchitektur

Zu verstehen, warum Software nicht über Betriebssysteme hinweg funktioniert, erfordert ein wenig (nur ein wenig, ich verspreche) Wissen darüber, wie Software gemacht wird.

Der Software-Entwicklungsprozess

In einem sehr einfachen Softwareentwicklungsablauf für Desktop, Server und Mobile (also nicht Web-Programmierung vs. Web-Entwicklung: Was ist der Unterschied? Programmierung vs. Web-Entwicklung: Was ist der Unterschied? Sie denken vielleicht, dass Anwendungsprogrammierer und Webentwickler die gleiche Arbeit machen, aber das ist weit von der Wahrheit entfernt. Hier sind die wichtigsten Unterschiede zwischen Programmierern und Web-Entwicklern. Lesen Sie mehr), ein Programmierer wird:

  1. Geben Sie einen Code in eine oder mehrere Dateien ein.
  2. Kompilieren Sie den Code in etwas, das der Computer ausführen kann.
  3. Testen Sie, um sicherzustellen, dass das Programm wie erwartet funktioniert.
  4. Verpacken und verteilen / verteilen Sie die Software.

Software-Kompatibilitätsprozess

Es ist eine Kombination der ersten und zweiten Schritte, die uns hier betreffen. Das Kompilieren von Software oder das Umwandeln von Code in die Einsen und Nullen, die ein Computer versteht (Maschinensprache), ist komplex. Wir werden nicht sehr detailliert darauf eingehen, aber es ist nützlich, auf hoher Ebene zu verstehen, was passiert.

Betriebssystemarchitektur

Ein wichtiger Punkt zu verstehen ist, dass ein Betriebssystem keine einzelne Entität ist. Es besteht vielmehr aus Schichten von Software.

Betriebssystem-Kernel

Der Kernel eines Betriebssystems ist verantwortlich für die Kommunikation mit der Hardware des Computers. Die Software übermittelt ihre Befehle an den Kernel, der wiederum Befehle an die Hardware ausgibt, um beispielsweise eine Datei von der Festplatte zu lesen oder ein Fenster auf dem Bildschirm zu zeichnen. Es koordiniert im Wesentlichen alle Informationen (ob es sich um gespeicherte Daten, Berechnungen oder Benutzereingaben handelt) zwischen Hardware und verschiedenen Softwareteilen. Der Kernel stellt diese Funktionalität über Systemaufrufe der Software zur Verfügung.

Software os Kompatibilität Kernel Grundlagen
Bildquelle: Wikimedia Commons

Der Kernel jedes Betriebssystems implementiert Systemaufrufe unterschiedlich, je nachdem, welche verfügbar sind, wie sie heißen oder welche Optionen sie haben. Aus diesem Grund muss die Software die Systemaufrufe berücksichtigen, die vom Kernel jedes Betriebssystems unterstützt werden, auf das sie abzielt. Der Systemaufruf, den Sie verwenden, um Daten an die GPU unter Linux zu senden, kann einen anderen Namen, eine Liste von Informationen, die Sie bereitstellen müssen, oder beides in Windows haben. Dieser genaue Anruf ist vielleicht gar nicht da.

Systembibliotheken

In vielen Fällen ruft Software den Kernel nicht direkt an. Stattdessen werden Systembibliotheken oder Sammlungen von Basisfunktionen aufgerufen. Bibliotheken existieren so (zum Beispiel) jedes Programm, das Dateien auf der Festplatte speichert, muss dafür keine Funktion schreiben. Stattdessen wird einfach eine Verbindung zu einer Systembibliothek hergestellt und eine vorhandene Funktion verwendet. Die GLibC-Bibliothek für Linux ist ein Paradebeispiel, ebenso wie die .DLL-Dateien in der Win32-API oder der Inhalt eines Mac / System / Library-Verzeichnisses Zugriff auf den OS X-Bibliotheksordner und warum es so einfach ist, auf die OS X-Bibliothek zuzugreifen Ordner & Warum es praktisch ist Die meisten OS X Library-Ordner lassen sich am besten alleine lassen, aber es ist nützlich, sich in und um die Benutzerbibliothek herum zu orientieren. Weiterlesen .

Software os Kompatibilität Systembibliotheken
Bildquelle: ScottXW über Wikimedia Commons

Systembibliotheken fungieren als eine Art Übersetzer zwischen Anwendungen und dem Kernel für Routineaufgaben. Anwendungen machen Funktionsaufrufe für diese Bibliotheken, die viele Details auf niedriger Ebene behandeln. Sie können auch Systemaufrufe an den Kernel vornehmen. Wie Sie vielleicht vermutet haben, bedeutet dies, dass diese Bibliotheken für einen bestimmten Kernel geschrieben sind und daher nicht für Betriebssysteme mit unterschiedlichen Kernels verwendet werden können.

Betriebssystemausführungs-Header

Der letzte Roadblock zu universeller Software ist das Format von ausführbaren Dateien für die Betriebssysteme. Ein Betriebssystem erwartet, dass die ausgeführten Dateien einem bestimmten binären Dateiformat folgen. Alles, was Sie über Dateiformate und deren Eigenschaften wissen müssen. Alles, was Sie über Dateiformate und ihre Eigenschaften wissen müssen. Wir verwenden das Wort Datei austauschbar: Musik, Bild, Tabellenkalkulation, Diashow, und so weiter. Aber was macht eine Datei zu einer "Datei"? Versuchen wir, diesen grundlegenden Teil des Computing zu verstehen. Weiterlesen . Beispielsweise müssen ELF-Dateien (Executable and Linkable Format), die auf Betriebssystemen wie Linux und FreeBSD ausgeführt werden, bestimmte Eigenschaften der Datei in bestimmten Bytes angeben, wie in der folgenden Abbildung dargestellt.

Software os Kompatibilität Elf Header

Die anwendbare binäre Schnittstelle (ABI) ist von besonderer Bedeutung. Eine ABI ist eine Kombination der Aufrufe, die von Prozessor-, Kernel- und Systembibliotheken verfügbar sind. Sie ähnelt einer Anwendungsprogrammierschnittstelle (API), da sie definiert, wie zwei Programme miteinander kommunizieren. Aber die API wird von Programmierern (Menschen) im Quellcode verwendet, um anzuzeigen, dass zwei Teile der Software miteinander kommunizieren sollen. Die ABI ermöglicht es ihnen, dies zu tun, sobald die Software kompiliert und ausgeführt wurde. Jedes Betriebssystem implementiert einen bestimmten ABI, der zwischen Versionen desselben Betriebssystems wechseln kann oder auch nicht.

Im Allgemeinen implementieren Betriebssysteme ihren eigenen ABI, der durch eine Kombination des Prozessortyps, des Kernels und aller Standardsystembibliotheken bestimmt wird. Manchmal implementiert ein Betriebssystem jedoch mehrere. FreeBSD unterstützt beispielsweise Linux-Binaries, da es einen Linux-ABI als Add-on für den FreeBSD-Kernel (anstelle des Linux-Kernels) bietet. Dies unterscheidet sich von Virtualisierungsprogrammen. Was ist eine virtuelle Maschine? Was ist eine virtuelle Maschine? Mit virtuellen Maschinen können Sie andere Betriebssysteme in Ihrem aktuellen Betriebssystem ausführen, aber warum ist das wichtig? Was sind die Vor- und Nachteile? Lesen Sie mehr wie VMWare oder VirtualBox, die Software verwenden, um eine gesamte Maschine (Hardware und alle) zu simulieren. Dies führt dazu, dass diese Art der ABI-Kompatibilität schneller, dafür aber wesentlich aufwändiger ist. Dies ist der Grund, warum es selten ist, obwohl Microsoft kürzlich den Wert von Ubuntu jetzt verfügbar im Windows Store gesehen hat. Ubuntu ist jetzt im Windows Store verfügbar. Windows Insider können nun Ubuntu auf Windows 10 herunterladen und installieren. Dies bringt Linux und Windows in einer unheiligen Verbindung zusammen Nur wenige haben sich jemals vorgestellt, dass sie lange genug leben würden, um Zeuge zu werden. Lesen Sie mehr dazu.

Ausnahme: interpretierte Software

Basierend auf dem oben genannten haben wir gelernt, dass Entwickler Software für einen einzigen Zielsystemtyp schreiben. Außer wenn sie es nicht tun. Es gibt viele Anwendungen, die Sie herunterladen und auf einem Mac ausführen können, kopieren und unter Windows ausführen und vielleicht sogar erneut kopieren und unter Linux ohne Probleme ausführen. Wie ist das möglich?

Lag ich bis jetzt?

Wie sich herausstellt, gibt es eine Kategorie von Software, die auf der Oberfläche so aussieht, als ob sie "überall läuft". Sie können sie auf jeder unterstützten Plattform herunterladen und ausführen - das Schlüsselwort wird "unterstützt" Quellcode für die Anwendung, während eine andere Anwendung (der Interpreter ) den Quellcode direkt in Echtzeit ausführt. Das ist etwas zu stark vereinfachend, also schauen wir uns genau an, wie das mit ein paar Sprachen funktioniert.

Java

Als Java zum ersten Mal veröffentlicht wurde, war es vielversprechend, "einmal zu schreiben, irgendwo zu laufen". Die Idee war, Anwendungen mit Hilfe von Java-Funktionen zu erstellen, um Dateien zu speichern, Berechnungen durchzuführen oder ein Anwendungsfenster zu erstellen. Dann würde eine Java Runtime Enviornment (JRE) für jede unterstützte Computerplattform den Code ausführen und diese in native OS-Funktionen übersetzen. Der Trick an Java ist also, dass es nicht "direkt" auf dem Betriebssystem läuft. Es läuft in einem Teil der JRE namens Java Virtual Machine und das läuft auf dem Betriebssystem.

Durch das Einfügen dieser zusätzlichen Softwareschicht zwischen der Anwendung und dem Betriebssystem können Sie sich auf eine Reihe von Funktionen konzentrieren, die für alle Betriebssysteme gleich sind. Sie teilen Java mit, was Sie tun möchten, und lassen Sie die JVM für Ihr System darüber nachdenken, wie Sie es tatsächlich tun. Das folgende Bild zeigt dies in Aktion, wobei Java Desktop Application Framework von JIDE Software dieselbe Anwendung für Mac (oben), Windows (Mitte links), "reines Java" (Mitte rechts) und Linux (unten) anzeigt.

Software os Kompatibilität jide jdaf
Bildquelle: JIDE Software

Java-Programme kompilieren sich nicht gerade in Echtzeit. Stattdessen wird der Java-Compiler sie in "Bytecode" umwandeln. Sie können sich den Bytecode als ein halbgebackenes Programm vorstellen. Wenn der Entwickler die Anwendung veröffentlicht, wird sie so weit wie möglich kompiliert, ohne zu wissen, auf welchem ​​Betriebssystem sie ausgeführt wird. Wenn Sie es tatsächlich starten, wird die JVM es "den Rest des Weges backen", um die Funktionen des Host-Betriebssystems anzupassen.

Python

Eine populäre interpretierte Sprache ist Python 5 Gründe, warum Python-Programmierung nicht nutzlos ist 5 Gründe, warum Python-Programmierung nicht nutzlos ist Python - Sie lieben es oder Sie hassen es. Sie könnten sogar von einem Ende zum anderen schwingen wie ein Pendel. Unabhängig davon ist Python eine Sprache, über die man sich kaum ambivalent verhält. Weiterlesen . Wenn Sie ein Python-Skript ausführen, übersetzt der Python-Interpreter Code in Anweisungen für das Betriebssystem. Es kann auch ähnlich wie Java funktionieren: Wenn Sie Code von außerhalb Ihrer Anwendung "importieren", wird er bei der ersten Ausführung als Bytecode kompiliert. Dann wird der Interpreter wissen, ob der ursprüngliche Code bei nachfolgenden Läufen geändert wurde, und an diesem Punkt wird er erneut zu einem neuen Bytecode kompiliert.

Ein cooles Nebenprodukt dieses On-Demand-Laufs ist, dass Sie mit dem Interpreter Ihre Skripte interaktiv entwickeln können. Wenn Sie einfach "python" in die Befehlszeile eingeben, starten Sie den Interpreter, und Sie können Code ausführen und die Ergebnisse sofort sehen.

Software os Kompatibilität Python-Interpreter

Das bedeutet, dass Entwickler "live" herumspielen und Dinge optimieren können. Sobald eine Codezeile das tut, was sie wollen, kopieren und fügen Sie sie in eine Skriptdatei ein (was viel effizienter ist als der "Code-Compile-Test" -Zyklus) nicht-interpretierte Sprachprogrammierer müssen tun).

Selbst wenn Software gleich ist, ist es wahrscheinlich nicht

Leider für die Benutzer hat die Tech-Industrie kein wirklich "universelles" Format entwickelt. Und es wird vielleicht nie so sein. Die Einführung solcher Normen führt häufig zu einer Lösung des "kleinsten gemeinsamen Nenners" mit Zugeständnissen im Interesse der Zustimmung aller.

Was denken Sie? Hättest du lieber universell kompatible Software, auch wenn es nicht so gut ist? Oder sind Sie mit dem verwendeten Betriebssystem in Ordnung und haben kein Interesse an den Apps anderer Plattformen? Lass uns unten in den Kommentaren wissen!

Bildnachweis: Masterchief_Productions / Shutterstock

In this article