Есть ли хорошие способы сделать небольшие исполняемые файлы haskell? С ghc6 простая мировая программа hello, похоже, достигает примерно 370kB (523kB перед полосой). Привет мир в C составляет около 4kB (9kB перед полосой).Создание небольших исполняемых файлов haskell?
ответ
С ветви развития 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
Вы должны рассчитывать свои благословения (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 (и это могло быть устаревшим), оно статически связывало все, что будет фактором.
GHC статически связывает все (кроме библиотек, используемых самим запуском, которые связаны динамически).
В старые времена GHC связал всю библиотеку (haskell), как только вы что-то использовали. Когда-то, GHC начал связывать «per obj file», что резко уменьшило двоичный размер. Судя по размеру, вы, должно быть, уже использовали новый GHC.
С положительной стороны, у вас уже есть много вещей в этих 500K, как многопоточного ядра, сборщиком мусора и т.д.
Добавить по крайней мере, сборщик мусора в код C, а затем сравнить их снова :)
Хотя это правда, что двоичный файл Haskell содержит много вещей, которые нет в бинарнике C, бессмысленно иметь его, если оно не используется ... – 2009-04-01 05:06:59
@ liw.fi Если вы/что/беспокоитесь о размере ваших исполняемых файлов, C - это единственный язык, достаточно подходящий для вас. – Rayne
@ liw.fi Haskell почти по определению об сборе мусора, многоядерном исполнении и т. Д. Поэтому на самом деле бессмысленно _not_ иметь все это в ядре. Или оставьте это (добавив дополнительные усилия в модульное ядро, которое может сделать именно так). И для чего? Чтобы сохранить 100K двоичного размера? – ADEpt
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable
также попробуйте посмотреть на LDD -dr your_executable
вы видите размер является Haskell во время выполнения (libHSrts.a), который статически связан в каждый Haskell исполняемый файл. Если бы это был общий объект, например librt.o для C, то ваш двоичный файл был бы всего несколько k (размер расколотого файла .o в источнике библиотеки).
Если вы не используете динамическую компоновку libHSrts.a на своей платформе, вы можете сделать ваши исполняемые файлы меньше по полосе.
Вещи меняются - следите за this продолжающейся работой.
Если размер вашего двоичного кода действительно имеет значение, вы можете использовать инструмент gzexe, который упаковывает (желательно уже лишенный) исполняемый файл с сжатием gzip. На моем 64-битном поле Linux исходная программа hello world занимает 552 КБ, после удаления 393 КБ и после удаления и gzipping 125 КБ. Более темная сторона gzipping находится в производительности - исполняемый файл должен быть распакован первым.
Не знал об этом! Это действительно полезный совет, у меня был исполняемый файл 15 МБ, который был до 7,3 МБ после ** полосы **, но затем до 1,5 МБ после ** gzexe **! Я нашел еще один инструмент ** [upx] (http://upx.sourceforge.net/) **, который вместо ** gzexe ** получил исполняемый файл до 1,2 МБ. –
- 1. Создание автоматически исполняемых файлов?
- 2. Создание исходных исполняемых файлов
- 3. Создание исполняемых файлов в Linux
- 4. Создание автономных исполняемых файлов Lua
- 5. Запуск исполняемых файлов с помощью Haskell
- 6. Создание небольших двоичных файлов Windows
- 7. Создание двух исполняемых файлов в одном проекте
- 8. Редактирование файлов исполняемых файлов
- 9. CDN для исполняемых файлов
- 10. путь для исполняемых файлов установки для заговорщиков
- 11. Создание пользовательских исполняемых Fabric
- 12. Объединение двух исполняемых файлов
- 13. Запуск исполняемых файлов iOS
- 14. Несколько исполняемых файлов Bluemix
- 15. Xcode Именование исполняемых файлов
- 16. C++ - транспортировка исполняемых файлов
- 17. Список исполняемых файлов
- 18. Создание исполняемых скриптов с PHP
- 19. Большое количество небольших файлов Hadoop
- 20. создание исполняемых файлов из labview для Linux на основе platofrm
- 21. Создание рубиновых камней с одинаковыми именами исполняемых файлов?
- 22. Создание двух исполняемых файлов из одного проекта в Visual Studio?
- 23. Создание единого сценария оболочки, который работает для нескольких исполняемых файлов
- 24. создание нескольких исполняемых файлов из тех же источников
- 25. Создание исполняемых файлов для Python 3 и PyQt
- 26. Box2D создание небольших отверстий
- 27. Dumpbin Смещения файлов для системных исполняемых файлов
- 28. Создание Исполняемых Sqlite Comands Android
- 29. Вызов исполняемых файлов из JSP
- 30. Перечисление исполняемых файлов в C
Используйте динамическое связывание, как описано здесь, http: // stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary –