Gibt es irgendwelche guten Möglichkeiten, kleine ausführbare Haskell-Dateien zu erstellen? Mit ghc6 scheint ein einfaches Hallo-Welt-Programm auf etwa 370kB (523kB vor dem Strip) zu kommen. Hallo Welt in C ist etwa 4kB (9kB vor dem Strip).Kleine Haskell-Executables erstellen?
Antwort
Mit dem Entwicklungszweig von GHC (jemand genau wissen, welche Version dieses in hinzugefügt wurde?):
$ ghc -o hello hello.hs
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello
$ du hello hello-small
700 hello
476 hello-small
für ein dynamisch gelinkt RTS die -Dynamic Flag hinzufügen : http://hackage.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport
Zum Vergleich mit C:
$ gcc hello.c -o hello
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello
$ du hello hello-small
12 hello
8 hello-small
Sie sollten Ihren Segen zählen (370KB Luuuxury?):
bash$ sbcl This is SBCL 1.0.24, an implementation of ANSI Common Lisp. * (sb-ext:save-lisp-and-die "my.core") [undoing binding stack and other enclosing state... done] [saving current Lisp image into ./my.core: ... done] bash$ du -sh my.core 25M my.core bash$
Aber im Ernst, während Sie wahrscheinlich Haskell eine Bit-Binärdateien schütteln kann, es ist wirklich kein fairer Vergleich mit C. Es gibt eine mehr los dort .
Das letzte Mal, als ich mit ghc gespielt habe (und das könnte veraltet sein), hat es statisch alles verlinkt, was ein Faktor sein wird.
GHC verbindet statisch alles (außer den von der Laufzeit selbst verwendeten Bibliotheken, die dynamisch verknüpft sind).
In den alten Zeiten hat GHC die gesamte (haskell) Bibliothek verknüpft, sobald Sie etwas davon verwendet haben. Vor einiger Zeit begann GHC, "per obj file" zu verknüpfen, was die Binärgröße drastisch reduzierte. Gemessen an der Größe müssen Sie den neueren GHC bereits verwendet haben.
Auf der positiven Seite, haben Sie bereits eine Menge Sachen in diesen 500K haben, wie multithreaded Kern, Garbage Collector usw.
zu Ihrem C-Code mindestens Garbage Collector hinzufügen, dann vergleichen sie wieder :)
Während es wahr ist, dass die Haskell-Binärdatei eine Menge Zeug enthält, die die C-Binärdatei nicht hat, ist es sinnlos, sie zu haben wird nicht verwendet ... –
@ liw.fi Wenn Sie sich Sorgen um die Größe Ihrer ausführbaren Dateien machen, ist C die einzige Sprache, die Ihnen gut genug ist. – Rayne
@ liw.fi Haskell ist fast per Definition über Garbage Collection, Multi-Core-Ausführung usw. So ist es in der Tat sinnlos _not_ all diese Sachen im Kern zu haben. Oder lassen Sie es aus (schöpfen Sie zusätzliche Anstrengungen in modularisierte Kern, die genau so tun könnten). Und wofür? Um 100 KB Binärgröße zu speichern? – ADEpt
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable
versuchen auch bei ldd suchen -dr your_executable
die Größe Sie sehen, ist die Haskell-Laufzeit (libHSrts.a), die statisch in jeder Haskell ausführbare verknüpft ist. Wenn es ein gemeinsames Objekt wäre, wie zB librt.o für C, wäre Ihre Binärdatei nur ein paar k (die Größe einer geteilten O-Datei in der Bibliotheksquelle).
Kurz vor der dynamischen Verknüpfung von libHSrts.a auf Ihrer Plattform implementieren, können Sie Ihre ausführbaren Dateien über Strip verkleinern.
Die Dinge ändern sich - behalten Sie ein Auge auf this laufende Arbeit.
Wenn die Größe Ihrer Binärdatei wirklich wichtig ist, können Sie das Tool gzexe verwenden, das eine (vorzugsweise bereits bereinigte) ausführbare Datei mit der gzip-Komprimierung packt. Auf meiner 64-Bit-Linux-Box dauert die ursprüngliche Hallo Welt Programm 552 KB, nach dem Strippen 393 KB, und nach dem Strippen und Gipping 125 KB. Die dunklere Seite von gzipping ist in der Leistung - die ausführbare Datei muss zuerst entpackt werden. auch
$ ghc -dynamic -o hello hello.hs
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello
$ du hello hello-small
24 hello
16 hello-small
See:
Ich wusste nichts davon! Das ist ein wirklich nützlicher Tipp, ich hatte eine ausführbare Datei mit 15 MB, die nach ** strip ** auf 7,3 MB runter ging, aber nach ** gzexe ** auf 1,5 MB! Ich habe ein anderes Tool ** [upx] (http://upx.sourceforge.net/) ** gefunden, das anstelle von ** gzexe ** die ausführbare Datei auf 1,2 MB heruntergesetzt hat. –
Verwenden Sie die dynamische Verknüpfung, wie hier beschrieben, http: // stackoverflow.com/questions/6115459/small-haskell-program-kompiliert-mit-ghc-in-huge-binary –