Разница между hsc2hs и c2hs?
В чем разница между hsc2hs и c2hs?
Я знаю, что hsc2hs является препроцессором, но что именно он делает?
И c2hs может делать модули Haskell из C-кода, но нужна ли мне для этого hsc2hs?
2 ответа
Они оба выполняют одну и ту же функцию: упрощают написание привязок FFI. Вам не нужно знать о hsc2hs, если вы решили использовать c2hs; они независимы. C2hs более мощный, но также и более сложный: Эдвард З. Ян иллюстрирует эту точку с помощью хорошей диаграммы в своем уроке по c2hs:
Когда я должен использовать 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 для обёртывания функций, которые используют эти константы.