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

Нужны ли в ghc-компилируемые двоичные файлы GHC или они самодостаточны?

Если друг хочет запустить мои двоичные файлы Haskell, он должен сначала установить Haskell, или он может сразу запустить двоичный файл?

Является ли ответ одинаковым на Mac, Windows и Linux?

4b9b3361

Ответ 1

GHC создает автономные двоичные файлы, для которых не требуется установка GHC, однако они связаны с некоторыми динамическими библиотеками, особенно с libgmp. Оставшиеся библиотеки обычно встречаются в коробке на большинстве Linux-систем. Я считаю, что ситуация похожа на Windows.

Вы можете проверить, какие динамические библиотеки зависят от использования ldd в Linux. Вот что я получаю от Ubuntu Natty для простой программы Hello World:

$ echo 'main = putStrLn "Hello World"' > Hello.hs                                                   
$ ghc --make Hello.hs                                                                     
[1 of 1] Compiling Main             ( Hello.hs, Hello.o )
Linking Hello ...
$ ldd Hello                                                                                
    linux-vdso.so.1 =>  (0x00007fffe45ff000)
    libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007f8874cf9000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8874a74000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f887486b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8874667000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88742d3000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f88740b4000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8874f7a000)

Ответ 2

GHC компилирует Haskell в объектный код со связанным временем выполнения. Это означает, что вам не нужен компилятор Haskell для выполнения программ Haskell.

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

Чтобы узнать, что вам нужно отправить вместе с исполняемым файлом, на Linux (или Cygwin) используйте ldd. Вы можете заставить статическое соединение почти всего, передав -static в GHC.

Ответ 3

Если желательно статически связать некоторые библиотеки C с исполняемым файлом Haskell, в Linux вы можете использовать --whole-archive с помощью GNU-компоновщика; например:

  ghc --make HelloZ.hs \
    -optl-Wl,--whole-archive \
      -optl/usr/lib/x86_64-linux-gnu/libffi.a \
      -optl/usr/lib/x86_64-linux-gnu/libz.a \
    -optl-Wl,--no-whole-archive

Пока они довольно распространены, libffi и libz не являются повсеместными (libffi - это тот, который я часто вижу в своих двоичных файлах Haskell).

Этот подход был впервые предложен мне совсем недавно, на haskell-cafe.

Ответ 4

Для большинства двоичных файлов установка GHC не требуется. Некоторые (например, xmonad) используют Haskell в качестве языка их настройки; в этих случаях вам понадобится компилятор.

Существует также вопрос о статической и динамической компоновке. Я считаю, что по умолчанию на данный момент по-прежнему остается статическая привязка, и в этом случае довольно легко перенести двоичный файл с одного компьютера на другой (просто нужно иметь одну и ту же архитектуру и ОС).