Создание маленьких исполняемых файлов haskell? - PullRequest
40 голосов
/ 31 марта 2009

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

Ответы [ 7 ]

45 голосов
/ 23 июня 2010

С веткой разработки 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 для динамически связанного RTS:

$ 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
21 голосов
/ 31 марта 2009

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

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

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

Добавьте хотя бы сборщик мусора в ваш C-код, затем сравните их снова:)

16 голосов
/ 01 апреля 2009

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

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

9 голосов
/ 06 июня 2009

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

8 голосов
/ 31 марта 2009

Вы должны сосчитать свои благословения (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, на самом деле это не совсем справедливое сравнение с C. Там происходит больше всего.

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

6 голосов
/ 29 апреля 2009

Все меняется - следите за этой текущей работой.

6 голосов
/ 01 апреля 2009
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable

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

...