Распространение программы на Haskell в качестве исходного кода на языке Си

StackOverflow https://stackoverflow.com/questions/1994190

  •  22-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Вы не сможете добраться туда с помощью GHC.Даже когда GHC компилируется через C, он полагается на манипуляции с результирующей сборкой для перетасовки сегментов, огромную систему выполнения и БОЛЬШОЙ багаж.

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

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

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

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

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

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

Могу ли я скомпилировать его на C с помощью GHC, а затем распространить как исходный код C?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top