我面临的任务是建立一个新的组件,以集成到一个大的现有的C代码库。该组件本质上是一种编译器,而且会非常复杂,我想用ocaml编写它(原因与前面给出的here大致相同)。我知道ocaml-c交互是可能的(根据manual和这个tutorial),但是看起来有点痛苦。
我想知道的是,这里的其他人是否尝试过大规模地集成ocaml和c代码,他们发现了一些意想不到的问题,最后他们是否得出结论,他们最好用c编写新代码。
注意,我并不是想就函数式编程和命令式编程的优点展开一场辩论:假设ocaml恰好是我所考虑的工作的正确工具,集成中的潜在困难是唯一的问题。我也没有重写其余代码库的选项。
为了更详细地介绍这个任务:我需要实现的组件是某种查询优化器,它包含了我在加州大学戴维斯分校的团队正在研究的一些研究思想,并且将被集成到postgresql中,这样我们就可以运行实验了。(查询优化器本质上是一个编译器。)该组件将从C代码中调用,主要独立运行,但将对其他PostgreSQL组件进行一定数量的调用以检索系统目录信息等内容,并将构造复杂的C数据结构(表示物理查询计划)作为输出。
对这个有点开放性的问题表示歉意,但我希望社区能帮我省点麻烦:)
谢谢,
TJ公司

最佳答案

好问题。你应该用更好的工具来做这项工作。
如果事实上你的意图是使用更好的工具来完成这项工作(你确信lexx和yacc会很痛苦),那么我有一些东西要和你分享;从c调用ocaml一点都不痛苦,反之亦然。大多数时候,我都在编写调用c的ocaml,但我用另一种方式编写了一些。它们大多是不返回结果的调试函数。尽管如此,后面和第四部分实际上是关于包装和打开c侧的ocamlvalue类型。你提到的那个教程涵盖了所有的内容,非常好。
我反对罗恩·萨维奇说你必须精通这门语言。我记得从我工作的地方开始,在几个月内,在不知道什么是“函子”的情况下,能够调用c,并为数字配方和抽象数据类型编写了上千行c,出现了一些小问题(不是解包类型,而是抽象数据类型的垃圾收集),但一点也不坏。项目中的大多数内部循环都是用C语言编写的——利用SSE、外部库(LAPACK)、更紧密的优化循环和一些内嵌的手动优化程序集。
我认为您可能需要有设计大型项目和划分功能和命令部分的经验。我真的会评估你要写多少ocaml,以及你想把什么样的值传递给c——我之所以这么说是因为我害怕向别人推荐把递归数据结构从ocaml传递给c,实际上,这将是很多解包元组,它们的内容,因此很有可能出现混淆和错误。

关于c - 将OCaml和C混合:值得付出痛苦吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3454524/

10-11 23:20
查看更多