Почему GHC распространяется с gcc и g++?

В Windows GHC распространяется с gcc и g++, например. под ghc-7.6.3\mingw\bin. На странице загрузки также указано, что сборка для Windows "также включает поддержку компиляции файлов C++».

Я мог предположить, что эти компиляторы распространяются только для удобства, поскольку Windows не поставляется с ними. Я также мог предположить, что это необходимо для использования FFI, но я не уверен на 100%. Например, хотя GHC компилирует файлы .c и .cpp, используя собственные компиляторы gcc/g++, GHC также предоставляет параметры для выбора нужного компилятора и компоновщика. И действительно, вы можете указать свой собственный gcc/g++, и это, похоже, работает. Вы даже можете немного вырезать GHC из цикла, предварительно скомпилировав файлы .c/.cpp и вызывая GHC только для компиляции кода Haskell и компоновки всего этого с помощью -pgml (хотя общий эффект такой же, как при использовании -pgmc). и -pgml).

Теперь это похоже работает, но зависит ли это от чистой удачи, если вы укажете -pgml и -pgmc как версию gcc, совместимую с тем, что имеет в виду GHC? Другими словами, когда я использую FFI, я действительно должен компилировать и связывать все только с вызовами GHC?


person Ein    schedule 22.05.2013    source источник
comment
Использование GHC для всего, как правило, самый простой способ. И (я могу ошибаться), если я правильно помню, все работает не слишком хорошо, если вы пытаетесь использовать MSVC (и я смутно помню, что у Cygwin тоже есть проблемы).   -  person Daniel Fischer    schedule 22.05.2013


Ответы (1)


GHC, как правило, совместим со многими/несколькими версиями GCC (несовместимости появляются при использовании злого манглера).

Если вы попытаетесь использовать другие компиляторы C, у вас возникнет несколько проблем низкого уровня (флаги, форматы asm).

Обратите внимание, что более поздние версии GHC отказываются от использования бэкенда C в пользу бэкенда LLVM, что делает его несколько спорным для повседневной разработки на Haskell.

person Don Stewart    schedule 22.05.2013
comment
Итак, если я обдумал это, то «бэкэнд C» и «бэкэнд LLVM» (и «генератор собственного кода») ссылаются на этап незадолго до создания объектного файла для каждого модуля Haskell. Злой манипулятор является частью только бэкэнда C. За исключением бэкэнда C, можно ожидать совместимости объектных файлов GHC (из файлов .hs) с объектными файлами GCC (сгенерированных из файлов .c/.cpp) --- для некоторого неопределенного диапазона ближайших версий GCC. Но для любого бэкенда (включая LLVM?) у вас есть проблемы низкого уровня, если вы используете компилятор, отличный от GCC. - person Ein; 22.05.2013