Fazer pequenas executáveis ??Haskell?
-
22-08-2019 - |
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).
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