2013-05-22 13 views
11

Unter Windows wird GHC mit gcc und g ++, z. unter ghc-7.6.3\mingw\bin. Von der download page, es wird auch unter dem Windows-Binärdownload festgestellt, dass der Build für Windows "auch Unterstützung für das Kompilieren von C++ - Dateien enthält."Warum wird GHC mit gcc und g ++ vertrieben?

Ich könnte mir vorstellen, dass die Verteilung dieser Compiler nur der Bequemlichkeit dient, da Windows mit keinem kommt. Ich könnte mir auch vorstellen, es ist notwendig für die Verwendung der FFI, aber ich bin nicht 100% sicher. Zum Beispiel, obwohl GHC .c und .cpp Dateien kompiliert mit eigenen GCC/G ++ Compiler, GHC auch provides options zu wählen, welche Compiler und Linker Sie wollen. Und tatsächlich können Sie Ihr eigenes gcc/g ++ spezifizieren und es scheint zu arbeiten. Sie können GHC sogar noch ein Stück weiter ausschneiden, indem Sie die .c/.cpp-Dateien im Voraus kompilieren und nur GHC aufrufen, um den Haskell-Code zu kompilieren und mit -pgml zu verknüpfen (obwohl der Gesamteffekt der gleiche ist wie bei Verwendung von -pgmc) und -pgml).

Nun, da scheint zu arbeiten, aber nicht verlassen, es auf reines Glück, dass Sie -pgml und -pgmc geben eine Version von gcc zu sein, der mit kompatibel ist, was GHC im Sinn hat? Mit anderen Worten, wenn ich das FFI verwende, soll ich eigentlich nur alles mit GHC-Aufrufen kompilieren und verknüpfen?

+1

Die Verwendung von GHC für alles ist im Allgemeinen der einfachste Weg. Und (ich kann mich irren), wenn ich mich richtig erinnere, funktionieren die Dinge nicht so gut, wenn Sie versuchen, MSVC zu benutzen (und ich habe die vage Erinnerung, dass Cygwin auch Probleme hat). –

Antwort

11

GHC ist im Allgemeinen kompatibel mit vielen/mehreren Versionen von GCC (die Inkompatibilitäten treten auf, wenn der böser Mangler verwendet wird).

Wenn Sie versuchen, andere C-Compiler zu verwenden, werden Sie einige Probleme mit niedrigen Pegeln haben (Flags, Asm-Formate).

Beachten Sie, dass neuere GHCs das C-Backend zugunsten des LLVM-Backends ablehnen, was dies für die tägliche Haskell-Entwicklung etwas problematisch macht.

+2

Also, wenn ich meinen Kopf darum gewickelt habe, beziehen sich das 'C-Backend' und das 'LLVM-Backend' (und der 'native Codegenerator') kurz vor dem Erzeugen der Objektdatei für jedes Haskell-Modul auf eine Stufe. Der böse Mangler gehört nur zum C-Backend. Wenn man dann das C-Backend ausklammert, kann man mit der Kompatibilität der GHC-Objektdateien (aus .hs-Dateien) mit GCC-Objektdateien (aus .c/.cpp-Dateien) rechnen - für einige nicht näher spezifizierte GCC-Versionen. Aber für jedes Backend (einschließlich LLVM?) Haben Sie diese Low-Level-Probleme, wenn Sie einen Nicht-GCC-Compiler verwenden. – Ein