Смешивание OCaml и C: стоит ли это боли?

Я столкнулся с задачей создания нового компонента, который будет интегрирован в большую существующую кодовую базу языка Си. Компонент по сути является своего рода компилятором, и он будет достаточно сложным, чтобы я хотел написать его в OCaml (по причинам, аналогичным приведенным здесь здесь ). Я знаю, что взаимодействие с OCaml-C возможно (согласно руководству и этому учебнику ), но оно выглядит несколько болезненным.

Что я хотел бы знать, так это ли другие здесь были предприняты попытки крупномасштабной интеграции кода OCaml и C, что было некоторыми из неожиданных ошибок, которые они обнаружили, и неужели в конце дня они пришли к выводу, что им было бы лучше просто написать новый код на C.

Заметьте, я не пытаюсь начать дебаты о достоинствах функционала. по сравнению с императивным программированием: скажем так, мы предполагаем, что OCaml оказался подходящим инструментом для моей работы, и единственной проблемой является потенциальная трудность интеграции. У меня также нет возможности переписать остальную часть кодовой базы.

Чтобы дать немного больше подробностей о задаче: компонент, который мне нужно реализовать, представляет собой определенный вид оптимизатора запросов, который включает в себя некоторые исследовательские идеи, которые моя группа делает в UC Davis работает и будет интегрирован в PostgreSQL, чтобы мы могли проводить эксперименты. (Оптимизатор запросов - это, по сути, компилятор.) Компонент будет вызываться из кода C, будет функционировать в основном независимо, но будет делать определенное количество обращений к другим компонентам PostgreSQL для извлечения таких вещей, как информация системного каталога, и будет создавать сложную структуру данных C (представляющую физический план запросов) в качестве вывода.

Извинения за несколько открытый вопрос, но я надеюсь, что сообщество сможет избавить меня от небольшой проблемы:)

Спасибо,

TJ

15
задан Community 23 May 2017 в 10:29
поделиться

3 ответа

Отличный вопрос. Вы должны использовать лучший инструмент для работы.

Если вы на самом деле намерены использовать лучший инструмент для работы (и вы уверены, что lexx и yacc доставят вам много хлопот), то мне есть чем поделиться с вами; совсем не больно вызывать ocaml из c, и наоборот. Большую часть времени я писал ocaml с вызовом C, но некоторые я написал другим способом. В основном это были функции отладки, которые не возвращают результат. Хотя обратный и четвертый вызовы на самом деле связаны с упаковкой и распаковкой типа ocaml value на стороне C. Этот учебник, который вы упомянули, охватывает все это, и очень хорошо.

Я против замечаний Рона Сэвиджа о том, что нужно хорошо владеть языком. Я вспоминаю, как начинал там, где работаю, и через несколько месяцев, не зная, что такое "функтор", смог вызвать C и написать тысячу строк C для числовых рецептов и абстрактных типов данных, и были некоторые икоты (не с распаковкой типов, а со сборкой мусора абстрактных типов данных), но все было неплохо. Большинство внутренних циклов в проекте написано на C - с использованием преимуществ SSE, внешних библиотек (Lapack), более жестких оптимизированных циклов и некоторых встроенных вручную оптимизированных сборок.

Я думаю, вам может потребоваться опыт разработки большого проекта и разграничения функциональных и императивных разделов.Я бы действительно оценил, сколько ocaml вы собираетесь писать, и какие значения вы хотите передать в C - я говорю это, потому что я боялся бы рекомендовать кому-то передать рекурсивную структуру данных из ocaml на C, на самом деле, было бы много распаковки кортежей, их содержимого и, следовательно, много возможностей для путаницы и ошибок.

11
ответ дан 1 December 2019 в 04:17
поделиться

Мое практическое правило - придерживаться языка / модели / стиля, используемых в существующей кодовой базе, чтобы будущие разработчики обслуживания унаследовали согласованный и понятный набор кода приложения.

Единственный способ оправдать то, что вы предлагаете, - это если:

  1. Вы являетесь экспертом в OCaml И новичком в C (так что ваша продуктивность будет в 20 раз выше)
  2. Вы успешно интегрировали это с библиотекой C раньше (по-видимому, нет)

Если вы хоть немного знакомы с C, чем с OCaml, вы только что потеряли всякую «теоретическую» выгоду от того, что OCaml проще использовать при написании компилятора - плюс, кажется, хотя вокруг вас будет больше сверстников, знакомых с C, чем с OCaml.

Это мои «сварливые старые кодировщики» 2 цента (которые раньше стоили всего пенни!).

1
ответ дан 1 December 2019 в 04:17
поделиться

Я написал довольно сложную гибридную программу OCaml-C. Я был разочарован тем, что нашел неадекватную документацию, и в итоге я тратил слишком много времени на решение проблем со сборкой мусора. Однако получившаяся программа работала и работала быстро.

Я думаю, что есть место для интеграции OCaml-C, но убедитесь, что это стоит хлопот. Возможно, было бы проще, если бы программы взаимодействовали через сокет (при условии, что такие операции ввода-вывода не снижают производительности, которую вы хотите). Также может быть более разумным просто написать все это на C.

2
ответ дан 1 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: