Existe uma resposta simples: por que o GHC é tão grande?
- OCaml: 2MB
- Python: 15MB
- SBCL: 9MB
- OpenJRE - 26MB
- GHC: 113MB
Não estou interessado no evangelismo de "Por que eu não deveria me importar com o tamanho, se Haskell é a ferramenta certa"; Esta é uma questão técnica.
Respostas:
É um pouco bobo realmente. Cada biblioteca que acompanha o GHC é fornecida em nada menos que 4 tipos :
A versão do GHCi é apenas a versão estática vinculada em um único
.o
arquivo. As outras três versões também possuem seu próprio conjunto de arquivos de interface (.hi
arquivos). As versões com perfil parecem ter aproximadamente o dobro do tamanho das versões sem perfil (o que é um pouco suspeito, eu deveria examinar o motivo).Lembre-se de que o próprio GHC é uma biblioteca , então você está recebendo 4 cópias do GHC. Não apenas isso, mas o próprio binário do GHC está estaticamente vinculado, então são 5 cópias do GHC.
Recentemente, fizemos para que o GHCi pudesse usar os
.a
arquivos estáticos . Isso nos permitirá livrar-se de um desses sabores. A longo prazo, devemos vincular dinamicamente o GHC, mas essa é uma mudança maior, porque isso implicaria em tornar o vínculo dinâmico o padrão - ao contrário de C, com o GHC, você precisa decidir antecipadamente se deseja vincular dinamicamente ou não. E precisamos de mais mudanças (por exemplo, no Cabal e no sistema de pacotes, entre outras coisas) antes que isso seja realmente prático.fonte
Provavelmente devemos comparar maçãs com maçãs e laranjas com laranjas. O JRE é um tempo de execução, não um kit de desenvolvedor. Podemos comparar: tamanho da fonte do kit de desenvolvimento, o tamanho do kit de desenvolvimento compilado e o tamanho compilado do tempo de execução mínimo.
O pacote configurável de origem do OpenJDK 7 tem 82 MB (download.java.net/openjdk/jdk7) versus o pacote configurável de origem GHC 7, que possui 23 MB (haskell.org/ghc/download_ghc_7_0_1). O GHC não é grande aqui. Tamanho do tempo de execução: openjdk-6-jre-headless no Ubuntu tem 77 MB descompactado vs Haskell helloworld, vinculado estaticamente ao tempo de execução, que é <1 MB. O GHC não é grande aqui.
Onde o GHC é grande, é o tamanho do kit de desenvolvimento compilado:
O próprio GHC ocupa 270 MB e, com todas as bibliotecas e utilitários que se reúnem, ocupa mais de 500 MB. E sim, é muito, mesmo com bibliotecas de base e um gerenciador de ferramentas / dependências de construção. A plataforma de desenvolvimento Java é menor.
GHC:
contra o OpenJDK com dependências:
Mas ainda tem mais de 100 MB, e não 26 MB enquanto você escreve.
Os itens pesados em ghc6 e ghc6-prof são:
Por favor, note o quão grande é
libHSghc-6.12.1_p.a
. Portanto, a resposta parece ser a versão estática de links e perfis para todas as bibliotecas existentes.fonte
Meu palpite - muitos e muitos links estáticos. Cada biblioteca precisa vincular estaticamente suas dependências, as quais, por sua vez, precisam vincular estaticamente as suas e as suas propriedades. E tudo isso é compilado frequentemente com e sem criação de perfil, e mesmo sem criação de perfil, os binários não são removidos e, portanto, mantêm muitas informações do depurador.
fonte
Porque inclui o gcc e um monte de bibliotecas, todas vinculadas estaticamente.
Pelo menos no Windows.
fonte
Aqui está o detalhamento do tamanho do diretório na minha caixa:
https://spreadsheets.google.com/ccc?key=0AveoXImmNnZ6dDlQeHY2MmxPcEYzYkpweEtDSS1fUlE&hl=en
Parece que o maior diretório (123 MB) são os binários para compilar o próprio compilador. Os documentos pesam surpreendentes 65 MB. O terceiro lugar é Cabal, com 41 MB.
O diretório bin tem 33 MB e acho que apenas um subconjunto é o que é tecnicamente necessário para criar aplicativos Haskell.
fonte
A resposta curta é que todos os executáveis estão vinculados estaticamente, podem ter informações de depuração e as bibliotecas estão incluídas em várias cópias. Isso já foi dito por outros comentaristas.
A ligação dinâmica é possível e reduzirá drasticamente o tamanho. Aqui está um exemplo
Hello.hs
:Eu construo com o GHC 7.4.2 no Windows.
ghc --make -O2
dáHello.exe
de 1105KsCorrendo
strip
sobre ele deixa 630Kghc --make -O2 -dynamic
dá 40KDescascar deixa apenas 13K.
Suas dependências são 5 dlls, com tamanho total de 9,2 MB sem remoção e 5,7 MB com remoção.
fonte