В чем разница между hsc2hs и c2hs?
Я знаю, что hsc2hs является препроцессором, но что он делает?
И c2hs может сделать модули Haskell из C-кода, но для этого мне нужны hsc2hs?
В чем разница между hsc2hs и c2hs?
Я знаю, что hsc2hs является препроцессором, но что он делает?
И c2hs может сделать модули Haskell из C-кода, но для этого мне нужны hsc2hs?
Оба они имеют одну и ту же функцию: упростить запись привязок FFI. Вам не нужно знать о hsc2hs, если вы решили использовать c2hs; они независимы. C2hs является более мощным, но также более сложным: Эдвард З. Ян иллюстрирует этот момент с хорошей диаграммой в своем c2hs tutorial:
Когда следует использовать c2hs? Есть много Предварительные процессоры Haskell; который из следует ли использовать? Короткий (и несколько неточный) способ характеризовать выше иерархии, ниже вы идете, тем меньше у вас писать и больше документации вы должны читать; Я так слышал совет, что hsc2hs - это то, что вам нужно использовать для небольших проектов FFI, тогда как c2hs более подходит для более крупных из них.
Вещи, которые c2hs поддерживают, что hsc2hs не:
- Автоматическая генерация иностранного импорта на основе содержимого C заголовочный файл
- Полуавтоматическая сортировка по функциональным вызовам и обратно и
- Перевод типов и иерархий указателей в типы Haskell.
Михаил ответ хороший, но есть и другая сторона. Есть также вещи, которые hsc2hs обеспечивает, что c2hs не делает, и может быть необходимо использовать оба вместе.
Примечательно, что hsc2hs работает, создавая исполняемый файл C, который запускается для генерации кода Haskell, в то время как c2hs анализирует файлы заголовков напрямую. Поэтому hsc2hs позволяет вам получить доступ к #define
s и т.д. Так что, пока я нашел c2hs лучше для создания привязок и оберток для привязок, а также для "глубоких" заглянов и врываний в сложные структуры C, это не хорошо для доступа к константам и перечисления, и он только автоматизирует только шаблонный шаблон для запоминаемых экземпляров. Я также нашел hsc2hs в сочетании с пакетом bindings-dsl [1], в частности, в моем случае для предопределенных констант. В одном случае у меня есть один файл hsc для огромного количества констант и один файл chs для обертывания функций, которые используют эти константы.