Создание настольных приложений с графическим интерфейсом, которые обращаются к OCaml или Haskell - это дурацкое поручение? - PullRequest
6 голосов
/ 24 апреля 2010

И в Haskell, и в OCaml язык можно вызывать из программ на Си. Насколько возможно было бы создать собственные приложения для Windows, Mac или Linux, которые широко использовали эту технику?

(я знаю, что есть библиотеки GUI, такие как wxHaskell, но предположим, что кто-то просто хотел иметь часть вашей логики приложения на иностранном языке.)

Или это ужасная идея?

Ответы [ 5 ]

5 голосов
/ 24 апреля 2010

Что ж, главный риск в том, что, несмотря на то, что средства существуют, они не очень хорошо протестированы - не так много приложений делают это. У вас не должно быть проблем с вызовом Haskell из C, выглядит довольно просто:

http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

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

4 голосов
/ 26 апреля 2010

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

Преимущества очевидны: GUI является съемным и заменяемым, автоматизированные тесты проще, регистрация и отладка гораздо проще.

4 голосов
/ 24 апреля 2010

Вы также можете встроить OCaml в C (см. руководство ), хотя это не так часто, как расширение OCaml с помощью C.

3 голосов
/ 26 апреля 2010

Я широко использую это, компилируя совместно используемые библиотеки на Haskell, которые вызываются за пределами Haskell.

Обычно для этого нужно:

  1. создавать правильные декларации внешнего экспорта
  2. создать хранимые экземпляры для любых типов данных, которые необходимо маршалировать
  3. создать структуры C (или структуры на языке, который вы используете), чтобы прочитать эту информацию
  4. , поскольку я нехочу вручную инициализировать RTS haskell, я добавляю код инициализации / завершения в саму библиотеку.(dllmain в windows __attribute__ ((конструктор)) в unix)
  5. , поскольку мне больше не нужен ни один из них, я создаю файл .def, чтобы скрыть все функции closure и rts от нахождения в таблице экспорта (windows)
  6. использовать GHC для компиляции всего вместе

Эти задачи довольно автоматизированы и структурированы, так что вы могли бы написать что-нибудь для их автоматизации.Фактически, я использую это для себя - это инструмент, который я создал, который выполняет трассировку зависимостей от функций, которые вы пометили для экспорта, и он обернет их и скомпилирует для вас разделяемую библиотеку вместе с предоставлением вам объявлений на C / C ++.

(к сожалению, этот инструмент еще не взломан, потому что есть кое-что, что мне еще нужно исправить и протестировать, прежде чем я смогу это сделать)

Инструмент доступен здесь http://hackage.haskell.org/package/Hs2lib-0.4.8

2 голосов
/ 26 апреля 2010

Или это ужасная идея?

Это совсем не ужасная идея. Но, как отмечает Дон Стюарт, это, вероятно, менее проторенный путь. Вы, безусловно, могли бы запустить свою программу как Haskell или OCaml, а затем сделать так, чтобы она выполняла вызов сторонней функции прямо из стартового гейта - и я рекомендую вам структурировать свой код таким образом - но это не меняет того факта, что многие другие из Хаскелла в С, чем из С в Хаскелл. Аналогично для OCaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...