2010-04-24 1 views
6

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

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

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

+0

http://mldonkey.sourceforge.net/Main_Page – grettke

+0

http://coherentpdf.com/blog/?tag=ocaml – grettke

+0

Caveat (http://www-list.cea.fr/labos/gb/LSL/ caveat/index.html) является инструментом проверки для критического встроенного C, написанного в основном на C++, но который использует OCaml в качестве языка сценариев (журнал Caml, созданный во время интерактивного сеанса, может быть скомпилирован и связан с Caveat, который будет воспроизведен в любое время) , –

ответ

3

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

обычно задачи, связанные бы

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

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

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

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

5

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

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

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

4

Вы можете вставлять OCaml в C, а также (см the manual), хотя это не так часто делается как расширение OCaml с С.

2

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

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

4

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

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