Подтвердить что ты не робот

Разница между hsc2hs и c2hs?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Михаил ответ хороший, но есть и другая сторона. Есть также вещи, которые 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