我发现使用GHC's FFI有两种调用约定:ccall
和capi
。这些文档没有太多关于这两个公约的信息。它们之间有什么区别,我什么时候应该使用它们?一个比另一个快吗?
答案 0 :(得分:6)
ccall
是正常的方式。它通过直接链接到(通常用C语言编写)库中定义的符号来工作。
capi
是一个ghc扩展,适用于C源代码级别。这就是为什么它可以访问ABI级别不存在的东西,例如宏。 (我不知道它是如何实现的,但我猜它会生成一个小的C函数包装器,然后在后台用C编译器编译。)
我尽可能使用ccall
。它是语言标准的一部分,看起来更少"魔法"总的来说。