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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top