在Haskell中调用c函数与Python比较

2024-04-25 22:16:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我可以这样做:

import ctypes
import ctypes.util

my_lib = ctypes.cdll.LoadLibrary (ctypes.util.find_library ('my_lib') or 'my_lib32')
a = my_lib.some_function(33)
b = my_lib.some_function2(33)
c = my_lib.SOME_CONST_123

既然我需要将这种类型的Python代码转换成Haskell,我想知道我能在Haskell中做同样的事情吗?我知道我可以通过外国金融机构做类似的事情。 但这并不完全是我在Python中所能做的,因为在Haskell中,我必须首先声明函数,如下所示:

^{pr2}$

是真的吗,有更简单的方法吗?在


Tags: orimporthaskellmylibutillibraryfunction
1条回答
网友
1楼 · 发布于 2024-04-25 22:16:07

Python中的ctypes库基本上是C库libffi的包装器,这个库让我们在运行时而不是编译时调用进程地址空间中给定信息的任意函数。在

same library可以在Haskell中与动态链接器一起使用,以达到相同的效果:

import Foreign.LibFFI
import System.Posix.DynamicLinker

example :: IO ()
example = do
  dlopen "mylib.so" [RTLD_LAZY]
  fn  <- dlsym Default "some_function"
  fn2 <- dlsym Default "some_function2"
  a <- callFFI fn retCInt [argCInt 33]
  b <- callFFI fn2 retCInt [argCInt 33]
  return ()

由于很多原因,这并不理想,我不建议构建这样一个大的绑定集,原因与许多Python开发人员不赞成将cype用于绑定一样,除非万不得已。首先,它对每个函数调用都会有一些开销(与ctypes的开销大致相同)。与Haskell的ccall unsafeFFI函数相比,has basically no overhead与本机C函数调用一样便宜。在

第二,现在函数的参数不是像IntFloat这样的简单Haskell类型的参数,现在都在一个巨大的libffi sum类型Arg中,这对类型系统是不透明的,并且很容易引入细微的bug。在

如果您可以在编译时链接C库并向前声明函数,无论是使用常规的Haskell FFI(-XForeignFunctionInterface)和/或c2hs之类的工具,这将使您的工作更加轻松。在

相关问题 更多 >