Fare piccoli eseguibili Haskell?
-
22-08-2019 - |
Domanda
Ci sono buoni modi per fare piccoli eseguibili Haskell? Con ghc6 un semplice programma ciao mondo sembra venire a circa 370KB (523KB prima di strip). Ciao mondo in C è di circa 4kB (9kB prima striscia).
Soluzione
Con il ramo di sviluppo di GHC (qualcuno sa esattamente quale versione questo è stato aggiunto?):
$ 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
Aggiungere la bandiera -Dynamic per un RTS collegati dinamicamente:
$ 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
Si veda anche: http://hackage.haskell.org/trac/ghc / wiki / SharedLibraries / PlatformSupport
Per fare un confronto con la 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
Altri suggerimenti
GHC è il collegamento staticamente tutto (tranne librerie usate da runtime per sé, che sono collegati in modo dinamico).
Ai vecchi tempi, GHC legata l'intera libreria (Haskell) nel più breve tempo avete usato qualcosa da esso. Qualche tempo fa, GHC ha iniziato a collegare "per file obj", che ha drasticamente ridotto le dimensioni binario. A giudicare dalle dimensioni, devi aver usato il più recente GHC già.
Sul lato positivo, si dispone già di un sacco di cose in coloro 500K, come nucleo multithread, garbage collector etc.
Aggiungere almeno garbage collector per il codice C, quindi confrontare di nuovo:)
La dimensione che stai vedendo è il runtime Haskell (libHSrts.a), che è staticamente legata in ogni eseguibile Haskell. Se si trattasse di un oggetto condiviso, come librt.o per il C, il tuo binario sarebbe solo pochi k (la dimensione del file di una scissione .o nella sorgente della libreria).
A corto di attuare il collegamento dinamico di libHSrts.a sulla vostra piattaforma, potete fare la vostra eseguibili più piccoli attraverso la striscia.
Se le dimensioni del vostro binario che conta davvero, è possibile utilizzare lo strumento gzexe che racchiude un file eseguibile (preferibilmente già messo a nudo) con la compressione gzip. Sulla mia macchina Linux a 64-bit, l'originale ciao mondo programma prende 552 KB, dopo la rimozione 393 KB, e dopo stripping e gzipping 125 KB. Il lato oscuro della gzip fosse è in termini di prestazioni -. L'eseguibile deve essere scompattato prima
Si dovrebbe contare le tue benedizioni (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$
Seriamente, però, mentre probabilmente si può scuotere Haskell i binari un po ', non è proprio un confronto equo con C. C'è un altro succedendo lì.
L'ultima volta che ho giocato con GHC (e questo potrebbe non essere aggiornato) è stato collegando staticamente tutto, che sarà un fattore.
Le cose stanno cambiando - mantenere un occhio su questo pezzo di lavoro permanente.
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable
anche provare a guardare LDD -dr your_executable