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)
Antworten:
Ein fetter binärer Ansatz ist am sinnvollsten, wenn:
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.
quelle
Die Logistik zur Verteilung des Internet-Alters wirkt sich auf zweierlei Weise negativ auf fette Binärdateien aus:
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.
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.
quelle
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
libc
oder von gebunden istlibstdc++
). 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).
quelle