Esecuzione di un programma Haskell sul sistema operativo Android


216

Forenote: questa è un'estensione del thread avviato su / r / haskell

Cominciamo con i fatti:

  • Android è un fantastico sistema operativo
  • Haskell è il miglior linguaggio di programmazione del pianeta

Pertanto, chiaramente, combinarli renderebbe lo sviluppo di Android molto migliore. Quindi, in sostanza, vorrei solo sapere come posso scrivere i programmi Haskell per il sistema operativo Android. La mia domanda è:

Come posso ottenere / eseguire un programma Haskell sul sistema operativo Android?

Risposte:


81

Il modo in cui lo fai è innanzitutto ottenere un compilatore Haskell che può indirizzare C con Android NDK che viene fornito con una porta GCC per architetture ARM. JHC può farlo banalmente con un file in stile inf molto piccolo che descrive la piattaforma (dimensioni delle parole, compilatore c, ecc.). L'ho fatto con il kit di sviluppo homebrew Wii ed è stato abbastanza semplice. Tuttavia, jhc ha ancora alcuni problemi di stabilità con codice complesso come l'utilizzo di uno stack di trasformatori monad con IO, ma jhc è migliorato molto negli ultimi 6 mesi. C'è solo una persona che lavora su JHC. Ho solo desiderato che più persone potessero aiutarlo.

L'altra opzione è quella di costruire una porta "non registrata" di GHC indirizzata a ndk gcc, questo è un processo molto più coinvolto perché GHC non è un vero cross-compilatore al momento e devi capire il sistema di costruzione di quali parti hai bisogno modificare. Un'altra opzione è NHC che può eseguire la compilazione incrociata in C, come GHC è necessario creare nhc indirizzato a un compilatore C, NHC non ha molte estensioni Haskell come GHC.

Una volta che hai il compilatore Haskell destinato a NDK GCC, dovrai scrivere i collegamenti al framework del codice della colla JNI NDK per Android (aggiunto da Android 2.3) oppure devi scrivere il codice della colla JNI tra Java-C-Haskell, la prima opzione è la più semplice soluzione e se ricordo bene potrebbe effettivamente essere retrocompatibile con le versioni precedenti di Android sotto 2.3.

Una volta ottenuto questo, è necessario creare il codice Haskell come libreria condivisa o libreria statica che viene collegata al codice colla NDK Java (che a sua volta è una libreria condivisa). Per quanto ne so, non è possibile eseguire ufficialmente eseguibili nativi su Android. Probabilmente potresti farlo con un telefono rootato, quindi presumo che ciò significhi che non puoi distribuire eseguibili nativi sull'app store anche quando la porta gcc NDK può generare eseguibili nativi bene. Questo probabilmente uccide anche l'opzione per l'utilizzo di LLVM a meno che non sia possibile far funzionare NDK JNI con LLVM.

Il più grande ostacolo non è tanto quello di ottenere un compilatore Haskell per Android (che è ancora un grande ostacolo) il problema più grande è che qualcuno ha bisogno di scrivere API vincolanti per le librerie NDK che è un compito enorme e la situazione è peggiore se si è necessario scrivere il codice dell'interfaccia utente Android perché non ci sono API NDK per questa parte dell'SDK Android. Se vuoi fare il codice dell'interfaccia utente Android in Haskell qualcuno dovrà scrivere i collegamenti Haskell su Java tramite JNI / C. A meno che non ci sia un processo più automatizzato per scrivere librerie di rilegatura (so che ce ne sono alcune, non sono abbastanza automatizzate per me), allora le possibilità che qualcuno lo faccia sono abbastanza basse.

L01man: Esiste un tutorial su come farlo? Per la prima parte, capisco che devo scaricare JHC. Cosa devo scrivere nel file inf e come usarlo?

Si prega di notare prima di rispondere a questa domanda che non uso jhc da un po 'di tempo da quando ho scritto questa versione originale e sono state rilasciate versioni più recenti da allora, quindi non so quanto sia stabile jhc attualmente quando si tratta di generare codice di programmi Haskell più complessi. Questo è un avvertimento per chiunque prima di prendere in considerazione la possibilità di creare un grande programma Haskell con JHC, è necessario eseguire alcuni piccoli test prima di proseguire.

jhc ha un manuale http://repetae.net/computer/jhc/manual.html e una sezione sull'impostazione della compilazione incrociata e del file .ini con opzioni: http://repetae.net/computer/jhc/manual .html # crosscompilation .

L01man: la seconda parte è un'alternativa alla prima. Non so come fare quello che hai detto nel terzo.

Prima di iniziare, dovresti avere qualche conoscenza di C ed essere a tuo agio con l'uso dell'interfaccia di funzione esterna (FFI) di Haskell e strumenti come hs2c. Dovresti anche avere familiarità con l'utilizzo di Android NDK e la creazione di .apk con librerie condivise. Dovrai conoscerli per interfacciarti tra C-Haskell, Java / C-Haskell e sviluppare programmi Haskell per Android che puoi distribuire / vendere ufficialmente sul market store.

L01man: Capisco che il suo obiettivo è creare un'associazione per l'API Android. Ma ... la quarta parte dice che non possiamo fare .apk con Haskell?

.apk è solo un formato di file del pacchetto di app ed è costruito con gli strumenti forniti con Android SDK (non NDK), questo ha ben poco da fare per costruire i binari stessi. I pacchetti Android possono contenere librerie condivise native, questo sarà il tuo programma Haskell e le librerie native / condivise statiche vengono generate tramite Android NDK.


Non sono affatto un esperto di Android. Ma oggi mi sono imbattuto in questa nuova classe chiamata NativeACtivity dal livello API 9 developer.android.com/reference/android/app/NativeActivity.html . Dicono che può essere utilizzato per implementare attività puramente nel codice nativo. Mi chiedo quanto sia rilevante / utile questo per il nostro scopo? Ciò non implica alcuna interazione tra Haskell e Java?
Phil

@Po The NativeActivity fa parte del framework del codice della colla NDK per Android (Android 2.3) di cui ho scritto. Ti permetterà di scrivere tutto il tuo codice in C / C ++ ma non avrai un eseguibile nativo, avrai una libreria condivisa che viene chiamata da Java. Se hai scritto i collegamenti di Haskell su NativeActivity non avresti bisogno di scrivere collegamenti tra Java e Haskell ma, come ho già detto, le API NDK sono un sottoinsieme delle API Java complete, ad esempio non avresti API native per l'interfaccia utente Android standard per scrivere il tuo in OpenGL (ES) o scrivere i collegamenti JNI-Haskell.
snk_kid

Esiste un tutorial su come eseguire questa operazione?
L01man,

Per la prima parte, capisco che devo scaricare JHC. Cosa devo scrivere nel file inf e come usarlo? La seconda parte è un'alternativa alla prima. Non so come fare quello che hai detto nel terzo. Comprendo che il suo obiettivo è creare un'associazione per l'API Android. Ma ... la quarta parte dice che non possiamo fare .apk con Haskell?
L01man,

@ L01man Ho risposto alla tua domanda nella risposta principale a causa del limite di caratteri nei commenti.
snk_kid


16

C'è https://github.com/neurocyte/android-haskell-activity che dimostra l' Haskellesecuzione del codice.


4
Figlio di un ... qualcuno l'ha fatto davvero! Complimenti.
Robert Massaioli,

Daremo un'occhiata più da vicino a questo presto. Se sembra legittimo, ho intenzione di cambiare la risposta contrassegnata a questo.
Robert Massaioli,

Robert, sembra legittimo. Ma i neurociti non sembrano offrire istruzioni dettagliate sulla build. Leggi github.com/neurocyte/android-haskell-activity/issues/1
gliptak il

9

Una volta mi sono imbattuto nello stesso thread di Reddit, ma era vecchio e i commenti erano chiusi. Ho inviato un messaggio all'OP, ma non sono sicuro che abbia raggiunto il destinatario. Il mio suggerimento qui (potrebbe funzionare per gli androidi più anziani in cui le attività native non erano possibili).

Io (sviluppato in Haskell qualche tempo fa, ma attualmente passato a Smalltalk) sto attualmente sviluppando una porta di Squeak VM su Android. Il modo in cui lo sto facendo è simile a quello che potrebbe essere trattato in un progetto haskell-su-android: un grumo di codice C che deve essere chiamato dalla parte Java dell'applicazione (in pratica tutto ciò che si può fare in Android è gestire vari eventi; un'applicazione non può eseguire il polling degli eventi stessi e non ha alcun loop di eventi). Nel mio caso il codice viene generato dagli strumenti di costruzione di Squeak VM, nel caso di haskell su Android questo verrà emesso da GHC di JHC o da qualunque front-end utilizzato. Potrebbe essere utile esaminare questo repository:

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

In "src" è presente il codice Java che fornisce l'intercettazione degli eventi utente e l'invio al codice nativo (vedere la classe CogView). Il codice C della VM stessa non è completamente presente (vedi squeakvm.org, il ramo Cog per quello), ma si potrebbe avere l'idea. Si potrebbe anche consultare http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm che è il frontend C per l'interprete (inclusa la gestione degli eventi dell'utente, un po 'di cronometraggio, ecc. )

Spero che questo ti aiuti.

Dmitry



6

Penso che la risposta generale dovrebbe venire dalle trasformazioni source-> source, dal momento che il caricamento di oggetti condivisi appositamente compilati sembra essere un po 'un kludge (che coinvolge ghc-> c e un passaggio c-> java nelle risposte sopra). Questa domanda rientra quindi sotto il titolo di Haskell sulla JVM, che è stata provata (con un passo come rappresentazione intermedia di Java) e discussa a lungo. Puoi usare frege se le librerie che devi compilare lì. Gli unici passaggi rimanenti sarebbero gli inizi dell'API del framework Android tradotti in azioni IO () e forse un wrapper per la creazione di manifest xml e apk.


1
In effetti, esiste un'app Android in vetrina scritta in Java e Frege, i dettagli sono qui groups.google.com/forum/#!topic/frege-programming-language/…
Ingo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.