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).

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top