gpt4 book ai didi

ocaml - 从 OCaml 调用 C/汇编函数比使用 caml_c_call 更直接

转载 作者:行者123 更新时间:2023-12-02 01:24:46 24 4
gpt4 key购买 nike

OCaml 允许从 OCaml 程序调用 C 函数,只要程序员遵循手册“C 与 OCaml 的接口(interface)”一章中的说明即可。

按照这些说明进行操作时,对 C 函数的调用将由 native 编译器转换为:

    movq    ml_as_z_sub@GOTPCREL(%rip), %rax
call caml_c_call@PLT

(这里是amd64指令集,但是看看其他架构,方案似乎相当统一)。

函数caml_c_call最终会执行一次计算跳转call *%rax,但它之前和之后做了很多事情。来自 asmrun/amd64.S:

/* Call a C function from Caml */

FUNCTION(G(caml_c_call))
.Lcaml_c_call:
/* Record lowest stack address and return address */
popq %r12
STORE_VAR(%r12, caml_last_return_address)
STORE_VAR(%rsp, caml_bottom_of_stack)
/* Make the exception handler and alloc ptr available to the C code */
STORE_VAR(%r15, caml_young_ptr)
STORE_VAR(%r14, caml_exception_pointer)
/* Call the function (address in %rax) */
call *%rax
/* Reload alloc ptr */
LOAD_VAR(caml_young_ptr, %r15)
/* Return to caller */
pushq %r12
ret

当一个人想要频繁执行几条既不分配也不引发异常的指令时,上面的方法有点矫枉过正。

有人有直接从 OCaml 调用小型汇编例程而不通过 caml_c_call stub 的经验吗?这可能涉及欺骗 native 编译器,使其认为它正在调用 ML 函数,或修改编译器。

问题是在 Zarith 库的上下文中,其中少量的汇编代码可以直接计算并返回大多数结果,而无需经过 caml_c_call,并且只需跳转到 caml_c_code 对于需要分配或异常(exception)的困难参数。请参阅this file有关可以直接执行的汇编位的示例。

最佳答案

也许"noalloc"和“ float ”可能有一些用处?

PS更多related links .

关于ocaml - 从 OCaml 调用 C/汇编函数比使用 caml_c_call 更直接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7556912/

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