Подтвердить что ты не робот

Создание небольших исполняемых файлов haskell?

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

4b9b3361

Ответ 1

С веткой разработки 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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 7

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