Werbung
Sie haben gerade ein funktionsreiches Update für Ihre bevorzugte Open Source-App heruntergeladen. Alles funktioniert gut und Sie verwenden es auf Ihren anderen Geräten - es ist also an der Zeit, es auch auf diese Geräte auszudehnen.
Außer dass Ihr glänzender neuer Linux-Laptop nicht mit Ihrem Windows-Installationspaket kompatibel ist. Wie wäre es mit Ihrem Android-Tablet? iPhone? PS4? Warum können Sie diese Software nicht einfach nehmen und verwenden, wo immer Sie möchten? Lassen Sie uns einige verschiedene Hindernisse für den Traum "Einmal kaufen, überall laufen" untersuchen.
Softwareentwicklung und Betriebssystemarchitektur
Um zu verstehen, warum Software nicht betriebssystemübergreifend funktioniert, ist ein wenig (wie ich verspreche, ein wenig) Wissen darüber erforderlich, wie Software hergestellt wird.
Der Softwareentwicklungsprozess
In einem sehr grundlegenden Softwareentwicklungsablauf für Desktop, Server und Mobile (d. H. nicht Web Programmierung vs. Webentwicklung: Was ist der Unterschied? Sie mögen denken, Anwendungsprogrammierer und Webentwickler machen den gleichen Job, aber das ist weit von der Wahrheit entfernt. Hier sind die wichtigsten Unterschiede zwischen Programmierern und Webentwicklern. Weiterlesen ) wird ein Programmierer:
- Geben Sie einige ein Code in eine oder mehrere Dateien.
- Kompilieren den Code in etwas, das der Computer ausführen kann.
- Prüfung um sicherzustellen, dass das Programm wie erwartet funktioniert.
- Paketieren und verteilen / bereitstellen die Software.
Es ist eine Kombination aus dem ersten und dem zweiten Schritt, die uns hier beschäftigen. Der Prozess von Kompilieren Software oder das Umwandeln von Code in Einsen und Nullen, die ein Computer versteht (Maschinensprache), ist komplex. Wir werden nicht im Detail darauf eingehen, aber es ist nützlich, auf hoher Ebene zu verstehen, was passiert.
Betriebssystemarchitektur
Ein wichtiger Punkt, den Sie verstehen sollten, ist, dass ein Betriebssystem keine einzelne Entität ist. Es besteht vielmehr aus Softwareschichten.
Betriebssystem-Kernel
Ein Betriebssystem Kernel ist für die Kommunikation mit der Hardware des Computers verantwortlich. 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. Grundsätzlich werden alle Informationen (ob gespeicherte Daten, Berechnungen oder Benutzereingaben) zwischen Hardware und verschiedenen Softwareteilen koordiniert. Der Kernel stellt all diese Funktionen der Software über zur Verfügung Systemaufrufe.
Der Kernel jedes Betriebssystems implementiert Systemaufrufe unterschiedlich, je nachdem, welche verfügbar sind, wie sie aufgerufen werden oder welche Optionen sie wählen. Daher muss die Software die Systemaufrufe berücksichtigen, die vom Kernel jedes Betriebssystems unterstützt werden, auf das sie abzielt. Der Systemaufruf, mit dem Sie unter Linux Daten an die GPU senden, hat möglicherweise einen anderen Namen, eine andere Liste von Informationen, die Sie bereitstellen müssen, oder beides unter Windows. Dieser genaue Anruf ist möglicherweise gar nicht da.
Systembibliotheken
In vielen Fällen ruft die Software den Kernel nicht direkt auf. Stattdessen ruft es zu Systembibliothekenoder Sammlungen von Grundfunktionen. Es gibt Bibliotheken, sodass (zum Beispiel) jedes Programm, das Dateien auf der Festplatte speichert, keine Funktion schreiben muss, um dies zu tun. Stattdessen einfach Links zu eine Systembibliothek und verwendet eine vorhandene Funktion. Die GLibC-Bibliothek für Linux ist ein Paradebeispiel, ebenso wie die DLL-Dateien in der Win32-API oder den Inhalt des Verzeichnisses / System / Library eines Mac So greifen Sie auf den OS X-Bibliotheksordner zu und warum ist er praktisch?Die meisten Ordner der OS X-Bibliothek sollten am besten in Ruhe gelassen werden. Es ist jedoch hilfreich, sich in und um die Benutzerbibliothek auskennen. Weiterlesen .
Systembibliotheken fungieren als eine Art Übersetzer zwischen Anwendungen und dem Kernel für Routineaufgaben. Anwendungen machen Funktionsaufrufe zu diesen Bibliotheken, die viele Details auf niedriger Ebene verarbeiten. Sie können der Einfachheit halber auch Systemaufrufe an den Kernel senden. Wie Sie vielleicht vermutet haben, bedeutet dies, dass diese Bibliotheken für einen bestimmten Kernel geschrieben wurden und daher nicht für Betriebssysteme mit unterschiedlichen Kerneln verwendet werden können.
Header für die Ausführung des Betriebssystems
Das letzte Hindernis für universelle Software ist das Format der ausführbaren Dateien für die Betriebssysteme. Ein Betriebssystem erwartet, dass die von ihm ausgeführten Dateien einem bestimmten folgen binäres Dateiformat Alles, was Sie über Dateiformate und ihre Eigenschaften wissen müssenWir verwenden die Wortdatei synonym: Musik, Bild, Tabelle, Diashow und so weiter. Aber was macht eine Datei überhaupt zu einer "Datei"? Lassen Sie uns versuchen, diesen grundlegenden Teil des Rechnens zu verstehen. Weiterlesen . Zum Beispiel die ELF-Dateien (Executable and Linkable Format), die auf Betriebssystemen wie z Linux und FreeBSD müssen bestimmte Eigenschaften der Datei in bestimmten Bytes angeben, wie unten gezeigt Bild.
Das Anwendungsbinärschnittstelle (ABI) gezeigt ist in der Lage ist von besonderer Bedeutung. Ein ABI ist eine Kombination der Aufrufe, die von Prozessor-, Kernel- und Systembibliotheken verfügbar sind ein Anwendungsprogrammierschnittstelle (API), indem es definiert, wie zwei Programme miteinander kommunizieren. Die API wird jedoch von Programmierern (Menschen) im Quellcode verwendet, um zwei Softwareteile anzuzeigen sollte miteinander reden. Das ABI ermöglicht es ihnen tatsächlich, dies zu tun, sobald die Software kompiliert und ausgeführt wurde. Jedes Betriebssystem implementiert ein bestimmtes ABI, das sich zwischen Versionen desselben Betriebssystems ändern kann oder nicht.
Im Allgemeinen implementieren Betriebssysteme ihre eigene ABI, die durch eine Kombination des Prozessortyps, des Kernels und aller Standardsystembibliotheken bestimmt wird. Manchmal implementiert ein Betriebssystem jedoch mehrere. FreeBSD unterstützt beispielsweise Linux-Binärdateien, da es ein Linux-ABI als Add-On zum FreeBSD-Kernel (anstelle des Linux-Kernels) bereitstellt. Das ist anders als Virtualisierungsprogramme Was ist eine virtuelle Maschine? Alles, was Sie wissen müssenMit virtuellen Maschinen können Sie andere Betriebssysteme auf Ihrem aktuellen Computer ausführen. Folgendes sollten Sie über sie wissen: Weiterlesen B. VMWare oder VirtualBox, die Software verwenden, um eine gesamte Maschine (Hardware und alle) zu simulieren. Infolgedessen ist diese Art der ABI-Kompatibilität schneller, aber viel aufwändiger zu warten. Dies ist jedoch selten Microsoft hat den Wert kürzlich erkannt Ubuntu ist jetzt im Windows Store verfügbarWindows Insider können jetzt Ubuntu herunterladen und auf Windows 10 installieren. Dies bringt Linux und Windows in einer unheiligen Vereinigung zusammen, von der sich nur wenige vorgestellt haben, dass sie lange genug leben würden, um Zeuge zu werden. Weiterlesen dabei.
Ausnahme: Interpretierte Software
Basierend auf dem oben Gesagten haben wir erfahren, dass Entwickler Software für einen und nur einen Zieltyp schreiben. Außer wenn sie es nicht tun. Es gibt viele Anwendungen, die Sie herunterladen und auf einem Mac ausführen, dann kopieren und unter Windows ausführen und möglicherweise sogar erneut kopieren und unter Linux ohne Probleme ausführen können. Wie ist das möglich?
Habe ich bis jetzt gelegen?
Wie sich herausstellt, gibt es eine Kategorie von Software, die auf der Oberfläche so aussieht, als würde sie einfach "überall laufen". Sie können es herunterladen und auf jedem ausführen unterstützte Plattform - das Schlüsselwort lautet "unterstützt". Tatsächlich laden Sie den Quellcode für die Anwendung herunter, während eine andere Anwendung (das Dolmetscher) führt den Quellcode direkt in Echtzeit aus. Dies ist eine gewisse Vereinfachung. Schauen wir uns also genau an, wie dies mit einigen Sprachen funktioniert.
Java
Als Java zum ersten Mal veröffentlicht wurde, war das Versprechen (buchstäblich) "einmal schreiben, überall ausführen". Die Idee war zu schaffen Anwendungen mithilfe von Java-Funktionen zum Speichern von Dateien, Berechnen oder Erstellen einer Anwendung Fenster. Dann ein Java Runtime Enviornment (JRE) Für jede unterstützte Computerplattform würde der Code ausgeführt und in native Betriebssystemfunktionen übersetzt. Der Trick für Java besteht also darin, dass es nicht "direkt" auf dem Betriebssystem ausgeführt wird. Es läuft in einem Teil der JRE namens das Java virtuelle Maschine und das läuft auf dem Betriebssystem.
Durch Einfügen dieser zusätzlichen Softwareschicht zwischen der Anwendung und dem Betriebssystem können Sie sich in Java auf eine Reihe von Funktionen konzentrieren, die für alle Betriebssysteme gleich sind. Sie teilen Java mit, was Sie tun möchten, und lassen die JVM für Ihr System sich Gedanken darüber machen, wie es tatsächlich ausgeführt werden soll. Das folgende Bild zeigt dies in Aktion, wo Java Desktop Application Framework von JIDE Software Zeigt dieselbe Anwendung für Mac (oben), Windows (Mitte links), "reines Java" (Mitte rechts) und Linux (unten) an.
Java-Programme "kompilieren" sich nicht genau in Echtzeit. Der Java-Compiler rendert sie vielmehr in "Bytecode". Sie können sich 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 werden soll. Wenn Sie es tatsächlich starten, wird die JVM es "den Rest des Weges backen", um es an die Funktionen des Host-Betriebssystems anzupassen.
Python
Eine beliebte interpretierte Sprache ist Python 5 Gründe, warum Python-Programmierung nicht nutzlos istPython - Du liebst es entweder oder du hasst es. Sie können sogar wie ein Pendel von einem Ende zum anderen schwingen. Unabhängig davon ist Python eine Sprache, bei der es schwierig ist, ambivalent zu sein. 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 beim ersten Ausführen zu Bytecode kompiliert. Dann weiß der Interpreter, ob sich der ursprüngliche Code bei nachfolgenden Läufen geändert hat, und kompiliert ihn zu diesem Zeitpunkt erneut in neuen Bytecode.
Ein cooles Nebenprodukt dieser On-Demand-Ausführung ist, dass Sie den Interpreter verwenden können, um Ihre Skripte interaktiv zu entwickeln. Durch einfaches Eingeben von "python" in die Befehlszeile starten Sie den Interpreter. Sie können Code ausführen und die Ergebnisse sofort anzeigen.
Dies bedeutet, dass Entwickler herumspielen und Dinge „live“ optimieren können. Sobald eine Codezeile das tut, was sie will, kopieren Sie sie und fügen Sie sie ein eine Skriptdatei (die viel effizienter ist als der Zyklus „Code-Compile-Test“, den nicht interpretierte Sprachprogrammierer durchführen müssen).
Selbst wenn die Software dieselbe ist, ist dies wahrscheinlich nicht der Fall
Unglücklicherweise für die Benutzer hat die Tech-Industrie kein wirklich "universelles" Format entwickelt. Und das kann es niemals tun. Die Einführung dieser Art von Standards führt häufig zu einer Lösung mit dem kleinsten gemeinsamen Nenner und Zugeständnissen im Interesse der Zustimmung aller.
Was denkst du? Möchten Sie lieber eine universell kompatible Software haben, auch wenn dies bedeutet, dass sie nicht so gut ist? Oder sind Sie mit dem verwendeten Betriebssystem einverstanden und haben kein Interesse an den Apps anderer Plattformen? Lass es uns unten in den Kommentaren wissen!
Bildnachweis: Masterchief_Productions / Shutterstock
Aaron ist seit fünfzehn Jahren als Business Analyst und Projektmanager in der Technologie tätig und seit fast ebenso langer Zeit ein treuer Ubuntu-Benutzer (seit dem Breezy Badger). Seine Interessen umfassen Open Source, Anwendungen für kleine Unternehmen, die Integration von Linux und Android sowie das Rechnen im Nur-Text-Modus.