2013-05-22 18 views
11

Su Windows, GHC è distribuito con gcc e g ++, ad es. sotto ghc-7.6.3\mingw\bin. Da download page, si nota anche sotto il download binario di Windows che la build per Windows "include anche il supporto per la compilazione di file C++."Perché GHC è distribuito con gcc e g ++?

Posso immaginare che la distribuzione di questi compilatori è solo per comodità, dal momento che Windows non ne viene fornito. Potrei anche immaginare che sia necessario per usare l'FFI, ma non ne sono sicuro al 100%. Ad esempio, sebbene GHC compili i file .c e .cpp usando i propri compilatori gcc/g ++, GHC anche provides options per scegliere quale compilatore e linker vuoi. E in effetti, puoi specificare il tuo gcc/g ++ e sembra funzionare. Puoi anche tagliare GHC fuori dal ciclo un po 'più avanti compilando i file .c/.cpp in anticipo e invocando GHC solo per compilare il codice Haskell e collegarlo tutto usando -pgml (sebbene l'effetto complessivo sia lo stesso di usare -pgmc e -pgml).

Ora che sembra al lavoro, ma lo fa affidamento sulla fortuna pura che si specifica -pgml e -pgmc essere una versione di gcc che è compatibile con quanto GHC ha in mente? In altre parole, quando utilizzo la FFI, devo davvero solo compilare e collegare tutto con le chiamate GHC?

+1

L'utilizzo di GHC per tutto è generalmente il modo più semplice. E (potrei sbagliarmi) se ricordo male, le cose non funzionano molto bene se si tenta di usare MSVC (e ho la vaga memoria che anche Cygwin ha problemi). –

risposta

11

GHC è generalmente compatibile con molte/diverse versioni di GCC (le incompatibilità appaiono quando si utilizza il malvagio mangler).

Se si tenta di utilizzare altri compilatori C, si avranno alcuni problemi di basso livello da affrontare (flag, formati asm).

Si noti che i GHC più recenti deprecano il backend C a favore del backend LLVM, rendendo questo un po 'problematico per lo sviluppo Haskell giorno per giorno.

+2

Quindi, se ho capito da capo, il "backend C" e il "backend LLVM" (e il "generatore di codice nativo") si riferiscono tutti a uno stadio poco prima di generare il file oggetto per ogni modulo Haskell. Il malvagio mangler è solo parte del backend C. Escludendo quindi il backend C, ci si può aspettare la compatibilità dei file oggetto di GHC (da file .hs) con i file oggetto di GCC (generati da file .c/.cpp) --- per una gamma non specificata di versioni GCC vicine. Ma per qualsiasi back-end (incluso LLVM?) Si hanno quei problemi di basso livello se si usa un compilatore non GCC. – Ein

Problemi correlati