2010-06-24 2 views
10

Каковы мои возможности в плане быстрого функционального языка для использования библиотеки в кросс-платформенном приложении Qt C++?Хороший межплатформенный функциональный язык для использования библиотеки в приложении C++?

Кажется, что почти все языки (функциональные или нет) имеют некоторый способ вызова кода C/C++ простым способом. Я хотел бы пойти наоборот: напишите приложение в Qt, используя C++ для логики состояния, GUI и т. Д., Но выпадайте и используйте функциональный язык для основной библиотеки вычислений.

Какие из них просты в использовании таким образом? Может ли, например, код OCaml быть скомпилирован в статическую библиотеку, а затем использован приложением C++?

Спасибо, Rickard

+0

Также: существует зависимость от скорости, так как функциональный код выполняет как можно более тяжелые вычисления (решение PDE с использованием методов с конечными разностями). – Rickard

ответ

5

Haskell имеет такую ​​возможность, хотя взаимодействие с Qt/QMAKE и процесс сборки с GHC может занять немного хитрости, чтобы получить работу:

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

Существует также проект под названием HaskellDirect, который, кажется, похож к вашей цели, а также:

http://www.haskell.org/hdirect/

+0

У меня возникает соблазн пойти по этой дороге. Это небольшой некоммерческий проект, поэтому очень мало риска, кроме моего свободного времени. Я предполагаю, что время выполнения haskell не будет иметь проблем с параллелизмом и что я могу одновременно вызвать библиотеку из нескольких потоков? Я, вероятно, приму этот ответ через некоторое время, хотя, возможно, это был немного субъективный вопрос без четкого «правильного» ответа. – Rickard

2

AutoCAD использует AutoLisp так что мое предложение было бы Lisp.

+0

У меня слишком мало опыта работы с Lisp, но мне интересно, может ли компилятор Lisp создавать c-расходный байт-код, поэтому я просто могу вызвать функции в библиотеке? Я хочу, чтобы избежать необходимости использовать интерпретатор, встроенный в приложение (например, когда один встраивает Python в приложение C, и вам приходится возиться с подсчетом ссылок и PyObject *, чтобы вызвать функцию). – Rickard

+0

Şerbănoiu: Да, но AutoLisp был создан специально для встраивания в AutoCAD. Это не означает, что все Lisps автоматически обладают свойством, что их функции можно легко вызвать из кода на C++.Обратите внимание, что он не пытается внедрить язык в свое приложение C++, но вызывать скомпилированный библиотечный код, написанный на другом языке из своего приложения. – sepp2k

2

Я был бы соблазн проверить qtHaskell и сделать все это в Haskell. Мое мнение основано на замечательном успехе Дона Стюарта, который делает xmonad in Haskell.

+0

Это заманчиво, но я хочу как можно меньше полагаться на порты библиотек (например, qt). Некоторые вещи также очень легко подходят для классов на C++, когда речь идет о логике состояния. В любом случае, спасибо за ваш ответ - я обязательно рассмотрю возможность. – Rickard

1

Lisp и Haskell - отличные функциональные языки, но если мы рассмотрим легкость связывания кода C/C++ вместе с языком, я бы порекомендовал lua.

Сложно связывать функции C с lua сразу же с места в карьер, интерпретатор является суперкомпактной и простой библиотекой для сборки, это один из самых быстрых языков сценариев, и с luabind вы можете легко связывать классы C++ , экземпляры шаблонов и т. д. Мне приходилось делать привязки для многих языков сценариев в прошлом, и я никогда не нашел одно, что было бы столь же просто, как и lua. Он также поддерживается swig, если вы предпочитаете связывать вещи через swig, что позволит вашему приложению поддерживать несколько языков сценариев.

С точки зрения чистого языка, мета-функция/метапрограммирующий аспект lua (сопоставимый с lisp) позволяет очень легко поддерживать все виды парадигм программирования, хотя я лично считаю, что он лучше всего подходит для функционального программирования. Он чрезвычайно настраиваемый и хорошо подходит для встроенного использования.

Однако, поскольку вы уже используете qt, qtHaskell может быть хорошим выбором для рассмотрения.

+0

Возможно, Lua - гораздо лучший выбор для таких вещей, но я знаю, что проблемы с внедрением и запуском кода Python из приложения C/C++. Это гораздо больше работы, чем просто инициализировать некоторую среду выполнения, а затем вызвать функции. Однако я посмотрю на C-api в документации Lua. Я слышал великие вещи о скорости Луа, так что это, безусловно, интересно. Спасибо за ответ. – Rickard

Смежные вопросы