2016-06-07 9 views
5

Ich entdeckte, dass es zwei Aufrufkonventionen mit GHC's FFI: ccall und capi. Die Dokumente haben nicht viele Informationen über die beiden Konventionen. Was ist der Unterschied zwischen ihnen und wann sollte ich sie verwenden? Ist einer schneller als der andere?Unterschied zwischen call und capi FFI Aufruf Konventionen

+2

Ich klickte auf den Link und ich kann nur sagen, dass die neuen GHC-Dokumente wunderbar aussehen! – epsilonhalbe

+1

Ich denke der Unterschied liegt beim Import von einfachen c-Dateien und Header-Dateien, aber das ist nur raten, ich habe das FFI eigentlich nie benutzt. – epsilonhalbe

Antwort

6

ccall ist der normale Weg. Es funktioniert, indem es direkt mit einem Symbol verknüpft, das in einer (normalerweise in C geschriebenen) Bibliothek definiert ist.

capi ist eine ghc-Erweiterung, die auf der C-Quellenebene funktioniert. Aus diesem Grund kann auf Dinge zugegriffen werden, die auf ABI-Ebene nicht vorhanden sind, z. B. Makros. (Ich weiß nicht, wie es implementiert ist, aber ich würde vermuten, dass es einen kleinen C-Wrapper erzeugt, den es dann mit einem C-Compiler im Hintergrund kompiliert.)

Ich würde ccall wo möglich verwenden. Es ist Teil des Sprachstandards und sieht im Allgemeinen weniger "magisch" aus.

+6

Haben Sie konkrete Gründe, 'ccall' gegenüber' capi' zu bevorzugen? C-Bibliotheken werden normalerweise durch ihre API definiert, nicht ABI, und die Verwendung von 'ccall' verursacht oft Probleme bei der Portierung auf exotische Plattformen (wie Android), die einige Funktionen als Makros implementieren, die mit' capi' leicht zu umgehen sind. Ich habe noch nie ein Problem gefunden, das durch die Verwendung von 'capi' gegenüber' ccall' verursacht wurde (obwohl das wahrscheinlich nur deshalb der Fall ist, weil die Leute selten 'capi' an erster Stelle verwenden). –

Verwandte Themen