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

216

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

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

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

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

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

Роберт Массайоли
источник

Ответы:

81

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

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

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

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

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.

snk_kid
источник
Я ни в коем случае не эксперт по Android. Но сегодня я столкнулся с этим новым классом под названием NativeACtivity начиная с уровня API 9 developer.android.com/reference/android/app/NativeActivity.html . Говорят, его можно использовать для реализации действий исключительно в нативном коде. Интересно, насколько это актуально / полезно для наших целей? Не подразумевает ли это необходимости взаимодействия между Haskell и Java?
Фил
@Po NativeActivity является частью структуры связующего кода Android NDK (Android 2.3), о которой я писал. Это позволит вам писать весь ваш код на C / C ++, но у вас не будет собственного исполняемого файла, у вас будет общая библиотека, которая вызывается из Java. Если вы написали привязки Haskell для NativeActivity, вам не нужно было бы писать привязки между Java и Haskell, но, как я уже говорил, API-интерфейсы NDK являются подмножеством полных API-интерфейсов Java, для стандартного пользовательского интерфейса Android нет собственных API, например, вы бы имели написать свой собственный в OpenGL (ES) или написать привязки JNI-Haskell.
snk_kid
Есть ли учебник о том, как это сделать?
L01man
Для первой части я понимаю, что я должен загрузить JHC. Что я должен написать в файле inf и как его использовать? Вторая часть является альтернативой первой. Я не знаю, как сделать то, что вы сказали в третьем. Я понимаю, что его целью является создание привязки для Android API. Но ... в 4-й части говорится, что мы не можем сделать .apk с Haskell?
L01man
@ L01man Я ответил на твой вопрос в основном ответе из-за ограничения символов в комментариях.
snk_kid
17

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

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

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

Роберт Массайоли
источник
16

Существует https://github.com/neurocyte/android-haskell-activity, демонстрирующий выполнение Haskellкода.

gliptak
источник
4
Сын ... кто-то на самом деле сделал это! Престижность.
Роберт Массайоли
Я собираюсь поближе взглянуть на это в ближайшее время. Если это кажется законным, тогда я собираюсь изменить помеченный ответ на этот.
Роберт Массайоли
Роберт, это кажется законным. Но нейроцит не предлагает подробных инструкций по сборке. Читайте github.com/neurocyte/android-haskell-activity/issues/1
gliptak
9

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

Я (разработал в 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-интерфейсом для интерпретатора (включая обработку пользовательских событий, некоторую хронометражу и т. Д.). )

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

Дмитрий

Дмитрий
источник
6

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

Дэвид М. Роджерс
источник
1
Фактически, существует демонстрационное Android-приложение, написанное на Java и Frege, подробности здесь groups.google.com/forum/#!topic/frege-programming-language/…
Ingo