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

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

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

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

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

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

P.S. Игнорируйте шутки выше, потому что это честный вопрос, и я действительно хотел бы, чтобы это произошло.

Ответ 1

Недавно я обратил внимание на Eta.

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

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

Ответ 2

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

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

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

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

Самое большое препятствие заключается не в том, чтобы получить компилятор Haskell для андроида (который все еще является большим препятствием), самая большая проблема заключается в том, что кому-то нужно написать API-интерфейсы привязки для библиотек NDK, что является огромной задачей, и ситуация хуже, если вам нужно написать код пользовательского интерфейса Android, потому что для этой части SDK Android нет 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 с Haskell?

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

Ответ 4

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

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

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

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

Надеюсь, что это поможет.

Дмитрий

Ответ 5

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