Разница между hsc2hs и c2hs? - PullRequest
23 голосов
/ 15 мая 2011

В чем разница между hsc2hs и c2hs?

Я знаю, что hsc2hs - препроцессор, но что он делает?

И c2hs может делать модули на Haskell из C-кода, но нужна ли мне для этого hsc2hs?

Ответы [ 2 ]

23 голосов
/ 15 мая 2011

Они оба имеют одну и ту же функцию: облегчают написание привязок FFI. Вам не нужно знать о hsc2hs, если вы решили использовать c2hs; они независимы. C2hs более мощный, но также и более сложный: Эдвард З. Ян иллюстрирует эту точку с помощью хорошей диаграммы в своем уроке c2hs :

Когда я должен использовать c2hs? Есть много Препроцессоры Haskell; который из вы должны использовать? Короткий (и несколько неточный) способ охарактеризовать выше иерархия дальше вы идете, тем меньше шаблон у вас есть написать и больше документации ты должен читать; Я так слышал совет, что hsc2hs это то, что вы должны использовать для небольших проектов FFI, а c2hs больше подходит для большего из них.

Вещи, которые поддерживает c2hs, что hsc2hs не:

  • Автоматическая генерация иностранного импорта на основе содержимого C заголовочный файл
  • Полуавтоматическая сортировка вызовов и от вызовов функций и
  • Перевод типов указателей и иерархий в типы Haskell.
10 голосов
/ 16 мая 2011

Михаил ответит хорошо, но есть и другая сторона. Есть также вещи, которые hsc2hs обеспечивает, что c2hs не делает, и может быть необходимо использовать оба вместе.

Примечательно, что hsc2hs работает, создавая исполняемый файл C, который запускается для генерации кода на Haskell, а c2hs непосредственно анализирует заголовочные файлы. Следовательно, hsc2hs позволяет вам получить доступ к #define s и т. Д. Поэтому, хотя я обнаружил, что c2hs лучше подходит для генерации привязок и оберток к привязкам, а также для «глубоких» подсчетов и подсчетов в сложных структурах C, он не подходит для доступа к константам и перечисления, и это лишь слегка автоматизирует шаблон для хранимых экземпляров. Я обнаружил, что hsc2hs также необходим в сочетании с пакетом bindings-dsl [1], в частности, в моем случае для предопределенных констант. В одном случае у меня есть один файл hsc для огромного количества констант и один файл chs для обёртывания функций, которые используют эти константы.

[1] http://hackage.haskell.org/package/bindings-DSL

...