Pergunta

Existem boas maneiras de fazer pequenas executáveis ??Haskell? Com ghc6 um programa Olá mundo simples parece chegar a cerca de 370KB (523kB antes de faixa). Olá, mundo em C é de cerca de 4kB (9kB antes de faixa).

Foi útil?

Solução

Com o ramo de desenvolvimento de GHC (ninguém sabe exatamente qual versão esta foi adicionado em?):

$ 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

Adicionar a bandeira -dynamic por RTS ligadas 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

Veja também: http://hackage.haskell.org/trac/ghc / wiki / SharedLibraries / PlatformSupport

Para efeito de comparação com 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

Outras dicas

GHC está vinculado estaticamente tudo (exceto bibliotecas usadas por si só runtime, que estão ligadas dinamicamente).

Nos velhos tempos, GHC ligada toda a biblioteca (Haskell), logo que você tem algo usado a partir dele. Algum tempo atrás, GHC começou a link "por obj arquivo", o que reduziu drasticamente o tamanho do binário. A julgar pelo tamanho, você devia estar usando a mais recente GHC já.

No lado positivo, você já tem um monte de coisas naqueles 500K, como núcleo de vários segmentos, coletor de lixo etc.

Adicionar pelo menos coletor de lixo para o código C, em seguida, compará-los novamente:)

O tamanho que você está vendo é o tempo de execução Haskell (libHSrts.a), que é ligado estaticamente em cada executável Haskell. Se fosse um objeto compartilhado, como librt.o para C, o seu binário seria apenas uma k poucos (o tamanho do arquivo de uma divisão .o na fonte de biblioteca).

curta de implementar dinâmica ligando de libHSrts.a em sua plataforma, você pode fazer seus executáveis ??menor via tira.

Se o tamanho do seu binário realmente importa, você pode usar a ferramenta gzexe que os pacotes de um (de preferência já despojado) executáveis ??com a compressão gzip. Na minha caixa de Linux de 64 bits, o original Olá mundo programa leva 552 KB, após a remoção 393 KB, e após a remoção e gzipping 125 KB. O lado mais escuro da gzipping é no desempenho -. O executável tem de ser desembalado primeira

Você deve contar suas bênçãos (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$ 

Falando sério, enquanto você provavelmente pode sacudir binários Haskell um pouco, não é realmente uma comparação justa com C. Há uma mais acontecendo lá.

A última vez que jogou com GHC (e isso pode estar desatualizado) foi estaticamente vinculando tudo, o que será um fator.

As coisas estão mudando - manter um olho em esta peça em curso de trabalho.

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

Também tente olhar para ldd-dr your_executable

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top