2013-05-22 11 views
11

W systemie Windows GHC jest rozpowszechniany z gcc i g ++, np. pod ghc-7.6.3\mingw\bin. Od download page, jest również zauważyć pod Windows binarne pobieranie, że kompilacja dla Windows "zawiera również obsługę kompilacji plików C++."Dlaczego GHC jest rozprowadzany z gcc i g ++?

Mogę sobie wyobrazić, że dystrybucja tych kompilatorów jest tylko dla wygody, ponieważ system Windows nie ma żadnych. Mogę sobie także wyobrazić, że jest to konieczne, aby używać FFI, ale nie jestem w 100% pewny. Na przykład, chociaż GHC będzie kompilował pliki .c i .cpp przy użyciu własnych kompilatorów gcc/g ++, GHC również provides options wybierze dowolny kompilator i linker, który chcesz. I rzeczywiście, możesz określić swój własny gcc/g ++ i wydaje się, że działa. Możesz nawet wyciąć GHC z pętli, kompilując wcześniej pliki .c/.cpp, i tylko wywołując GHC, aby skompilować kod Haskella i połączyć go wszystkie przy użyciu -pgml (chociaż ogólny efekt jest taki sam jak użycie -pgmc i -pgml).

Teraz wydaje do pracy, ale ma to polegać na czystego szczęścia, które można określić -pgml i -pgmc być wersja gcc, który jest zgodny z tym, co GHC ma na myśli? Innymi słowy, kiedy używam FFI, czy naprawdę powinienem tylko skompilować i połączyć wszystko z wywołaniami GHC?

+1

Używanie GHC do wszystkiego jest ogólnie najłatwiejszym sposobem. I (mogę się mylić), jeśli dobrze pamiętam, rzeczy nie działają zbyt dobrze, jeśli spróbujesz użyć MSVC (i mam niejasne wspomnienie, że Cygwin też ma problemy). –

Odpowiedz

11

GHC jest ogólnie kompatybilny z wieloma/kilkoma wersjami GCC (niezgodności pojawiają się podczas używania złego manglera).

Jeśli spróbujesz użyć innych kompilatorów języka C, będziesz mieć kilka problemów o niskim poziomie trudności (flagi, formaty ASM).

Należy zauważyć, że nowsze GHC wycofują backend C na korzyść backendu LLVM, czyniąc to nieco dyskusyjnym dla codziennego rozwoju Haskell.

+2

Więc jeśli owinąłem to wokół głowy, "backend C" i "backend LLVM" (i "generator kodu natywnego") wszystkie odnoszą się do etapu krótko przed wygenerowaniem pliku obiektu dla każdego modułu Haskell. Zły mangler jest tylko częścią backendu C. Z wyłączeniem backendu C można oczekiwać kompatybilności plików obiektów GHC (z plików .hs) z plikami obiektowymi GCC (wygenerowanymi z plików .c/.cpp) --- dla niektórych nieokreślonych zakresów pobliskich wersji GCC. Ale dla każdego backendu (w tym LLVM?) Masz te problemy niskiego poziomu, jeśli używasz kompilatora bez GCC. – Ein