Uruchamianie programu Haskell na Android OS

Uwaga: jest to rozszerzenie wątku rozpoczętego na / R / haskell

Zacznijmy od faktów:

  • Android to jeden niesamowity system operacyjny
  • Haskell jest najlepszym językiem programowania na świecie]}

Dlatego oczywiście ich połączenie uczyniłoby rozwój Androida o wiele lepszym. Więc zasadniczo chciałbym tylko wiedzieć, jak mogę pisać programy Haskell dla systemu operacyjnego Android. Moje pytanie brzmi:

Jak mogę dostać Haskell program do wykonania/uruchomić na Android OS?

Author: Aaron Hall, 2011-03-01

6 answers

Jak to zrobić, to najpierw uzyskać kompilator Haskell, który może celować C z Androidem NDK, który jest wyposażony w port GCC dla architektur ARM. JHC może trywialnie zrobić to z bardzo małym plikiem w stylu inf, który opisuje platformę (word size, C-compiler, itp.) zrobiłem to z Wii homebrew DEV kit i było to dość proste. Jednak jhc nadal ma pewne problemy ze stabilnością ze złożonym kodem, takie jak używanie stosu transformatorów monad z IO, ale jhc poprawiło się znacznie w ciągu ostatnich 6 miesięcy. Na JHC pracuje tylko jedna osoba. szkoda tylko, że więcej osób może mu pomóc.

Inną opcją jest zbudowanie "niezarejestrowanego" portu GHC kierującego NDK gcc, jest to o wiele bardziej zaangażowany proces, ponieważ GHC nie jest obecnie prawdziwym cross-kompilatorem i musisz zrozumieć system budowania, jakie części trzeba zmienić. Inną opcją jest NHC, który może cross-kompilacji do C, jak GHC trzeba zbudować NHC kierowania kompilatora C, NHC nie ma wiele rozszerzeń Haskell jak GHC.

Gdy masz Haskell compiler targeting NDK GCC, będziesz musiał napisać wiązania albo android NDK JNI glue code framework (dodany od Androida 2.3) lub musisz napisać kod JNI glue między Java-C-Haskell, pierwsza opcja jest łatwiejszym rozwiązaniem i jeśli dobrze pamiętam może faktycznie być wstecznie kompatybilny z poprzednimi wersjami Androida poniżej 2.3.

Gdy już to masz, musisz zbudować kod Haskell jako bibliotekę współdzieloną lub bibliotekę statyczną, która dostaje połączony z kodem NDK java glue (który sam jest biblioteką współdzieloną). O ile mi wiadomo, nie można oficjalnie uruchamiać natywnych plików wykonywalnych na Androidzie. Prawdopodobnie można to zrobić z zakorzenione telefon, więc zakładam, że oznacza to, że nie można rozpowszechniać natywne pliki wykonywalne w app store nawet wtedy, gdy port NDK gcc może generować natywne pliki wykonywalne tylko dobrze. To również prawdopodobnie zabija opcję używania LLVM, chyba że możesz uzyskać NDK JNI współpracujące z LLVM.

Największa przeszkoda to nie tyle uzyskanie kompilatora Haskell dla Androida (który jest nadal dużą przeszkodą) największym problemem jest to, że ktoś musi napisać wiążące API dla bibliotek NDK, co jest ogromnym zadaniem i sytuacja jest gorsza, jeśli trzeba napisać kod interfejsu użytkownika Androida, ponieważ nie ma NDK API dla tej części android SDK. Jeśli chcesz zrobić kod UI Androida w Haskell ktoś będzie musiał napisać wiązania Haskell do Javy przez JNI / C. chyba że istnieje bardziej zautomatyzowany proces pisania bibliotek wiążących (wiem, że tam są niektóre, po prostu nie są wystarczająco zautomatyzowane dla mnie) wtedy szanse na to, że ktoś to robi są dość niskie.

L01man: czy jest jakiś tutorial Jak to zrobić? Na pierwsza część, rozumiem, że muszę pobrać JHC. Co mam zrobić zapis w pliku inf i jak z niego korzystać?

Proszę zwrócić uwagę zanim odpowiem na to pytanie nie używałem jhc od dłuższego czasu odkąd napisałem to i nowsze wersje zostały wydane od tego czasu więc nie wiem jak stabilny jhc obecnie jest, jeśli chodzi o generowanie kodu bardziej złożonych programów Haskell. Jest to Ostrzeżenie dla każdego, zanim rozważysz zrobienie dużego programu Haskell z JHC, powinieneś zrobić kilka małych testów przed przejściem na całość.

Jhc ma instrukcję http://repetae.net/computer/jhc/manual.html I sekcja o konfigurowaniu kompilacji krzyżowej i .plik ini z opcjami: http://repetae.net/computer/jhc/manual.html#crosscompilation .

L01man: The druga część jest alternatywą dla pierwszej. Nie wiem, jak zrobić to, co powiedziałeś w trzeci.

Zanim zaczniesz, powinieneś mieć trochę wiedzy na temat C i być wygodnym w użyciu Haskell foreign function interface (FFI) i narzędzi takich jak hs2c. powinieneś również być zaznajomiony z używaniem Android NDK i budowania .apk z bibliotekami współdzielonymi. Musisz wiedzieć, że do interfejsu między C-Haskell, Java / C-Haskell i rozwijać Haskell programy dla Androida, które można oficjalnie dystrybuować/sprzedawać na rynku sklepu.

L01man: rozumiem, że jego celem jest stworzenie oprawy dla Android API. Ale... czy czwarta część mówi, że nie możemy zrobić .apk z Haskell?

.apk to tylko format pliku pakietu aplikacji i jest zbudowany z narzędzi, które pochodzą z Android SDK (nie NDK), ma to bardzo niewiele do zrobienia, budując same binaria. Pakiety Android mogą zawierać natywne biblioteki współdzielone, to, co program Haskell będzie i natywne biblioteki współdzielone / statyczne są generowane za pośrednictwem systemu Android NDK.

 78
Author: snk_kid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-08 22:58:43

Jest https://github.com/neurocyte/android-haskell-activity demonstrowanie Haskell działania kodu.

 12
Author: gliptak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 22:08:27

Kiedyś natknąłem się na ten sam wątek, ale był stary, a komentarze były zamknięte. Wysłałem wiadomość do OP, ale nie jestem pewien, czy dotarła do odbiorcy. Moja sugestia tutaj (może działać dla starszych androidów, gdzie rodzime działania nie były możliwe).

I (opracowany w Haskell jakiś czas temu, ale obecnie przełączony na Smalltalk) obecnie rozwija port Squeak VM DO Androida. Sposób, w jaki to robię, jest podobny do tego, co można sobie poradzić w haskell-on-android projekt: bryła kodu C, którą należy wywołać z części aplikacji Java (w zasadzie wszystko, co można zrobić w Androidzie, to obsługiwać różne zdarzenia; aplikacja nie może sama sprawdzać zdarzeń i nie ma pętli zdarzeń). W moim przypadku kod jest generowany przez Squeak vm narzędzia budowlane, w przypadku haskell na Androida będzie to wyjście z GHC JHC lub cokolwiek front end używany. To repo może być warte obejrzenia at:

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

Pod "src" znajduje się kod Javy, który zapewnia przechwytywanie zdarzeń użytkownika i wysyłanie ich do kodu natywnego (patrz Klasa CogView). Kod C samej maszyny Wirtualnej nie istnieje w pełni (zobacz squeakvm.org, gałąź Cog do tego), ale można się zorientować. Można też zajrzeć pod http://gitorious.org/ ~ golubovsky/cogvm/dmg-blessed/trees/master/platforms/android / vm, który jest nakładką C do interpretera (w tym obsługa zdarzeń użytkownika, czasomierz itp.)

Mam nadzieję, że to pomoże.

Dmitry

 9
Author: Dmitry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-04 17:44:34

Język, który ostatnio zwrócił moją uwagę to Eta .

Kompilator Eta jest forkiem GHC 7.10, który ma backend JVM. Możliwe jest użycie wygenerowanych plików JAR do pisania aplikacji na Androida, a nawet korzystania z jego interfejsu funkcji zagranicznych do wywoływania natywnych bibliotek Java Android.

Brian McKenna napisał post na blogu o Jak skonfigurować projekt Android Studio, aby korzystał z biblioteki Eta.

 7
Author: Robert Massaioli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 23:14:26

Myślę, że ogólna odpowiedź powinna pochodzić z transformacji source->source, ponieważ ładowanie specjalnie skompilowanych obiektów współdzielonych wydaje się być trochę kłopotliwe (włączając GHC->c i krok C->java w odpowiedziach powyżej). Ta kwestia jest więc pod nagłówkiem Haskell na JVM, który został wypróbowany (z jednym krokiem jako pośredni reprezentacji Java) i omówione w długości. Możesz użyć frege, jeśli biblioteki, które chcesz tam skompilować. Jedyny pozostałe kroki to początki API Android framework przetłumaczone na działania IO() i być może opakowanie do budowania manifestu xml i apk.

 6
Author: David M. Rogers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-13 07:32:53
 6
Author: conscell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-14 23:32:33