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


216

Примітка. Це розширення потоку, розпочатого на / r / haskell

Почнемо з фактів:

  • Android - це одна дивовижна операційна система
  • Haskell - найкраща мова програмування на планеті

Тому, очевидно, їх поєднання зробить розробку Android набагато кращою. Тому по суті я просто хотів би знати, як я можу писати програми Haskell для ОС Android. Моє запитання:

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

Відповіді:


81

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

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

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

Після цього ви повинні створити код Haskell як спільну бібліотеку або статичну бібліотеку, яка з’єднується з кодом клею NDK java (який сам по собі є спільною бібліотекою). Наскільки я знаю, ви не можете офіційно запускати нативні виконавчі файли на android. Ви, ймовірно, могли б зробити це з укоріненим телефоном, тому я припускаю, що це означає, що ви не можете поширювати нативні виконавчі файли в магазині додатків, навіть коли порт GDC NDK може просто генерувати вбудовані файли. Це також, ймовірно, вбиває можливість використання LLVM, якщо ви не зможете отримати NDK JNI, що працює з LLVM.

Найбільша перешкода - це не стільки отримання компілятора Haskell для android (що все ще є великою перешкодою). Найбільша проблема полягає в тому, що комусь потрібно написати прив'язуючі API для бібліотек NDK, що є величезним завданням, і ситуація гірша, якщо ти потрібно написати код UI для android, оскільки для цієї частини SDK для android немає API NDK. Якщо ви хочете зробити Android-код UI в 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. Але ... чи говорить четверта частина, що ми не можемо зробити .apk з Haskell?

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


Я аж ніяк не експерт 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, не існує стандартних API для стандартного інтерфейсу Android, наприклад, у вас написати свій власний у OpenGL (ES) або написати прив'язки JNI-Haskell.
snk_kid

Чи є підручник про те, як це зробити?
L01man

У першій частині я розумію, що мені потрібно завантажити JHC. Що я повинен записати у inf-файл і як ним користуватися? Друга частина - це альтернатива першій. Я не знаю, як зробити те, що ви сказали в третьому. Я розумію, що його мета - створити прив'язку для Android API. Але ... чи говорить четверта частина, що ми не можемо зробити .apk з Haskell?
L01man

@ L01man Я відповів на ваше запитання в головній відповіді через обмеження кількості персонажів у коментарях.
snk_kid

17

Мова, яка нещодавно мені прийшла до уваги, - це Ета .

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

Брайан МакКенна написав допис у блозі про те, як налаштувати проект Android Studio для використання бібліотеки Eta .


16

Існує https://github.com/neurocyte/android-haskell-activity, що демонструє Haskellзапущений код.


4
Сину ... хтось насправді це зробив! Кудос.
Роберт Массайолі

Я скоро ознайомлюсь детальніше з цим. Якщо це здається законним, я збираюся змінити помічену відповідь на цю.
Роберт Массайолі

Роберто, це здається законним. Але нейроцит, здається, не пропонує детальних інструкцій щодо складання. Читайте github.com/neurocyte/android-haskell-activity/isissue/1
gliptak

9

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

Я (розроблявся в Haskell деякий час тому, але зараз перейшов на Smalltalk), зараз розробляю порт Squeak VM для Android. Те, що я роблю це, схоже на те, що може бути вирішено в проекті haskell-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). Код С самої ВМ не повністю (див. Squeakvm.org, гілка Cog для цього), але можна отримати ідею. Можна також заглянути під http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm, що є межею С для інтерпретатора (включаючи обробку подій користувача, деякий час зберігання часу тощо). )

Сподіваюсь, це допомагає.

Дмитро



6

Я думаю, що загальна відповідь має надходити від джерел-> вихідних перетворень, оскільки завантаження спеціально складених спільних об'єктів здається трохи хиткою (за участю 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.