Есть ли хорошие способы создания небольших исполняемых файлов haskell? С ghc6 простая мировая программа hello, похоже, достигает примерно 370kB (523kB перед полосой). Привет мир в C составляет около 4kB (9kB перед полосой).
Создание небольших исполняемых файлов haskell?
Ответ 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
Все меняется - следите за этот продолжающийся кусок работы.