2009-03-31 2 views
39

Есть ли хорошие способы сделать небольшие исполняемые файлы haskell? С ghc6 простая мировая программа hello, похоже, достигает примерно 370kB (523kB перед полосой). Привет мир в C составляет около 4kB (9kB перед полосой).Создание небольших исполняемых файлов haskell?

+0

Используйте динамическое связывание, как описано здесь, http: // stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary –

ответ

44

С ветви развития GHC (кто точно знать, какую версию этого был добавлен в?):

$ 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 

Добавьте -dynamic флаг динамически подключаемой РТС:

$ 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 

Смотри также : http://hackage.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport

Для сравнения с 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 
+0

Работает для меня в ghc 6.12.1. – Joe

+0

Если вы получаете «Возможно, вы не установили библиотеки профилирования для ошибки« base », а затем apt-get install ghc-dynamic. – matcheek

+0

Какой будет эквивалент команды 'strip' на OS X? –

8

Вы должны рассчитывать свои благословения (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$ 

Серьезно, хотя в то время как вы можете, вероятно, вытряхнуть Haskell двоичные файлы немного, это действительно не справедливое сравнение с С. Там в более там происходит ,

Последний раз, когда я играл с ghc (и это могло быть устаревшим), оно статически связывало все, что будет фактором.

21

GHC статически связывает все (кроме библиотек, используемых самим запуском, которые связаны динамически).

В старые времена GHC связал всю библиотеку (haskell), как только вы что-то использовали. Когда-то, GHC начал связывать «per obj file», что резко уменьшило двоичный размер. Судя по размеру, вы, должно быть, уже использовали новый GHC.

С положительной стороны, у вас уже есть много вещей в этих 500K, как многопоточного ядра, сборщиком мусора и т.д.

Добавить по крайней мере, сборщик мусора в код C, а затем сравнить их снова :)

+1

Хотя это правда, что двоичный файл Haskell содержит много вещей, которые нет в бинарнике C, бессмысленно иметь его, если оно не используется ... – 2009-04-01 05:06:59

+5

@ liw.fi Если вы/что/беспокоитесь о размере ваших исполняемых файлов, C - это единственный язык, достаточно подходящий для вас. – Rayne

+2

@ liw.fi Haskell почти по определению об сборе мусора, многоядерном исполнении и т. Д. Поэтому на самом деле бессмысленно _not_ иметь все это в ядре. Или оставьте это (добавив дополнительные усилия в модульное ядро, которое может сделать именно так). И для чего? Чтобы сохранить 100K двоичного размера? – ADEpt

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

также попробуйте посмотреть на LDD -dr your_executable

16

вы видите размер является Haskell во время выполнения (libHSrts.a), который статически связан в каждый Haskell исполняемый файл. Если бы это был общий объект, например librt.o для C, то ваш двоичный файл был бы всего несколько k (размер расколотого файла .o в источнике библиотеки).

Если вы не используете динамическую компоновку libHSrts.a на своей платформе, вы можете сделать ваши исполняемые файлы меньше по полосе.

6

Вещи меняются - следите за this продолжающейся работой.

9

Если размер вашего двоичного кода действительно имеет значение, вы можете использовать инструмент gzexe, который упаковывает (желательно уже лишенный) исполняемый файл с сжатием gzip. На моем 64-битном поле Linux исходная программа hello world занимает 552 КБ, после удаления 393 КБ и после удаления и gzipping 125 КБ. Более темная сторона gzipping находится в производительности - исполняемый файл должен быть распакован первым.

+2

Не знал об этом! Это действительно полезный совет, у меня был исполняемый файл 15 МБ, который был до 7,3 МБ после ** полосы **, но затем до 1,5 МБ после ** gzexe **! Я нашел еще один инструмент ** [upx] (http://upx.sourceforge.net/) **, который вместо ** gzexe ** получил исполняемый файл до 1,2 МБ. –

Смежные вопросы