OCaml使用字节码编译器从C函数返回未装箱的float

格雷戈里·尼斯贝特

我有一个非常简单的函数,该函数进行调用time(2)以获取时期并将其作为未装箱的OCaml浮点数返回。

这里的平台是OS X 10.12.6,我已经使用OCaml版本4.03.0和4.04.0进行了测试。

这是 libunixtime.c

#define CAML_NAME_SPACE
#include <time.h>
#include <caml/memory.h>

#define IGNORE_UNUSED(x) ( (void)(x) )

CAMLprim double
ocaml_unixtime(value unit)
{
    IGNORE_UNUSED(unit);
    return (double) time(NULL);
}

OCaml代码unixtime.ml如下所示:它返回未装箱的float,并向编译器指示它不执行任何OCaml端分配。

此函数接受少于5个参数,因此似乎只执行一次并将其用于字节码编译器和本机编译器就可以了(https://caml.inria.fr/pub/docs/manual-ocaml/intfc .html#sec397)。

external unixtime : unit -> (float [@unboxed]) = 
  "ocaml_unixtime" "ocaml_unixtime" [@@noalloc];;

let () = Printf.printf "%f\n" (unixtime ())

这个示例与本机编译器可以很好地工作(尽管我有点担心强制转换double不是完全正确的事情,但是它可以在我的机器上工作)。

% ocamlopt unixtime.ml libunixtime.c
% ./a.out
1506195346.000000

但是,当使用字节码编译器进行编译并尝试运行时,我会立即遇到段错误。

% ocamlc -custom unixtime.ml libunixtime.c
% ./a.out
Segmentation fault
Exit 139

字节码编译器是否不支持拆箱浮点数?我如何弄清楚字节码和本机编译器的行为为何不同?

艾蒂安·米隆(Etienne Millon)

首先,您的代码似乎缺少CAMLparamunit调用为了使GC知道,这是必需的,请参见19.1节

但是还有另一个更重要的错误:字节码版本不能使用未装箱的函数(第19.10节),因此您必须为字节码编译器提供一个替代实现,该编译器使用caml_copy_double返回装箱的值CAMLreturn

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Sun为什么不使用C#到Java字节码编译器?

C sprintf使用字节参数中断(Keil编译器)

Java字节码编译器基准

编译器优化:Java字节码

Kotlin编译器:字节码中的“ nop”

JavaScript中的Java字节码编译器

为什么编译器未使用-O3优化此C ++成员函数?

是否允许C编译器优化未使用的函数参数?

编译器在运行时将Java字节码转换为平台无关的C代码?

尝试使用计时器执行函数,但编译器说该函数未使用

使用Visual Studio编译器分析内联的C ++函数

如何告诉编译器在每个C函数上填充特定数量的字节?

C函数调用C ++成员函数-使用C编译器编译C代码

未使用的宏,编译器警告

GCC编译器优化:多次使用字符

虚拟函数编译器优化C ++

Oracle和Eclipse编译器产生的Java字节码的差异

Kotlin编译器是否始终在字节码中保留参数名称?

我应该看看Java编译器产生的字节码吗?

为什么Java没有非字节码编译器?

如何使用opam安装ocaml编译器的特定版本

编译器警告有关实际使用的私有函数的未使用代码

为什么在调用C函数时未引发编译器时间错误

为什么编译器会警告标有@discardableResult的函数未使用的结果?

JAXB是否使用字节码检测?

编译器未生成move构造函数

在constexpr函数中返回C字符串:为什么编译器没有警告?

为什么某些C编译器会在奇怪的地方设置函数的返回值?

C++:如果缺少函数返回语句,for 循环被优化为无限循环 - 编译器错误?