Machen kleine Haskell Executables?
-
22-08-2019 - |
Frage
Gibt es gute Möglichkeiten, kleine Haskell ausführbare Dateien zu machen? Mit ghc6 ein einfaches Hallo Welt Programm scheint über 370KB (523KB vor Streifen) zu kommen. Hallo Welt in C etwa 4 kB (9kB vor Streifen).
Lösung
Mit dem Entwicklungszweig von GHC (jemand genau wissen, welche Version dies wurde in?):
$ 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
In die -Dynamic Flag für eine dynamisch verknüpfte RTS:
$ 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
Siehe auch: 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
Andere Tipps
GHC ist statisch Verknüpfung alles (außer von Laufzeit verwendeten Bibliotheken selbst, die dynamisch verknüpft ist).
In den alten Zeiten, verbunden GHC die ganze (Haskell) Bibliothek in, sobald Sie etwas von ihm benutzt habe. Vor einiger Zeit begann GHC „pro OBJ-Datei“ zu verknüpfen, die drastisch die binäre Größe reduziert. Geht man von der Größe must've, haben Sie bereits die neuere GHC im Einsatz.
Auf der positiven Seite, haben Sie bereits eine Menge Sachen haben in diesen 500K, wie multithreaded Kern, Garbage Collector etc.
Fügen Sie mindestens Garbage Collector zu Ihrem C-Code, dann vergleichen sie wieder:)
Die Größe Sie sehen, ist die Haskell-Laufzeit (libHSrts.a), die statisch in jeder Haskell ausführbare verknüpft ist. Wenn es dich um ein gemeinsam genutztes Objekt ist, wie librt.o für C, die Binärdatei würde nur wenig k (die Größe eines geteilten .o-Datei in der Bibliothek Quelle) sein.
Kurz die Umsetzung dynamische Verknüpfung von libHSrts.a auf Ihrer Plattform, können Sie Ihre ausführbaren Dateien kleiner über Streife machen.
Wenn die Größe Ihres binären wirklich wichtig ist, können Sie das Tool verwenden gzexe , die eine (vorzugsweise bereits abgezogen) ausführbare Datei mit der gzip-Komprimierung packt. Auf meiner 64-Bit-Linux-Box, die ursprüngliche Hallo Welt Programm dauert 552 KB, nach dem Strippen 393 KB, und nach dem Strippen und Gzipping 125 KB. Die dunkle Seite der Gzipping in der Leistung -. Die ausführbare Datei erst entpackt werden muss
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 schütteln können Haskell ein Bit-Binärdateien, es ist wirklich kein fairer Vergleich mit C. Es gibt ein mehr los dort.
ich das letzte Mal mit ghc gespielt (und dies nicht mehr aktuell sein könnte) statisch wurde verbindet alles, was ein Faktor sein wird.
Die Dinge ändern sich - ein Auge auf dieses laufende Stück Arbeit.
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable
versuchen, auch bei ldd suchen -Dr your_executable