Распространение программы на 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.
Вы можете иметь больше примеров здесь.