Смешивание Haskell и C ++ - PullRequest
       13

Смешивание Haskell и C ++

35 голосов
/ 22 августа 2010

Если бы у вас была возможность иметь приложение, которое использовало бы и Haskell, и C ++.Какие слои вы бы позволили управлять Haskell и какие уровни вы бы позволили управлять C ++?

Кто-нибудь когда-либо делал такую ​​связь, (конечно)?

(сайт Haskell говорит, что это действительноэто просто, потому что в Haskell есть режим, в котором он может быть скомпилирован в C с помощью gcc)

Сначала я думаю, что я бы сохранил все операции ввода-вывода на уровнях C ++.Как и управление графическим интерфейсом.

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

Ответы [ 4 ]

26 голосов
/ 22 августа 2010

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

Преимущество C ++ состоит в том, насколько тесно вы можете оптимизировать его при необходимости.Вы не думаете о монахах, стрелках, частичном применении и составлении чистых функций: с C ++ вы можете перейти прямо к голому металлу!

Между этими двумя утверждениями есть напряжение.В своей статье «Структурированное программирование с go to утверждениями» Дональд Кнут писал:

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

Знание, как использовать Haskell и C ++, а также как и когда комбинировать они хорошо снесут все виды проблем.

Последний большой проект, который я написал, который использовал FFI , включал использование внутренней библиотеки радиолокационного моделирования, написанной на C. Реализовав ее, я быбыло глупо, и выражение логики высокого уровня остальной части приложения было бы болью.Я держал «мозги» этого в Haskell и вызывал библиотеку C, когда мне это было нужно.

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

10 голосов
/ 08 ноября 2010

Вот как я вижу вещи:

  • Функциональные языки превосходят в преобразующие вещи . Всякий раз, когда вы пишете программы, которые принимают входные данные и отображают / фильтруют / сокращают его, используйте функциональные конструкции. Замечательные примеры из реальной жизни, где Haskell должен превзойти себя, даны веб-приложениями (вы в основном преобразуете вещи, хранящиеся в базе данных, в веб-страницы).
  • Процедурные языки (языки ООП являются процедурными) превосходны в побочных эффектах и ​​связи между объектами. Их громоздко использовать для преобразования данных, но всякий раз, когда вы хотите заниматься системным программированием или (двунаправленным) взаимодействием с людьми (пользовательскими интерфейсами любого рода, включая веб-программирование на стороне клиента), они выполняют свою работу чисто.
  • Однако некоторые могут утверждать, что пользовательские интерфейсы должны иметь функциональное описание, я отвечаю, что хорошо зарекомендовавшие себя структуры достаточно просты в использовании с языками ООП, поэтому их следует использовать таким образом. В конце концов, естественно рассматривать компоненты пользовательского интерфейса с точки зрения объектов и связи между объектами.
  • IO - это всего лишь инструмент: всякий раз, когда вы преобразуете ввод в вывод, Haskell (или любой другой язык FP) должен выполнять IO. Всякий раз, когда вы говорите с человеком, C ++ (или любой другой язык ООП) должен выполнять IO.
  • Не волнует скорость. Когда вы используете Haskell для правильной работы, это эффективно. Когда вы используете C ++ или Python для правильной работы, это эффективно.

Поэтому, скажем, я свободно говорю на Haskell, C, C ++ и Python, вот как я пишу приложения:

  • Если основная роль моего приложения заключается в преобразовании данных, я пишу их на Haskell, возможно, с некоторыми низкоуровневыми частями, написанными на C (которые, в свою очередь, могут вызывать некоторые высокотехнологичные низкоуровневые части, написанные на C ++, но я из соображений переносимости остановился бы на C в качестве интерфейса).
  • Если основная роль моего приложения заключается во взаимодействии с пользователем, я пишу его на Python (например, PyQt) и позволяю Python вызывать подпрограммы, критичные к производительности, написанные на C ++ (boost :: python довольно хорош в качестве генератора привязок) , Возможно, мне также придется вызывать подпрограммы, которые преобразуют или извлекают данные, которые будут записаны на Haskell.
  • Если мне нужно написать часть приложения на Haskell, я выделю его в C-callable API.
  • Иногда приложение на Haskell, которое читает данные на stdin и записывает обратно на stdout, полезно в качестве подмодуля (который вы вызываете с помощью fork / exec или любого другого на вашей платформе). Иногда сценарий оболочки является подходящей оболочкой для таких приложений.
7 голосов
/ 23 августа 2010

Этот ответ - скорее история, чем исчерпывающий ответ, но я использовал смесь Haskell, Python и C ++ для своей диссертации в области компьютерной лингвистики, а также несколько инструментов на C и Java, которые я не писал.Я обнаружил, что проще всего запускать все как отдельный процесс, используя Python в качестве связующего кода для запуска программ на Haskell, C ++ и Java.

C ++ был довольно простым, трудным циклом, который подсчитывал появления объектов.В основном все, что он делал, было математикой и простым вводом / выводом.Я фактически управлял опциями, заставляя клейкий код Python записывать заголовок, полный #define s, и перекомпилировать.Вроде хак, но это сработало.

На Haskell была вся промежуточная обработка: получение сложного вывода из различных анализаторов C и Java, которые я использовал, фильтрация посторонних данных и преобразование их в простой формат кода C ++.ожидается.Затем я взял вывод C ++ и преобразовал его в разметку LaTeX (среди других форматов).

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

Поскольку я использовал Haskellво многом как более структурированный язык сценариев, я закончил тем, что написал несколько утилит для ввода / вывода файлов, но помимо этого было достаточно встроенных библиотек для манипулирования списками и деревьями.

В итоге, если у вас естьКак и моя проблема, я бы предложил C ++ для ограниченного по памяти, критичного по скорости компонента, Haskell для высокоуровневых преобразований и Python для запуска всего этого.

5 голосов
/ 22 августа 2010

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

Одним из самых больших преимуществ Haskell является инкапсуляция ввода-вывода в монады. Пока этот ввод-вывод не критичен по времени, я не вижу причин делать это в C ++.

Что касается графического интерфейса, вы, вероятно, правы. Существует множество библиотек GUI на Haskell, но в C ++ есть мощные инструменты, такие как QtCreator, которые значительно упрощают утомительные задачи.

...