Warum werden „Fat Binaries“ nicht häufiger für plattformübergreifende Anwendungen verwendet?

27

Soweit ich weiß, werden sogenannte "fat binaries" - ausführbare Dateien, die Maschinencode für mehrere Systeme enthalten - nur auf Apple-PCs verwendet, und selbst dort scheinen sie nur verwendet zu werden, weil sie einen Übergang von benötigen PowerPC auf x86.

Heutzutage ist eine Menge Software plattformübergreifend, und es scheint, als wäre es in vielerlei Hinsicht einfacher, ein einziges Fat Binary zu erstellen, als ein Dutzend verschiedener Downloads für jede Kombination aus Betriebssystem und Architektur nachzuverfolgen an den Kunden, den sie wollen.

Ich kann viele Vermutungen anstellen, warum sich dieser Ansatz nie durchgesetzt hat, zum Beispiel:

  • Das Fehlen von Cross-Compilation-Tools macht Multi-OS-Binärdateien unmöglich
  • Sie müssen den Code ohnehin auf jedem Betriebssystem testen, damit Sie bereits Systeme haben, die für jedes Betriebssystem nativ kompiliert werden können
  • Anscheinend "funktionieren" 32-Bit-Programme bereits auf 64-Bit-Computern
  • Dynamische Verknüpfungen funktionieren auf jedem Betriebssystem anders, sodass eine "Fettbibliothek" möglicherweise nicht funktioniert, selbst wenn eine "Fettanwendung" dies tun würde

Aber da ich immer mit einer Bibliothek oder einem Framework arbeite, die bzw. das all diese betriebssystemspezifischen und architekturspezifischen Details vor mir verbirgt, weiß ich nicht, wie wahr dies wirklich ist oder ob es noch weitere Probleme gibt, die ich nicht kenne Über. Also, was sind die eigentlichen Gründe , warum Fett Binärdateien werden im Allgemeinen nicht verwendet , um Multi-Architektur und / oder Multi-OS - Software zu erstellen? (außerhalb von Apple)

Ixrec
quelle
5
Gibt es ein ernstes Problem, das dies lösen würde? Wenn ich zu der Download-Seite für wichtige plattformübergreifende Anwendungen gehe, erkennen diese automatisch das von mir verwendete Betriebssystem und weisen mich in die richtige Richtung. Linux-Benutzer haben Paketmanager. Mir scheint, alles, was dies tun würde, ist, die Download-Größen aufzublähen.
Doval
4
Ich weiß nicht viel über fat binaries, aber brauchen sie keine Unterstützung vom Betriebssystem (speziell vom Loader)? Dann sehe ich keinen besonderen Reiz für "Multi-OS-Software", da sich die Betriebssystemhersteller auf kein kompatibles Format einigen würden.
7
Weil wir Bytecode und virtuelle Maschinen haben, die dieses Problem besser lösen.
Robert Harvey
2
Ich frage mich, ob es überhaupt möglich ist, eine mehrsprachige ausführbare Datei zu erstellen, die sowohl unter Windows als auch unter einigen * NIX-Betriebssystemen funktioniert.
aaaaaaaaaaa
2
In der Vergangenheit stammen die Fat Binaries aus dem 68k -> PPC-Übergang, nicht aus dem PPC -> x86-Übergang.
Mark

Antworten:

9

Ein fetter binärer Ansatz ist am sinnvollsten, wenn:

  1. Beide Architekturen existieren auf demselben System
  2. Alles andere ist für alle Architekturen mehr oder weniger gleich

Aus diesem Grund werden sie nicht für plattformübergreifenden Code (beide Kriterien gelten nicht) oder zur Unterstützung verschiedener Linux-Distributionen mit einer Binärdatei verwendet (1. trifft nicht zu, 2. trifft bis zu einem gewissen Grad zu).

Unter Linux würden beide Kriterien weiterhin gelten, wenn Sie sowohl 32- als auch 64-Bit auf einer einzelnen Linux-Distribution unterstützen möchten . Aber warum sich die Mühe machen, wenn Sie bereits mehrere Distributionen unterstützen müssen?

Unter Windows erfolgte der Übergang von 16-Bit zu 32-Bit zunächst mit der Einführung von Windows NT, was in vielerlei Hinsicht eine erhebliche Abweichung von der 16-Bit-Windows-Welt darstellte (virtueller Speicher, Mehrbenutzerzugriffskontrolle, API-Änderungen ...). Bei all diesen Änderungen war es besser, die 32- und 16-Bit-Welten getrennt zu halten. NT hatte bereits das Konzept, dass "Subsysteme" verschiedene OS "Personae" (Win32, POSIX) unterstützen, so dass es eine einfache Wahl war, Win16 zu einem dritten Subsystem zu machen.

Die Umstellung von Win32 auf Win64 brachte keine größeren Änderungen mit sich, aber Microsoft verfolgte einen ähnlichen Ansatz, wahrscheinlich, weil er bewährt und erprobt war.

oefe
quelle
11

Die Logistik zur Verteilung des Internet-Alters wirkt sich auf zweierlei Weise negativ auf fette Binärdateien aus:

  1. Der Point of Sale beinhaltet keine physischen Waren und bevorzugt daher weniger SKUs, wie dies der Fall ist, wenn Produkte um Verkaufsregale konkurrieren und Kunden nur eingeschränkte Kaufmöglichkeiten haben.

  2. Die Kosten für die Bandbreite begünstigen die Bereitstellung nur der minimal erforderlichen Bits für ein bestimmtes Softwarepaket. Durch den Versand einer fetten Binärdatei wird sowohl das Kundenerlebnis als auch die Effizienz der Verkäuferinfrastruktur beeinträchtigt.

Fette Binärdateien ergaben mehr Sinn, als Software in physische Medien eingeschweißt war.

Ben Ruder
quelle
1
Bei Softwarebereitstellungen sind die Kosten für die Bandbreite heutzutage sowieso fast unerheblich. Wenn das Problem weiterhin besteht, warten Sie noch 5 Minuten.
Robert Harvey
2
@RobertHarvey, aber das sind 5 Minuten. Ich würde lieber nicht warten.
Arturo Torres Sánchez
2

Ein Grund, warum Fat Binaries nicht erfolgreich waren, ist, dass es mehr als die ABI- und Prozessorspezifikationen (tatsächlich Befehlssatzspezifikationen ) gibt, um eine ausführbare Binärdatei ungültig zu machen. Eine ausführbare Binärdatei hängt häufig von anderen Ressourcen ab, insbesondere von dynamischen Bibliotheken (siehe die DLL-Hölle ), externen Diensten (denken Sie an DBMS wie PostGreSQL ....), Systemkonfiguration (z. B. Speicherort von Konfigurationsdateien unter /etc/Linux) usw . etc....

Nur für Linux / x86-64 ist es in der Praxis schwierig, eine ausführbare Binärdatei für alle Linux-Distributionen lauffähig zu machen (da sie häufig an bestimmte Versionen von libcoder von gebunden ist libstdc++). FatELF existiert, ist aber nicht sehr erfolgreich.

Selbst mit einer genau definierten ABI und einem Befehlssatz wäre die Optimierung bei verschiedenen Prozessormarken unterschiedlich - siehe das -mtune=native x86-Optimierungsflag von GCC .

Apple ist es zum Teil nur deshalb gelungen, fette Binärdateien zu haben, weil sie ein sehr geschlossenes Ökosystem für Rechenressourcen darstellen.

Freie Software ist eine weitere Möglichkeit, Ihr Problem mit der Portabilität zu lösen: Handelt es sich bei einer Anwendung um freie Software (die aus Gründen der Portabilität sorgfältig codiert wurde), kann sie problemlos auf ähnliche Systeme portiert werden. Und selbst wenn der ursprüngliche Quellcode auf Ihrem System nicht wie vorgesehen funktioniert, können Sie ihn in der Regel recht einfach anpassen (oder jemanden dafür bezahlen) (natürlich ist kostenlose Software, die an ein bestimmtes Betriebssystem, eine bestimmte ABI oder einen bestimmten Prozessor gebunden ist, nicht einfach zu installieren) Hafen, Sie werden mehr Anstrengungen dafür bezahlen). Und auch Standards wie POSIX oder Linux Standard Base helfen.

Sie könnten jemanden dafür bezahlen (oder ihn bitten), eine (kostenlose) Software mit verfügbarem Quellcode zu portieren, aber es ist unrealistisch, eine ausführbare Binärdatei zu portieren.

Endlich gibt es verschiedene Frameworks, um die Portierung auf verschiedenen Betriebssystemen zu erleichtern (sofern Quellcode verfügbar ist), z . B. Qt & POCO .

Selbst die Verwendung eines genau festgelegten Bytecodes wie der JVM ist nicht immer eine Garantie für die Portabilität: Einige Java-Anwendungen sind bekanntermaßen nicht portierbar (z. B. weil sie eine bestimmte Dateihierarchie und Benennung erwarten).

Übrigens sind Computersysteme heute wahrscheinlich viel weniger heterogen als in den 1980er oder frühen 1990er Jahren (oder in der Mainframe-Ära).

Endlich sind fat binaries fett: Sie werden eine Menge Ressourcen (Erstellungszeit, Bandbreite, ausführbare Größe) für ein Portabilitätsproblem aufwenden, das möglicherweise nicht viele Menschen betrifft. Denken Sie an den Satz: "Es gibt keine tragbare Software, nur Software, die portiert wurde" (auf bestimmte Systeme).

Basile Starynkevitch
quelle
4
Ich bestreite die Auffassung, dass Software durch das "Freie" auch leicht zu transportieren ist.
Robert Harvey
3
Es macht Software nicht portierbar, aber es ermöglicht es jemandem, Anstrengungen zu unternehmen, um sie auf eine andere Plattform zu portieren (was Sie nicht realistisch tun können, wenn Sie keinen Zugriff und keine Berechtigung zum Ändern des Quellcodes haben)
Basile Starynkevitch
2
@RobertHarvey Im Prinzip mag es keine grundsätzliche Verbindung geben, aber es gibt mehrere völlig pragmatische Gründe, warum Freie Software sich über so viele Plattformen verbreitet und so viele plattformübergreifende Build-Tools und Toolketten erstellt hat.
itsbruce
Eine Closed-Source-Anwendung, die vollständig von Open-Source-Frameworks und portierbaren Bibliotheken abhängt, kann vom Eigentümer der Closed-Source-Anwendung leichter auf andere Plattformen portiert werden. Ich sage dies aus meiner Erfahrung mit Glückseligkeit, nachdem ich herausgefunden habe, dass "Codierung nach OpenCV-Stil" alles ist, was Sie brauchen (für die Bildverarbeitung). Natürlich erfordert die GUI noch andere Frameworks wie Qt usw. (obwohl ich keine Erfahrung aus erster Hand damit habe).
rwong
4
@RobertHarvey Das tut es nicht. Freie Software , die ein absolutes Chaos zum Hafen ist es immer noch ein absolutes Chaos in den Hafen - man muss nur die Oberfläche erhöhen , in dem Sie könnte jemand fangen , dass Sorgen über sie auf eine bestimmte Architektur oder OS genug , um Port es, oder schlagen einen Weg, der Macht Portieren Sie etwas, das die Leute nicht zum Bluten bringt.
Tim Post