c - 混合 OCaml 和 C : is it worth the pain?

标签 c postgresql ocaml

我面临着构建一个新组件以集成到现有大型 C 代码库中的任务。该组件本质上是一种编译器,并且会非常复杂,以至于我想用 OCaml 编写它(出于与给定的那些 here 的原因)。我知道 OCaml-C 交互是可能的(根据 manual 和这个 tutorial ),但它看起来有些痛苦。

我想知道这里的其他人是否尝试过 OCaml 和 C 代码的大规模集成,他们发现了哪些意想不到的陷阱,以及他们是否最终得出结论认为他们会最好只用 C 编写新代码。

请注意,我不是试图就函数式编程与命令式编程的优点展开辩论:假设我们假设 OCaml 恰好是我心目中工作的正确工具,整合的潜在困难是唯一的问题。我也没有重写代码库其余部分的选项。

关于任务的更多细节:我需要实现的组件是某种查询优化器,它结合了我在加州大学戴维斯分校的团队正在研究的一些研究想法,并将集成到 PostgreSQL 中,以便我们可以运行实验。 (查询优化器本质上是一个编译器。)该组件将从 C 代码调用,大部分独立运行,但会对其他 PostgreSQL 组件进行一定次数的调用以检索系统目录信息等内容,并构建一个复杂的C 数据结构(表示物理查询计划)作为输出。

很抱歉这个有点开放的问题,但我希望社区可以帮我省点麻烦 :)

谢谢,

张杰

最佳答案

好问题。您应该使用更好的工具来完成这项工作。

如果实际上您的意图是使用更好的工具来完成工作(并且您确定 lexx 和 yacc 会很痛苦),那么我有一些东西要与您分享;从 c 调用 ocaml 一点也不痛苦,反之亦然。大部分时间我一直在编写调用 C 的 ocaml,但我也以其他方式编写了一些。它们主要是不返回结果的调试函数。虽然,调用 back 和 fourth 实际上是关于在 C 端打包和解包 ocaml value 类型。您提到的那个教程涵盖了所有这些,而且非常好。

我反对 Ron Savage 的说法,即您必须是该语言的专家。我记得从我工作的地方开始,在几个月内,不知道什么是“仿函数”,能够调用 C,并为数字配方和抽象数据类型编写一千行 C,并且有一些小问题(不是使用解包类型,而是使用抽象数据类型的垃圾收集),但它一点也不差。项目中的大部分内部循环都是用 C 编写的——利用 SSE、外部库 (lapack)、更紧密的优化循环和一些内联的手工优化汇编。

我认为您可能需要具备设计大型项目以及划分功能部分和命令部分的经验。我真的会评估你将要编写多少 ocaml,以及你想传递给 C 的什么样的值——我这么说是因为我害怕向某人推荐从中传递递归数据结构ocaml 到 C,实际上,它会解包元组及其内容,因此很可能出现混淆和错误。

关于c - 混合 OCaml 和 C : is it worth the pain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3454524/

相关文章:

无法弄清楚C编程

c - stdio.h 文件错误?

sql - 在 PostgreSQL 中使用 COALESCE 处理 NULL 值

Django 和 PostgreSQL - 类型字符变化的值太长 (512)

字符串的 OCaml 函数参数模式匹配

c - getmaxyx 如何改变传递变量的值?

c - 动态分配和数组

分区表上的 postgresql 索引提取

ocaml - 为什么OCaml无法推断以下类型:

c++ - 从 Ruby 代码访问以 OCaml 和 C++ 编写的库