gpt4 book ai didi

haskell - 绑定(bind)FFI和DSL

转载 作者:行者123 更新时间:2023-12-02 03:41:49 25 4
gpt4 key购买 nike

在 Haskell 中 LLVM bindings ,我试图定义一个具有可变数量参数的函数(实际上我的意思是编译时未知的常数)。我发现this question我正在努力寻找答案。

我不想完全退回到使用 FFI 来生成 LLVM,我想尽可能多地使用 DSL,并使用 FFI 只做我无法通过 DSL 做的事情。

我设法通过 functionType 定义类型,但仍然无法将函数添加到通过调用 defineModule 创建的模块中。我还认为下一步是通过 FFI.appendBasicBlock 将基本 block 添加到函数中,我认为这很简单,但是如何通过 FFI.getParam 获取参数> CodeGenFunction monad 中的 do block 内部。

最佳答案

如果直到运行时才知道参数列表的大小,则无论如何您都需要将该函数转换为在列表上运行的函数。请注意,(IORef [Word32]) 类型意味着 IO 操作将在程序执行期间读/写(可变)Word32 列表。 Haskell 程序只需要说明如何来改变/读取/写入列表——因此有了 IO() monad。

您引用的 LLVM git 项目中有一个 Examples/List.hs 文件。它构造了一个 LLVM 汇编例程“arrayLoop”,

arrayLoop ::
(Phi a, IsType b,
Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i Bool) =>
Value i -> Value (Ptr b) -> a ->
(Value (Ptr b) -> a -> CodeGenFunction r a) ->
CodeGenFunction r a
arrayLoop len ptr start loopBody = do

在每次调用“body” block 时,递增指向整数 p 列表的指针,并递减剩余长度 i。该 block 重复调用“loopBody”并将结果存储在“vars”中,最终返回(零不变)到 mList 函数内的“s”:

mList ::
CodeGenModule (Function
(StablePtr (IORef [Word32]) -> Word32 -> Ptr Word32 -> IO Int32))
mList =
createFunction ExternalLinkage $ \ ref size ptr -> do
next <- staticFunction nelem
let _ = next :: Function (StablePtr (IORef [Word32]) -> IO Word32)
s <- arrayLoop size ptr (valueOf 0) $ \ ptri y -> do
flip store ptri =<< call next ref
return y
ret (s :: Value Int32)

有关 nelem/NextListElement 的所有额外内容都在其示例中用于“loopBody”,它将列表向左移动一次。该存储库还提到了一个邮件列表:haskell-llvm@projects.haskellorg。

GHC7 可以使用 LLVM 进行编译,但我想这对解释语言的 Haskell 程序没有帮助,除非 GHC 也进行 JIT 编译 - 有人知道情况是否如此吗?

关于haskell - 绑定(bind)FFI和DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com