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

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

Я мог представить себе, что распространение этих компиляторов просто для удобства, поскольку 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?

Ответ 1

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

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

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