вторник, октября 17, 2006

Через тернии к звездам

На работе пришел к немного странному, на первый взгляд, решению: из окемловского приложения вызываю питовский код, который, в свою очередь, вызывает плюсовый. Казалось бы - что за изврат? Ан нет.

Логика игры, которую мы сейчас делаем (равно как и предыдущей игры) пишется на ocaml. Низкоуровневая работа с OSG, OpenGL, OpenAL и пр., ведется на С++. Окемловских байндиногв для OSG нет, есть питоновские. А писать окемловкие байндинги для С++ гимор тот еще.

В итоге, все плюсовые дела через boost::python (очень удобная библиотека, кстати) выводятся в питон. В питоне пишется тонкий слой, переводящий работу с объектами в примитивные функции. А в кемле написан небольшой код на полстранички, который позволяет легко и type-safe-но вытаскивать функцию из питона. Например:

  let fun1 = f "module" "fun1"
(type1 **-> type2 **-> ret_type)
благодаря написанному ручками оператору
  (**->)
определяет функцию
  (f : type1 -> type2 -> ret_type)
Ну где вы еще такое напишите, кроме окемла или хаскела :)

За счет этого, я с минимальными усилиями получаю из ocaml доступ к плюсовому коду.

Так что не бойтесь применения разных языков программирования в одном проекте. Это не так уж сложно и впридачу вы имеете возможность писать то, что надо, на том, на чем надо.

3 комментария:

lrrr комментирует...

Круто канешн, но я б наверное не решился тащить интерпретатор питона только для того чтоб связать OCaml и C++.. :)

Vladimir Shabanov комментирует...

Дело в том, что для OpenSceneGraph, который я юзаю в игре, а равно как для много чего еще уже имеются питоновские байндинги. А вызвать питоновскию ф-ю из ocaml много проще, чем писать плюсовый байндинг.

yurikravchik комментирует...

Как насчет http://www.swig.org/ ?