Запуск программы Haskell на ОС Android


Forenote: это расширение потока, запущенного на /r / haskell

начнем с фактов:

  • Android - это одна потрясающая операционная система
  • Haskell-лучший язык программирования на планете

поэтому, очевидно, что их объединение сделает разработку Android намного лучше. Поэтому, по сути, я просто хотел бы знать, как я могу писать программы Haskell для ОС Android. Мой вопрос это:

Как я могу получить программу Haskell для выполнения/запуска на ОС Android?

6 198

6 ответов:

Как вы это делаете, сначала получив компилятор Haskell, который может предназначаться для C с помощью android NDK, который поставляется с портом GCC для архитектур ARM. JHC может тривиально сделать это с очень маленьким файлом стиля inf, который описывает платформу (размер слова, C-компилятор и т. д.) Я сделал это с помощью Wii homebrew dev kit, и это было довольно легко. Однако у jhc все еще есть некоторые проблемы стабильности со сложным кодом, такие как использование стека трансформатора monad с IO, но jhc значительно улучшился за последние 6 месяцы. Есть только один человек, работающий на JHC я просто хотел, чтобы больше людей могли помочь ему.

другой вариант-построить "незарегистрированный" порт GHC, ориентированный на NDK gcc, это гораздо более сложный процесс, потому что GHC на данный момент не является истинным кросс-компилятором, и вам нужно понять систему сборки, какие части вам нужно изменить. Другой вариант-NHC, который может скомпилироваться в C, например GHC вам нужно построить NHC, ориентированный на компилятор C, NHC не имеет много Haskell расширения, такие как GHC.

после того, как у вас есть Haskell compiler targeting NDK GCC, вам нужно будет написать привязки либо к Android NDK JNI glue code framework (добавлено с android 2.3), либо вы должны написать JNI glue code между Java-C-Haskell, первый вариант является более простым решением, и если я правильно помню, может быть на самом деле обратно совместим с предыдущими версиями Android ниже 2.3.

после этого вы должны построить код Haskell как общую библиотеку или статический библиотека, которая связывается с кодом клея NDK java (который сам является общей библиотекой). Насколько мне известно, вы не можете официально запускать собственные исполняемые файлы на android. Вероятно, вы могли бы сделать это с помощью корневого телефона, поэтому я предполагаю, что это означает, что вы не можете распространять собственные исполняемые файлы в магазине приложений, даже если порт NDK gcc может генерировать собственные исполняемые файлы просто отлично. Это также, вероятно, убивает возможность использования LLVM, если вы не можете заставить NDK JNI работать с LLVM.

самая большая препятствие-это не столько получение компилятора Haskell для android (который по-прежнему является большим препятствием) самая большая проблема заключается в том, что кому-то нужно написать API привязки для библиотек NDK, что является огромной задачей, и ситуация хуже, если вам нужно написать код пользовательского интерфейса android, потому что для этой части Android SDK нет API NDK. Если вы хотите сделать код пользовательского интерфейса android в Haskell, кому-то придется писать привязки Haskell к Java через JNI / C. Если нет более автоматизированного процесса для написания привязки библиотеки (я знаю, что есть некоторые, они просто недостаточно автоматизированы для меня), то шансы на то, что кто-то это сделает, довольно низки.

L01man: есть ли учебник о том, как это сделать? Для первая часть, я понимаю, что мне нужно скачать JHC. Что мне нужно напишите в inf файл и как его использовать?

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

jhc имеет руководство http://repetae.net/computer/jhc/manual.html и раздел о настройке кросс-компиляции И.ini-файл с параметрами: http://repetae.net/computer/jhc/manual.html#crosscompilation.

L01man: вторая часть является альтернативой первой. Я не знаю, как сделать то, что вы сказали в третий.

прежде чем начать, вы должны иметь некоторые знания о C и быть комфортно с использованием интерфейса внешней функции Haskell (FFI) и таких инструментов, как hs2c. вы также должны быть знакомы с использованием Android NDK и здания .apk с общими библиотеками. Вы вам нужно будет знать их, чтобы взаимодействовать между C-Haskell, Java/C-Haskell и разрабатывать программы Haskell для Android, которые вы можете официально распространять/продавать на рынке магазина.

L01man: я понимаю, что его цель-создать привязку для Android API. Но... 4-я часть говорит, что мы не можем сделать .АПК с Хаскелл?

.apk-это просто формат файла пакета приложений и построен с помощью инструментов, которые поставляются с Android SDK (не NDK), это очень мало что можно сделать для создания самих двоичных файлов. Пакеты Android могут содержать собственные общие библиотеки, это то, что ваша программа Haskell будет и собственные общие/статические библиотеки генерируются с помощью Android NDK.

есть https://github.com/neurocyte/android-haskell-activity демонстрация Haskell запуск кода.

однажды я наткнулся на тот же поток Reddit, но он был старым, и комментарии были закрыты. Я отправил сообщение в ОП, но не уверен, дошло ли оно до получателя. Мое предложение здесь (может работать для старых андроидов, где родная деятельность была невозможна).

Я (разработанный в Haskell некоторое время назад, но в настоящее время перешел на Smalltalk) в настоящее время разрабатываю порт Squeak VM для Android. То, как я это делаю, похоже на то, что может быть рассмотрено в a проект haskell-on-android: кусок кода C, который нужно вызвать из Java-части приложения (в основном все, что можно сделать в Android, - это обрабатывать различные события; приложение не может опрашивать сами события и не имеет никакого цикла событий). В моем случае код генерируется инструментами построения скрипа VM, в случае haskell на android это будет выводиться из GHC JHC или любого используемого переднего конца. Это РЕПО может быть стоит посмотреть в:

http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/project

В разделе " src " есть код Java, который обеспечивает перехват пользовательских событий и отправку их в собственный код (см. Класс CogView). Код C самой виртуальной машины не полностью существует (см. squeakvm.org, ветвь винтика для этого), но можно получить идею. Также может выглядеть по http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android / vm который является интерфейсом C для интерпретатора (включая обработку пользовательских событий, некоторый хронометраж и т. д.)

надеюсь, что это помогает.

Дмитрий

язык, который недавно привлек мое внимание Eta.

компилятор Eta-это вилка GHC 7.10, которая имеет бэкэнд JVM. Можно использовать сгенерированные файлы JAR для записи приложений Android и даже использовать его внешний интерфейс функций для вызова собственных библиотек Android Java.

Брайан Маккенна написал сообщение в блоге о как настроить проект Android Studio для использования библиотеки Eta.

Я думаю, что общий ответ должен исходить из преобразований source->source, поскольку загрузка специально скомпилированных общих объектов кажется немного kludge (включая ghc->c и шаг C->java в ответах выше). Таким образом, этот вопрос подпадает под рубрику Haskell на JVM, которая была пробовал (С одним шагом в качестве промежуточного представления Java) и обсуждали в длину. Вы могли бы использовать Фреге Если библиотеки вам нужно скомпилировать там. Единственными оставшимися шагами будут начинания API платформы Android, переведенные в действия IO (), и, возможно, оболочка для создания манифеста xml и apk.

есть https://github.com/conscell/hugs-android порт HUGS Haskell переводчик на Android.