Warum werden Programme nicht im kompilierten Format verteilt?

32

Aber sie geben Anweisungen wie

cd downloaded_program
./configure
make install

Dadurch wird die benötigte ELF und möglicherweise einige .so-Dateien erstellt.

Warum nicht diese in einer Zip-Datei zum Download bereitstellen, wie bei Windows-Apps? Gibt es einen Grund, warum sie vom Benutzer kompiliert werden müssen?

Kätzchen
quelle
18
So wird der Quellcode verteilt. du hast das mit ubuntu getaggt - hast du das aptZeug ausprobiert ?
mikeserv
11
Ubuntu: Die 40.000 gängigsten Programme: $ sudo apt-get install [name]. Die seltenere Software: Einige müssen aus dem Quellcode mit {cmake .. && make, ./configure && make, waf, scons, etc. ~ 10 build options} erstellt werden.
Knud Larsen
6
Sie haben drei Windows © -Versionen und ~ 100 "Linux OS" -Versionen. Es ist unmöglich, mehr als die (40.000) gängigsten Programme zu warten und zu speichern.
Knud Larsen
35
Diese Frage ist einfach falsch. Die meiste Software wird im Binärformat vertrieben, normalerweise in .rpmoder .deboder .tgzPaketen. Die Quelle wird auch für diejenigen verteilt, die sie selbst kompilieren oder untersuchen oder modifizieren oder für eine oder mehrere Distributionen packen möchten. Niemand verwendet die .zipVerteilung von Binärdateien unter Linux, da ZIP-Dateien keine wesentlichen Informationen wie Benutzer, Gruppe und Berechtigungen für die enthaltenen Dateien unterstützen.
cas
2
Ich muss noch ein Linux-Programm kompilieren, das ich ausführen wollte. Ausführbare Dateien waren bisher immer verfügbar.
user2338816

Antworten:

34

Lassen Sie uns die Faktoren analysieren ...

Analyse :

ABHÄNGIGKEITEN NACH PLATTFORM : In einer Umgebung, in der Entwickler mehrere architekturspezifische Varianten einer Anwendung erstellen und verwalten, treten einige Probleme auf:

  • Unterschiedlicher Quellcode ist für unterschiedliche Varianten erforderlich - Verschiedene UNIX-basierte Betriebssysteme verwenden möglicherweise unterschiedliche Funktionen, um dieselbe Aufgabe zu implementieren (z. B. strchr (3) im Vergleich zu index (3)). Ebenso kann es erforderlich sein, unterschiedliche Header-Dateien für unterschiedliche Varianten einzuschließen (z. B. string.h vs. strings.h).

  • Für verschiedene Varianten sind unterschiedliche Erstellungsverfahren erforderlich - Die Erstellungsverfahren für verschiedene Plattformen variieren. Zu den Unterschieden können Angaben wie Compiler-Speicherorte, Compiler-Optionen und Bibliotheken gehören.

  • Builds für verschiedene Varianten müssen getrennt aufbewahrt werden - Da es einen einzigen Quellbaum gibt, muss sichergestellt werden, dass Objektmodule und ausführbare Dateien für eine Architektur nicht mit denen für andere Architekturen verwechselt werden. Beispielsweise darf der Link-Editor nicht versuchen, eine ausführbare IRIX-5-Datei mit einem Objektmodul zu erstellen, das für SunOS-4 erstellt wurde.

  • Jedes Betriebssystem verfügt über ein eigenes Verknüpfungsverwaltungsschema und muss die ELF-Datei (Executable and Linking Format) nach Bedarf vorbereiten.

  • Der Compiler generiert einen Build, der aus einer Folge von Anweisungen besteht. Unterschiedliche Architekturen bedeuten unterschiedliche Anweisungssätze ( Vergleich der Anweisungssatzarchitekturen ). Daher ist die Ausgabe des Compilers für jede Architektur unterschiedlich (z. B. x86, x86-64, ARM, ARM64, IBM Power ISA, PowerPC, 6800 von Motorola, MOS T 6502 und so viele andere ).

SICHERHEIT :

  • Wenn Sie eine Binärdatei herunterladen, können Sie nicht sicher sein, ob sie das tut, was sie verspricht, aber Sie können versuchen, den Quellcode zu prüfen und eine selbst kompilierte Binärdatei in Ihrem System zu verwenden. Trotzdem hat der Benutzer Techmag in seinem Kommentar einen guten Punkt gemacht. Die Prüfung des Codes erfordert sachkundige und kompetente Codierer, um den Code zu bewerten, und ist keine Sicherheitsgarantie.

MARKT : In diesem Abschnitt gibt es viele Faktoren, aber ich werde versuchen, es wieder aufzunehmen:

  • Nicht jedes Unternehmen strebt an, alle Plattformen zu erreichen. Es hängt vom Markt und der Popularität der Plattformen ab und davon, was sie verkaufen möchten.

  • Freie Software hat den Geist, Software so weit wie möglich verfügbar zu machen. Dies bedeutet jedoch nicht, dass die Software für jede Plattform entwickelt wurde, sondern dass dies von der Community abhängt, die sie unterstützt.

Fazit :

Nicht jede Software ist für jede Plattform ausgelegt. Wenn Sie Binärdateien für alle Architekturen und Plattformen bereitstellen, müssen Sie diese kompilieren, testen und für alle Plattformen warten. Das ist mehr Arbeit, die manchmal einfach zu teuer ist und vermieden werden kann, wenn der Benutzer sie auf seiner eigenen Plattform kompiliert. Außerdem weiß der Benutzer, was er ausführt.

Facundo Victor
quelle
1
Ich denke, diese Antwort könnte verbessert werden, wenn man die Unterschiede zwischen den Prozessormodellen etwas genauer betrachtet - und wie vor ~ 10 Jahren jede Unix-Variante im Grunde genommen ihre eigene hatte. Linux war nicht der allgegenwärtige Einfluss, den es heute hat.
Sobrique
@Sobrique: Oder Sie erwähnen sogar die Unterschiede zwischen den Prozessormodellen an sich - vor 10 Jahren gab es mehr als die beiden Typen, die wir heute haben, und Linux lief auf fast allen (ich selbst habe Linux auf PowerPC ausgeführt). Mit x86, AMD64 (auch als x86-64 bekannt) und ARM ist es heute noch teilweise relevant. MIPS ist auch heute noch sehr beliebt bei Menschen, die ihre eigenen Chips herstellen können, da es mittlerweile völlig patentfrei ist.
Slebetman
Entschuldigung für die Verspätung! Danke euch beiden! Ich habe einige Referenzen zu CPU-Architekturen hinzugefügt und einen Link zu einer Vergleichsliste hinzugefügt. Ich möchte nicht, dass die Antwort so groß ist. Aber ja, es ist sehr relevant!
Facundo Victor
1
Der Sicherheitskommentar impliziert, dass der Leser / Installateur den Code lesen und verstehen kann. Angesichts der Tatsache, dass die Shellshock-Sicherheitsanfälligkeit Jahrzehnte überlebt hat, ohne bemerkt zu werden, würde ich respektvoll vorschlagen, dass dies eine etwas falsche Annahme ist. Es erlaubt sachkundigen und kompetenten Programmierern, den Code zu bewerten, aber es ist nicht so sehr eine wirkliche Sicherheitsabschreckung wie beworben. Es könnte tatsächlich den gegenteiligen Effekt haben. Von staatlicher und organisierter Kriminalität finanzierte Hacker dürften in diesen Tagen Code für alle Open-Source-Bibliotheken / -Projekte beisteuern, in der Hoffnung, die nächste Shellshock-Eröffnung
einzuleiten
Sie haben Recht! Ich habe die Antwort dahingehend geändert. Ich habe versucht, den Fokus auf das Hauptziel der Antwort nicht zu verlieren. Danke Techmag!
Facundo Victor
10

Es gibt eine solche Vielzahl von Plattformen und Softwareumgebungen, sowohl für * nix als auch für andere , auf denen die Software möglicherweise ausgeführt werden kann. Daher ist die Erstellung einer Anwendung (oder einer Bibliothek zur Verwendung mit Anwendungen) die einzig realistische Möglichkeit, as zu unterstützen viele kombinationen dieser komponenten wie eine "gute" software macht das. Lizenzen wie die GPL setzen natürlich voraus, dass der Quellcode verfügbar ist. Selbst wenn die Software nicht ordnungsgemäß funktioniert, ist dies in der Regel für den Benutzer möglich (obwohl es möglicherweise schwierig ist, zu verstehen, was falsch ist und wie dies behoben werden kann) oder eine dritte Partei , die eintaucht und korrigiert, auch wenn der Ersteller nicht / nicht / nicht mehr existiert, um dies zu tun.

Das Verteilen von Software als Quellcode ermöglicht auch die unabhängige Überprüfung, ob die Software das tut, was sie behauptet, und nicht stattdessen oder auch etwas Böses tut - was das Vertrauen, das man in den Schöpfer haben muss, trotz der Verringerung tatsächlich stärkt!

SlySven
quelle
8

Erstens basiert Ihre Frage auf einer fehlerhaften Prämisse. Programme werden in kompiliertem Format verteilt!

Die normale Art, Software auf Ubuntu zu installieren, wie bei den meisten anderen Linux-Distributionen, und allgemeiner bei den meisten Unix-Varianten, ist die Installation eines Pakets. Unter Ubuntu öffnen Sie das Software Center oder einen anderen Paketmanager und durchsuchen die verfügbare Software. Wenn Sie ein Paket zur Installation auswählen, werden die Binärdateien (sofern das Paket ein Programm enthält) heruntergeladen und auf Ihrem Computer installiert.

Standardmäßig bietet der Paketmanager Ihnen Pakete an, die von den Verteilungsverwaltern erstellt wurden. Sie können auch Paketquellen von Drittanbietern finden. Ubuntu bietet PPA als standardisierte Möglichkeit für Dritte, Pakete anzubieten.

Das Herunterladen der Software vom Autor in kompilierter Form ist der letzte Ausweg. Sie müssen dies nur tun, wenn die Software nicht populär genug ist, um gepackt zu werden, oder wenn Sie unbedingt die neueste Version benötigen, die nicht gepackt wurde. Die meisten Menschen müssen das nie tun.

Wenn Software nicht für eine Distribution gepackt ist, wird sie häufig in Quellform und nicht in binärer Form verteilt. Es gibt zwei Hauptgründe, warum dies in der Linux-Welt häufig vorkommt, in der Windows-Welt jedoch selten. Ein Grund ist, dass der Anteil von Open Source-Programmen unter Linux viel höher ist. Wenn der Quellcode eines Programms nicht verfügbar ist, ist die einzige Form der Verteilung natürlich eine Binärdatei. Der andere Grund ist, dass die Linux-Welt viel vielfältiger ist. Für jeden Satz inkompatibler Bibliotheksversionen werden unterschiedliche Binärdateien benötigt, was häufig unterschiedliche Binärdateien für jede Version jeder Distribution bedeutet. Windows löst dieses Problem, indem jeder Paketautor die von ihm verwendeten Bibliotheken zusammen mit dem Programm verteilt (Konsequenz: Ihr Computer speichert viele Kopien jeder Bibliothek, eine pro Programm, das sie verwendet; wenn ein Fehler in einer Bibliothek behoben ist). Jedes Programm, das es verwendet, muss ein Update ausliefern und nur etwa alle drei Jahre eine neue Version des Betriebssystems veröffentlichen. Unix verfügt über eine viel größere Vielfalt und zeitnahere Fehlerbehebungsgewohnheiten und behebt die Probleme bei der Bibliotheksverteilung, indem verschiedene Binärdateien für verschiedene Distributionen erstellt werden.

Gilles 'SO - hör auf böse zu sein'
quelle
5

Linux läuft auf mehr als nur einer bestimmten CPU-Plattform. Wenn Sie ELF-Dateien (oder andere ausführbare Rohdateien) verteilt haben, besteht die Möglichkeit, dass einige Linux-Versionen die Software nicht ausführen können. Im Sinne einer möglichst breiten Verfügbarkeit von Software wird die Verwendung des Quellcodes bevorzugt. Zum Beispiel läuft Linux auf Sparc-, Intel-, AMD-, ARM- und anderen Prozessortypen.

Wenn die ELF-Datei beispielsweise speziell auf Intel-Prozessoren abzielte, konnte die Software auf anderen Hardwaretypen nicht ausgeführt werden. ELF ist plattformunabhängig, der darin enthaltene Code muss jedoch dem Maschinencode einer Plattform entsprechen. Sie werden feststellen, wie viele Distributionen über ähnliche Pakete verfügen (z. B. _386- und _586-Pakete, wenn sie verschiedene Prozessoren unterstützen) - Sie müssen die richtige ELF-Datei installieren, um den korrekten Betrieb zu erzielen.

Auch wenn ich mich entscheide, eine benutzerdefinierte Linux-Version zu erstellen, die verschiedene Interrupts, Linker usw. verwendet, benötige ich immer noch den Quellcode, um den Code zu kompilieren. Selbst wenn der Quellcode keine plattformspezifischen Build-Anweisungen enthält, ist jede Plattform anders und führt möglicherweise kein ELF auf einem anderen System aus.

Phyrfox
quelle
Genau aus diesem Grund würden Sie wahrscheinlich 32-Bit-Firefox ausführen, genau wie viele andere Programme auf einem 64-Bit-Windows-Betriebssystem, während 64-Bit-Linux normalerweise eine 64-Bit-Anwendung ausführt.
27.
5

Der ursprüngliche Grund für die Verbreitung als Quelle war sicherlich die Plattformvielfalt; Die Linux-Community hat diese Methodik sowohl aus diesem Grund als auch aus neuen, teilweise politischen Gründen fortgesetzt.

Anders als z. B. Windows hat sich Linux in der Vergangenheit nie darum gekümmert, eine ABI (Application Binary Interface) über lange Zeiträume hinweg stabil zu halten. Die Möglichkeit, Innovationen bei Aspekten wie ausführbaren Formaten, Bibliotheks-APIs und der Unterstützung neuer Hardwareplattformen vorzunehmen, wurde / wird mehr in Betracht gezogen wichtig.

Kommerzielle Betriebssysteme erreichen eine langfristige Anwendungskompatibilität, indem sie sehr innovativ sind. Ein neues Feature / Software-Interface muss immer zusätzlich zu einem alten hinzugefügt werden - zwei Dinge müssen gewartet werden, und der Preis für Änderungen nach der Veröffentlichung muss als sehr hoch angesehen werden. Alternativ können Sie die Tatsache der geplanten Veralterung von Anwendungen zusammen mit jedem, der Software für Ihr Betriebssystem schreibt, in Betracht ziehen (dies ist kein Hinweis auf MS, sondern auf einen anderen Betriebssystemhersteller).

Das Erreichen einer langfristig stabilen Plattform für Software, die nur in binärer Form (außerhalb einer bestimmten Linux-Distribution) vertrieben wird, wird von einigen Mitgliedern der Linux-Community sogar als unerwünscht angesehen. Als nicht entschuldigender Benutzer beider Plattformen sage ich nicht, dass das gut oder schlecht ist. es ist wie es ist.

Rackandboneman
quelle
4

In vielen Fällen (zumindest in der * nix-Welt) ist der Quellcode die portabelste Version der Software. Die Quelle garantiert, dass die gemeinsam genutzte Software auf jeder Plattform funktioniert, die sie möglicherweise unterstützen könnte (was in vielen Fällen einfach POSIX-konform bedeutet). Das Freigeben von Binärdateien garantiert nur die Kompatibilität mit Plattformen (sowohl Software als auch Hardware), für die diese Binärdateien freigegeben sind.

Beachten Sie, dass unter Windows Binärdateien die bequemste und portabelste Form für die gemeinsame Nutzung von Software sind. Da das Kompilieren von Quellcode nicht Teil des üblichen Windows-Softwareverteilungsmodells ist, hat Microsoft im Laufe der Jahre große Anstrengungen unternommen, um sicherzustellen, dass Binärdateien unter mehreren Betriebssystemversionen funktionieren: http://www.joelonsoftware.com/articles/APIWar.html

zje
quelle
5
Windows hängt auch von der zugrunde liegenden Architektur ab. ARM-fähige Windows-Apps können nicht auf normalen Laptops / Desktops usw. ausgeführt werden. Dies ist der Hauptgrund, warum Linux eine viel bessere Hardwareunterstützung bietet - denn Code ist so geschrieben, dass er auf jeder Plattform kompiliert werden kann, die eine vernünftige Linux-Implementierung aufweist, während Windows von bekannten Hardwaretypen abhängt.
Phyrfox
Wenn Sie Windows / x86 erstellen, decken Sie 95% der Binärkompatibilität ab. Das ist sehr gut. Während Linux / x86 immer verbreiteter wird, kamen wir aus einer Welt, in der es eine Vielzahl großer Namen mit einer eigenen speziellen Prozessorarchitektur und einer Unix-Variante gab - die nicht mit Binärdateien kompatibel waren.
Sobrique
@Sobrique Woher haben Sie diese 95% -Zahl? Als ich das letzte Mal nachgesehen habe, gab es 4 ARM-CPUs pro 1 x86. Dies war vor ein paar Jahren, bevor alle anfingen, Smartphones mit ARM-Prozessoren zu verwenden. Wenn wir also davon ausgehen, dass es keine anderen Prozessoren gibt, sind das 20%.
Strg-Alt-Delor
3

Die meiste Linux-Software ist freie Software. Wenn Sie den Quellcode mit Kompilierungsanweisungen anstelle von Binärdateien verteilen, haben Sie die Möglichkeit, den Quellcode vor dem Kompilieren zu überprüfen oder sogar zu bearbeiten. Auf diese Weise können Sie sehr sicher sein, was das Programm tatsächlich tut und dass es nicht schädlich ist.

Rapti
quelle
0

Der Hauptgrund, warum ich persönlich nicht gerne nur eine ausführbare Datei eines Programms erhalte, ist, dass ich zuerst überprüfen möchte, was der Quellcode tatsächlich tut (meistens, weil ich nur Spaß daran habe, mir den Code anderer anzuschauen), aber ich kenne mehrere andere die auch den Quellcode auf bösartigen Code überprüfen.

xempes
quelle
0

Viele Antworten haben gesagt , dass in den meisten Fällen, Software werden in kompilierter Form verteilt. Ich stimme dieser Annahme zu. Trotzdem sehe ich einen Fall, in dem es besser ist, eine Software nach Quelle zu verteilen, als sie in kompiliertem Format zu verteilen.

Ich bin mir nicht sicher, ob das stimmt, aber ich stelle mir vor, dass es am Anfang des Internets, da die Netzwerkbandbreite schlecht war, manchmal schneller sein könnte, eine Software nach Quelle zu verteilen, als in kompiliertem Format. Da es sich bei den Codequellen nur um reinen Text handelt, ist dieser häufig kleiner als die kompilierte Software. Das Verteilen einer Software mit Codequelle scheint daher eine bessere Möglichkeit zu sein, diese zu teilen, vorausgesetzt, die Benutzer können sie kompilieren.

Nairolf21
quelle
0

Abgesehen von der Tatsache, dass es viele Unix - Systeme gibt, die auf vielen verschiedenen Plattformen ausgeführt werden, müssen Sie nur die Probleme berücksichtigen, mit denen Windows - Software bei diesem Distributionsmodal konfrontiert ist, obwohl sie sich nur um eine Windows - Version und eine Plattform (den PC) kümmern müssen ).

Selbst wenn Sie sich nur um den PC kümmern müssen, gibt es immer noch zwei Architekturen: 32-Bit und 64-Bit. Wenn Sie bemerken, ignoriert die überwiegende Mehrheit der Windows-Software einfach 64-Bit-Software und liefert nur 32-Bit-Software aus. Wenn Sie über ein 64-Bit-System verfügen, haben Sie keine optimale Software. Dann gibt es Bibliotheken. Ein Softwarehersteller möchte nicht, dass Sie beim Ausführen seines Programms seltsame Fehler bekommen, wenn Sie nicht die richtige Bibliothek installiert haben. Daher fügen sie die Bibliothek nur ihrem Programm hinzu (wodurch der Download größer wird, auch wenn Sie diese Bibliothek bereits haben ). Ein zweites Programm macht dasselbe, aber mit einer anderen Version der Bibliothek. Im besten Fall enthält Programm B eine neuere Version der Bibliothek , die abwärtskompatibel ist, also wenn Sie Programm B installieren nachProgramm A, die Dinge funktionieren, aber wenn Sie sie in umgekehrter Reihenfolge installieren, bleibt die ältere Version der Bibliothek erhalten und Programm B bricht ab. Häufig nimmt der Bibliotheksanbieter jedoch Änderungen vor, die nicht abwärtskompatibel sind, und kümmert sich nicht darum, den Namen der Bibliothek zu ändern. Unabhängig davon, in welcher Reihenfolge Sie die beiden Programme installieren, führt die erste zum Absturz. Dies nennt man "dll Hölle".

Um dies zu vermeiden, haben die meisten Windows-Programme leider alle ihre Bibliotheken in einem eigenen Programmverzeichnis anstatt in einem freigegebenen Verzeichnis ausgeliefert, sodass jedes Programm alle seine eigenen privaten Bibliotheken hat und diese niemals miteinander teilen wird, wodurch das Ganze zunichte gemacht wird Punkt von DLLs in erster Linie und Sie landen mit viel mehr RAM und Speicherplatz und Zeit das Herunterladen aller doppelten Bibliotheken.

Aus diesem Grund wird Open Source-Software in Quellform veröffentlicht, und Betriebssystemanbieter haben Paketmanager entwickelt, die die Abhängigkeitsprobleme beheben und nur die vorkompilierten Binärdateien herunterladen, die Sie tatsächlich benötigen, ohne die Bibliotheken überall zu duplizieren. Dies betrifft auch die Tatsache, dass es viele verschiedene Unix-Systeme gibt, die auf vielen verschiedenen Plattformen ausgeführt werden.

Psusi
quelle