Pregunta

¿Hay buenas maneras de hacer pequeños ejecutables Haskell? Con ghc6 un simple programa hola mundo parece llegar a cerca de 370kb (523KB antes de tira). Hola mundo en C es de aproximadamente 4kB (9kB antes de tira).

¿Fue útil?

Solución

Con la rama de desarrollo de GHC (Alguien sabe exactamente qué versión esto se añadió en?):

$ 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

Añadir la bandera -dynamic durante RTS vinculados en forma dinámica:

$ 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

Vea también: http://hackage.haskell.org/trac/ghc / wiki / SharedLibraries / PlatformSupport

Para la comparación con 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

Otros consejos

GHC es la vinculación estática todo (excepto librerías utilizadas por el tiempo de ejecución en sí, que están vinculados dinámicamente).

En los viejos tiempos, GHC vinculado a toda la biblioteca (Haskell) en cuanto se ha utilizado algo de él. Hace algún tiempo, GHC comenzó a vincular "por archivo obj", lo que reduce drásticamente el tamaño binario. A juzgar por el tamaño, que debe de haber estado usando el nuevo GHC ya.

En el lado positivo, ya tiene un montón de cosas en los 500K, como núcleo de multiproceso, recolector de basura, etc.

Añadir al menos recolector de basura para su código C, luego compararlas nuevo:)

El tamaño que se está viendo es el tiempo de ejecución de Haskell (libHSrts.a), que está vinculado estáticamente en cada ejecutable Haskell. Si se tratara de un objeto compartido, como librt.o para C, su binario sería sólo unos pocos k (el tamaño de archivo de una división .o en la fuente de la biblioteca).

A falta de implementación de la vinculación dinámica de libHSrts.a en su plataforma, que puede hacer que sus ejecutables más pequeños a través de la tira.

Si el tamaño de su binario que realmente importa, puede utilizar la herramienta gzexe que los paquetes de un archivo ejecutable (preferentemente ya pelado) con la compresión gzip. En mi máquina Linux de 64 bits, el original Hello World programa toma 552 KB, después de despojar 393 KB, y después de pelar y gzipping 125 KB. El lado más oscuro de gzipping es en el rendimiento -. El archivo ejecutable que se descomprimirá primera

Debe contar sus bendiciones (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$ 

En serio, mientras que es probable que pueda sacudir Haskell Binarios un poco, en realidad no es una comparación justa con C. Hay una más que hacer allí.

La última vez que jugué con GHC (y esto podría estar fuera de fecha) se vincula estáticamente todo, lo cual será un factor.

Las cosas están cambiando - mantener un ojo en esta pieza de trabajo en curso.

strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable

También intente buscar en LDD -dr your_executable

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top