Распространение программы на Haskell как источника C

Скажем, у меня есть программа или библиотека на Haskell, которую я хотел бы сделать доступной не-Хаскеллерам, возможно, программистам на Си. Могу ли я скомпилировать его в C, используя GHC, а затем распространить его как источник C?

Если это возможно, кто-нибудь может привести минимальный пример? (например, Makefile)

Можно ли использовать GHC для автоматического определения того, какие флаги и заголовки компилятора нужны, а затем, возможно, связать это в одну папку?

По сути, я заинтересован в том, чтобы иметь возможность писать части программ на C и Haskell, а затем распространять их как tarball, но не требуя, чтобы у цели были установлены GHC и Cabal.

7 ответов

Решение

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

Вы просите об огромной инфраструктуре, которую вряд ли найдете. Помните, что любая программа на Haskell, даже если она собирается быть скомпилированной в C, почти наверняка будет зависеть от большой и сложной системы времени выполнения для ее правильной работы. Как минимум, эта система времени выполнения должна поддерживать сборку мусора и ленивую оценку. Таким образом, у вас есть больше, чем просто проблема перевода.

Я предлагаю вам решить эту проблему как проблему распространения программного обеспечения. Вместо tarball предоставьте пакет для вашей любимой дистрибутивной платформы (Debian, Red Hat, InstallShield и т. Д.). Лично, чтобы повторно использовать усилия других людей, я бы нацелился на то, что проверяет Cabal, устанавливает Cabal, если необходимо, а затем использует Cabal для установки всего остального, что потребуется вашим пользователям.

Вы можете сделать это с JHC. Это полноценный оптимизирующий компилятор, который компилируется до C. Он не имеет все модные расширения, которые поддерживает GHC.

Даже если бы ты мог, я бы не назвал это "С источником". GHC может использовать C как часть своей системы компиляции, но сгенерированный код C даже немного не читается. Даже если бы его можно было прочитать и понять, не было бы никакого смысла изменять его, потому что нет никакого способа (кроме обратного переноса изменений в Haskell) включить любые изменения, сделанные хакерами C, в будущие версии вашей программы.

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

Вы не можете получить там с GHC. Даже когда он компилируется через C, GHC полагается на манипулирование получающейся сборкой, чтобы перетасовать сегменты вокруг, огромную систему времени выполнения и МНОГО багажа.

С другой стороны, вам, возможно, повезет больше, если то, что вы хотите, поддерживается более ограниченным набором функций компилятора JHC Джона Мичама, который генерирует довольно компактный C-вывод.

Я знаю, что это старый пост, но я все еще хотел упомянуть ajhc. Ajhc подписал соглашение с JHC о планах добавления новых функций и последующей отправки обновлений обратно в JHC.

Скажем, у меня есть программа или библиотека на Haskell, которую я хотел бы сделать доступной не-Хаскеллерам, возможно, программистам на Си. Могу ли я скомпилировать его в C, используя GHC, а затем распространить его как источник C

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

По сути, я заинтересован в том, чтобы иметь возможность писать части программ на C и Haskell, а затем распространять их как tarball, но не требуя, чтобы у цели были установлены GHC и Cabal.

Я не знаю каких-либо решений, которые не связаны с GHC. Вы должны были бы распространять как минимум Haskell RTS.

Могу ли я скомпилировать его в C, используя GHC, а затем распространить его как источник C?

Нет, это невозможно, но вы можете легко создать интерфейс между haskell и c, используя интерфейс внешних функций (FFI) Haskell.

Вы можете иметь больше примеров здесь.

Другие вопросы по тегам