Gibt es eine einfache Antwort: Warum ist GHC so groß?
- OCaml: 2 MB
- Python: 15 MB
- SBCL: 9 MB
- OpenJRE - 26 MB
- GHC: 113 MB
Nicht interessiert an der Evangelisation von "Warum sollte mir die Größe egal sein, wenn Haskell das richtige Werkzeug ist"; Dies ist eine technische Frage.
Antworten:
Es ist wirklich ein bisschen albern. Jede mit GHC gelieferte Bibliothek wird in nicht weniger als 4 Varianten angeboten :
Die GHCi-Version ist nur die statische Version, die in einer einzigen
.o
Datei miteinander verknüpft ist . Die anderen drei Versionen haben alle ihre eigenen Schnittstellendateien (.hi
Dateien). Die profilierten Versionen scheinen ungefähr doppelt so groß zu sein wie die unprofilierten Versionen (was ein bisschen verdächtig ist, ich sollte untersuchen, warum das so ist).Denken Sie daran, dass GHC selbst eine Bibliothek ist , sodass Sie 4 Kopien von GHC erhalten. Darüber hinaus ist die GHC-Binärdatei selbst statisch verknüpft, das sind also 5 Kopien von GHC.
Wir haben es kürzlich so gemacht, dass GHCi die statischen
.a
Dateien verwenden kann. Dadurch können wir einen dieser Geschmacksrichtungen loswerden. Längerfristig sollten wir GHC dynamisch verknüpfen, aber das ist eine größere Änderung, da dies bedeuten würde, dass die dynamische Verknüpfung zum Standard wird - anders als in C müssen Sie bei GHC im Voraus entscheiden, ob Sie dynamisch verknüpfen möchten oder nicht. Und wir brauchen weitere Änderungen (z. B. an Cabal und dem Paketsystem unter anderem), bevor dies wirklich praktisch ist.quelle
Wahrscheinlich sollten wir Äpfel mit Äpfeln und Orangen mit Orangen vergleichen. JRE ist eine Laufzeit, kein Entwickler-Kit. Wir können vergleichen: Quellgröße des Entwicklungskits, Größe des kompilierten Entwicklungskits und kompilierte Größe der minimalen Laufzeit.
Das OpenJDK 7-Quellpaket umfasst 82 MB (download.java.net/openjdk/jdk7) und das GHC 7-Quellpaket 23 MB (haskell.org/ghc/download_ghc_7_0_1). GHC ist hier nicht groß. Laufzeitgröße: openjdk-6-jre-headless unter Ubuntu ist 77 MB unkomprimiert gegenüber Haskell helloworld, statisch verknüpft mit seiner Laufzeit, die <1 MB ist. GHC ist hier nicht groß.
Wo GHC groß ist, ist die Größe des kompilierten Entwicklungskits:
GHC selbst benötigt 270 MB und mit allen Bibliotheken und Dienstprogrammen, die zusammenkommen, mehr als 500 MB. Und ja, es ist viel, selbst mit Basisbibliotheken und einem Build-Tool / Abhängigkeitsmanager. Die Java-Entwicklungsplattform ist kleiner.
GHC:
gegen OpenJDK mit Abhängigkeiten:
Aber es sind immer noch mehr als 100 MB, nicht 26 MB, während Sie schreiben.
Schwergewichtige Dinge in ghc6 und ghc6-prof sind:
Bitte beachten Sie, wie groß ist
libHSghc-6.12.1_p.a
. Die Antwort scheint also statische Verknüpfungs- und Profilversionen für jede Bibliothek da draußen zu sein.quelle
Meine Vermutung - viele, viele statische Verknüpfungen. Jede Bibliothek muss ihre Abhängigkeiten statisch verknüpfen, die wiederum ihre Abhängigkeiten statisch verknüpfen müssen. Und dies alles wird oft sowohl mit als auch ohne Profilerstellung kompiliert, und selbst ohne Profilerstellung werden die Binärdateien nicht entfernt und enthalten daher viele Debugger-Informationen.
quelle
Weil es gcc und eine Reihe von Bibliotheken bündelt , die alle statisch verknüpft sind.
Zumindest unter Windows.
quelle
Hier ist die Aufschlüsselung der Verzeichnisgröße auf meiner Box:
https://spreadsheets.google.com/ccc?key=0AveoXImmNnZ6dDlQeHY2MmxPcEYzYkpweEtDSS1fUlE&hl=de
Es sieht so aus, als ob das größte Verzeichnis (123 MB) die Binärdateien zum Kompilieren des Compilers selbst sind. Die Dokumente wiegen erstaunliche 65 MB. Der dritte Platz ist Cabal mit 41 MB.
Das bin-Verzeichnis ist 33 MB groß, und ich denke, dass nur eine Teilmenge davon technisch erforderlich ist, um Haskell-Anwendungen zu erstellen.
quelle
Die kurze Antwort lautet, dass alle ausführbaren Dateien statisch verknüpft sind, möglicherweise Debug-Informationen enthalten und Bibliotheken in mehreren Kopien enthalten sind. Dies wurde bereits von anderen Kommentatoren gesagt.
Dynamische Verknüpfungen sind möglich und reduzieren die Größe erheblich. Hier ist ein Beispiel
Hello.hs
:Ich baue mit GHC 7.4.2 unter Windows.
ghc --make -O2
gibtHello.exe
von 1105KsLaufen
strip
auf sie verlässt 630Kghc --make -O2 -dynamic
gibt 40KDas Abziehen lässt nur 13K.
Die Abhängigkeiten sind 5 DLLs mit einer Gesamtgröße von 9,2 MB (nicht entfernt) und 5,7 MB (nicht entfernt).
quelle