To, jak to robisz, polega na uzyskaniu kompilatora Haskell, który może celować w C za pomocą Androida NDK, który jest wyposażony w port GCC dla architektur ARM. JHC może w prosty sposób to zrobić za pomocą bardzo małego pliku inf, który opisuje platformę (rozmiar słowa, kompilator c itp.) Zrobiłem to z zestawem deweloperskim Wii homebrew i było to dość łatwe. Jednak jhc wciąż ma pewne problemy ze stabilnością ze złożonym kodem, takie jak stosowanie stosu transformatora monadowego z IO, ale jhc bardzo się poprawił w ciągu ostatnich 6 miesięcy. W JHC pracuje tylko jedna osoba. Chciałbym, żeby więcej osób mogło mu pomóc.
Inną opcją jest zbudowanie „niezarejestrowanego” portu GHC ukierunkowanego na ndk gcc, jest to o wiele bardziej zaangażowany proces, ponieważ GHC nie jest obecnie prawdziwym kompilatorem krzyżowym i musisz zrozumieć system kompilacji, jakie części potrzebujesz zmiana. Inną opcją jest NHC, która może kompilować krzyżowo do C, np. GHC musisz zbudować nhc ukierunkowane na kompilator C, NHC nie ma wielu rozszerzeń Haskell takich jak GHC.
Gdy kompilator Haskell jest ukierunkowany na NDK GCC, będziesz musiał napisać powiązania albo do szkieletu kodu kleju JD dla Androida NDK (dodany od Androida 2.3), albo musisz napisać kod kleju JNI między Java-C-Haskell, pierwsza opcja jest łatwiejsza rozwiązanie i jeśli dobrze pamiętam, może faktycznie być wstecznie kompatybilny z poprzednimi wersjami Androida poniżej 2.3.
Gdy już to zrobisz, musisz zbudować kod Haskell jako bibliotekę współdzieloną lub bibliotekę statyczną, która zostanie połączona z kodem kleju Java NDK (który sam jest biblioteką współdzieloną). O ile mi wiadomo, oficjalnie nie można uruchamiać natywnych plików wykonywalnych na Androidzie. Prawdopodobnie możesz to zrobić przy użyciu zrootowanego telefonu, więc zakładam, że oznacza to, że nie możesz dystrybuować natywnych plików wykonywalnych w sklepie z aplikacjami, nawet jeśli port gcc NDK może generować natywne pliki wykonywalne w porządku. Prawdopodobnie zabija to również opcję korzystania z LLVM, chyba że można uzyskać JN NDK działający z LLVM.
Największą przeszkodą jest nie tyle uzyskanie kompilatora Haskell dla Androida (co wciąż jest dużą przeszkodą). Największym problemem jest to, że ktoś musi napisać wiążące interfejsy API dla bibliotek NDK, co jest ogromnym zadaniem, a sytuacja jest gorsza, jeśli trzeba napisać kod interfejsu użytkownika systemu Android, ponieważ dla tej części zestawu SDK systemu Android nie ma interfejsów API NDK. Jeśli chcesz zrobić kod interfejsu użytkownika Androida w Haskell, ktoś będzie musiał napisać powiązania Haskell do Javy przez JNI / C. O ile nie istnieje bardziej zautomatyzowany proces pisania bibliotek wiążących (wiem, że istnieją, nie są one dla mnie wystarczająco zautomatyzowane), to szanse, że ktoś to zrobi, są dość małe.
L01man: Czy istnieje poradnik na temat tego, jak to zrobić? W pierwszej części rozumiem, że muszę pobrać JHC. Co mam napisać w pliku inf i jak go używać?
Uwaga: zanim odpowiem na to pytanie, nie używałem jhc od dłuższego czasu, odkąd to napisałem, a nowsze wersje zostały wydane, ponieważ nie wiem, jak stabilny jest jhc, jeśli chodzi o generowanie kodu bardziej złożonych programów Haskell. Jest to ostrzeżenie dla każdego, zanim pomyślisz o stworzeniu dużego programu Haskell z JHC, powinieneś zrobić kilka małych testów, zanim przejdziesz do końca.
jhc ma instrukcję http://repetae.net/computer/jhc/manual.html oraz sekcję dotyczącą konfiguracji kompilacji krzyżowej i pliku .ini z opcjami: http://repetae.net/computer/jhc/manual .html # crosscompilation .
L01man: Druga część jest alternatywą dla pierwszej. Nie wiem jak zrobić to, co powiedziałeś w trzecim.
Zanim zaczniesz, powinieneś mieć trochę wiedzy na temat C i wygodnie posługiwać się interfejsem funkcji obcych Haskell (FFI) i narzędziami takimi jak hs2c. Powinieneś także zapoznać się z używaniem Androida NDK i budowaniem .apk ze współdzielonymi bibliotekami. Musisz je znać, aby połączyć C-Haskell, Java / C-Haskell i opracować programy Haskell dla Androida, które możesz oficjalnie dystrybuować / sprzedawać w sklepie na rynku.
L01man: Rozumiem, że jego celem jest utworzenie powiązania dla interfejsu API Androida. Ale ... czy czwarta część mówi, że nie możemy zrobić .apk z Haskellem?
.apk to tylko format pliku pakietu aplikacji i został zbudowany przy użyciu narzędzi dostarczanych z zestawem Android SDK (nie NDK), nie ma to wiele do zrobienia przy tworzeniu samych plików binarnych. Pakiety Androida mogą zawierać natywne biblioteki współdzielone, tym będzie Twój program Haskell, a natywne biblioteki współdzielone / statyczne są generowane za pośrednictwem Android NDK.