【发布时间】:2011-12-19 16:06:51
【问题描述】:
我很想知道 OCaml 运行时如何处理异常以使它们变得如此轻量级。他们是使用 setjmp/longjmp 还是在每个函数中返回一个特殊值并传播它?
在我看来 longjmp 会给系统带来一点压力,但只有在引发异常时,在检查每个函数返回值时需要在调用函数后检查每个值,这似乎我会进行很多检查和跳转,似乎它会表现最差。
通过查看 OCaml 如何与 C 接口 (http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142) 并查看 callback.h,似乎使用对象的内存对齐来标记异常 (#define Is_exception_result(v) (((v) & 3) == 2))。这似乎表明它的实现不使用 longjmp 并在每次函数调用后检查每个函数结果。是这样吗?还是 C 函数已经尝试捕获任何异常,然后将其转换为这种格式?
谢谢!
【问题讨论】:
标签: exception compiler-construction ocaml internals setjmp