Как я могу реализовать взаимодействие между OCaml и C ++?

Я хочу создать мост между OCaml и C ++. Например, я хочу использовать некоторые конструкции, написанные на OCaml на C ++.

Как мне этого добиться? Есть ли библиотеки, привязки для этого?

11

Решение

Вы должны прочитать соответствующую часть руководства по языку: Интерфейс C с OCaml. Это довольно подробно, даже если от природы больно низкоуровневый.

Если вам не нужно в обтяжку связь между C ++ и кодом OCaml (например, вы взаимодействуете с кодом графического интерфейса пользователя и вычислительным кодом, но ядро ​​вашего приложения, требующее больших вычислительных ресурсов, не пересекает границ приложения, или, по крайней мере, ожидается, что стоимость связи будет пренебрежимо мала по сравнению с затратами времени по обе стороны ), Я бы порекомендовал вам изучить более простые способы, когда код C ++ и OCaml выполняется в отдельных процессах, и обмениваться информацией посредством передачи сообщений (в любом формате, который наиболее удобно определить: текст, s-выражения, двоичный формат, JSON и т. Д.). .). Я бы только попытался соединить код в так же процесс, если я конечно более простой подход не может работать.

Изменить: так как я написал этот ответ в прошлом году, Ctypes библиотека возникла у Джереми Яллопа; Это очень многообещающий подход, который может быть значительно проще, чем прямой интерфейс C с OCaml.

16

Другие решения

Самый простой способ сделать это состоит из двух шагов: OCaml → C и затем C → C ++, используя extern ключевое слово. Я делаю это широко в моем СОН * ML проект, который связывает OCaml с слаженность библиотека в C ++. Например в OCaml у меня есть:

type coh_ptr  (* Pointer to a Cohml C++ object *)
external coh_getcache: string -> coh_ptr = "caml_coh_getcache"

Затем в C ++ сначала функция C:

extern "C" {
value caml_coh_getcache(value cn) {
CAMLparam1(cn);
char* cache_name = String_val(cn);
Cohml* c;
try {
c = new Cohml(cache_name);
} catch (Exception::View ce) {
raise_caml_exception(ce);
}
value v = caml_alloc_custom(&coh_custom_ops, sizeof(Cohml*), 0, 1);
Cohml_val(v) = c;
CAMLreturn(v);
}
}

И, наконец, реализация C ++:

Cohml::Cohml(char* cn) {
String::View vsCacheName = cn;
hCache = CacheFactory::getCache(vsCacheName);
}

Переход в другую сторону — это в основном тот же принцип.

4

По вопросам рекламы [email protected]