12 Stimmen

Warum werden DLLs erstellt, anstatt alles zu einer großen ausführbaren Datei zu kompilieren?

Ich habe selbst eine Menge gesehen und getan klein Produkte, bei denen ein und dasselbe Stück Software in eine ausführbare Datei und mehrere DLLs aufgeteilt ist, und diese DLLs sind nicht nur gemeinsam genutzte Bibliotheken, die von jemand anderem erstellt wurden, sondern Bibliotheken, die ausschließlich für diese Software von demselben Entwicklerteam erstellt wurden. (Ich spreche hier nicht von großen Produkten, die Hunderte von DLLs benötigen und sie in großem Umfang mit anderen Produkten gemeinsam nutzen).

Ich verstehe, dass die Aufteilung des Codes in mehrere Teile, von denen jeder in eine separate DLL kompiliert wird, gut ist aus der Sicht eines Entwicklers . Das bedeutet, dass:

  • Wenn ein Entwickler ein Projekt ändert, muss er nur dieses und die abhängigen Projekte neu kompilieren, was sehr viel schneller geht.
  • Ein Projekt kann von einem einzelnen Entwickler in einem Team durchgeführt werden, während andere Entwickler lediglich die bereitgestellten Schnittstellen nutzen, ohne in den Code einzugreifen.
  • Automatische Software-Updates können manchmal schneller sein und haben geringere Auswirkungen auf den Server.

Aber was ist mit dem Endverbraucher? Ist es nicht einfach schlecht, ein Stück Software auszuliefern, das aus einer EXE und mehreren DLLs besteht, wenn alles in einer Gruppe zusammengefasst werden könnte? Immerhin:

  • Der Benutzer versteht vielleicht nicht einmal, was diese Dateien sind und warum sie den Speicherplatz auf seiner Festplatte füllen,
  • Möglicherweise möchte der Benutzer ein Programm verschieben, z. B. auf einem USB-Stick speichern. Eine einzige große ausführbare Datei macht die Sache einfacher,
  • Die meisten Antivirenprogramme prüfen jede DLL. Die Überprüfung einer ausführbaren Datei ist viel schneller als die einer kleineren ausführbaren Datei und Dutzender von Bibliotheken.
  • Die Verwendung von DLLs macht einige Dinge langsamer (zum Beispiel muss in .NET Framework eine "gute" Bibliothek gefunden und geprüft werden, ob sie signiert ist),
  • Was passiert, wenn eine DLL entfernt oder durch eine schlechte Version ersetzt wird? Wird das von jedem Programm so gehandhabt? Oder stürzt es ab, ohne überhaupt zu erklären, was falsch ist?
  • Eine einzige große ausführbare Datei hat einige andere Vorteile .

Así que Ist es aus Sicht der Endbenutzer nicht besser, für kleine/mittelgroße Programme eine große ausführbare Datei bereitzustellen? Wenn ja, warum gibt es keine Werkzeuge, mit denen sich dies leicht bewerkstelligen lässt (z. B. ein in gängige IDEs integriertes magisches Werkzeug, das die gesamte Lösung in eine einzige ausführbare Datei kompiliert, natürlich nicht jedes Mal, sondern bei Bedarf oder während der Bereitstellung).


Dies ist in gewisser Weise vergleichbar mit alle CSS- oder JavaScript-Dateien in eine große Datei zu packen für den Benutzer. Mehrere Dateien zu haben, ist für den Entwickler viel schlauer und einfacher zu pflegen, aber jede Seite einer Website mit zwei Dateien statt mit Dutzenden zu verknüpfen, optimiert die Leistung. Auf dieselbe Weise, CSS-Sprites sind schrecklich für die Designer, weil sie viel mehr Arbeit erfordern, aber aus Sicht der Benutzer sind sie besser.

9voto

peterchen Punkte 39679

Es ist ein Kompromiss
(Das haben Sie schon selbst herausgefunden ;))
Bei den meisten Projekten ist es dem Kunden nicht wichtig, wie viele Dateien installiert werden, sondern wie viele Funktionen rechtzeitig fertiggestellt werden. Wenn man den Entwicklern das Leben leichter macht, profitiert auch der Benutzer davon.

Einige weitere Gründe für DLL's

Einige Bibliotheken spielen in einem Build nicht gut zusammen, können aber in einer DLL entsprechend angepasst werden (z. B. kann eine DLL WTL3 verwenden, die andere benötigt WTL8).

Einige der DLLs können Komponenten enthalten, die in andere ausführbare Dateien geladen werden (globale Hooks, Shell-Erweiterungen, Browser-Addons).

Einige der DLLs sind möglicherweise von Drittanbietern und nur als DLL verfügbar.

Es kann eine Wiederverwendung innerhalb des Unternehmens geben - selbst wenn Sie nur ein "öffentliches" Produkt sehen, könnte es in einem Dutzend interner Projekte verwendet werden, die diese DLL nutzen.

Einige der DLLs könnten mit einer anderen Umgebung erstellt worden sein, die nicht für alle Entwickler im Unternehmen verfügbar ist.

Eigenständige EXE vs. Installiertes Produkt
Viele Produkte funktionieren ohnehin nicht als eigenständige ausführbare Datei. Sie müssen installiert werden, und der Benutzer darf nichts anfassen, was er nicht anfassen soll. Eine oder mehrere Binärdateien zu haben, spielt keine Rolle.

Auswirkungen der Bauzeit
Vielleicht unterschätzen Sie die Auswirkungen von Build-Zeiten und die Aufrechterhaltung eines stabilen Builds für große Projekte. Wenn ein Build auch nur 5 Minuten dauert, könnte man das ephemistisch als "die Entwickler dazu bringen, vorauszudenken, anstatt so lange zu basteln, bis es gut zu funktionieren scheint" bezeichnen. Aber es ist ein ernsthafter Zeitfresser und eine ernsthafte Ablenkung.

Die Bauzeit für ein einzelnes Projekt ist schwer zu verbessern. Bei der Arbeit an VC9 ist die Parallelisierung des Builds innerhalb eines Projekts wackelig, ebenso wie der inkrementelle Linker. Link-Zeiten lassen sich besonders schwer durch schnellere Maschinen "wegoptimieren".

Unabhängigkeit der Entwickler
Eine weitere Sache, die Sie vielleicht unterschätzen.
Um eine DLL zu verwenden, benötigen Sie eine .dll und eine .h. Um Quellcode zu kompilieren und zu verknüpfen, müssen Sie normalerweise Include-Verzeichnisse und Ausgabeverzeichnisse einrichten, Bibliotheken von Drittanbietern installieren usw. Das ist wirklich eine Qual.

1voto

Ja, das ist IMHO besser - und ich verwende aus genau den von Ihnen genannten Gründen immer statische Verlinkungen, wo immer es möglich ist. Viele der Gründe, aus denen die dynamische Verknüpfung erfunden wurde (z.B. um Speicher zu sparen), gelten nicht mehr wirklich. Es gibt aber auch architektonische Gründe, z.B. Plugin-Architekturen, warum dynamisches Linken dem statischen vorgezogen werden kann.

0voto

djna Punkte 53789

Ich denke, dass Ihr allgemeiner Punkt, die endgültige Verpackung der Ergebnisse sorgfältig zu erwägen, gut gemacht ist. Im Falle von JavaScript ist eine solche Verpackung in der Tat möglich, und die Komprimierung macht einen erheblichen Unterschied.

0voto

Ralf de Kleine Punkte 11038

Ich habe viele Projekte durchgeführt und noch nie einen Endbenutzer getroffen, der Probleme mit einigen dll-Dateien auf seinem Rechner hatte.

Als Entwickler würde ich sagen: Ja, es könnte eine Rolle spielen. Als Endbenutzer, der sich darum kümmert...

0voto

Dan Puzey Punkte 32863

Ja, aus der Sicht des Endnutzers mag das oft besser sein. Die von Ihnen erwähnten Vorteile für den Entwickler (und den Entwicklungsprozess) bedeuten jedoch oft, dass ein Unternehmen die kosteneffiziente Option vorziehen wird.

Es ist eine Funktion, die zu wenige Nutzer zu schätzen wissen werden und deren Bereitstellung nicht unerhebliche Kosten verursacht.

Denken Sie daran, dass wir auf StackOverflow "überdurchschnittliche" Benutzer sind. Wie viele (nicht-geekige) Familienmitglieder und Freunde haben Sie, die まったくもって legen Wert auf die Möglichkeit, ihre Software auf einem USB-Stick zu installieren?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X