Como você faz isso, primeiro obtendo um compilador Haskell que pode direcionar C com o NDK do Android, que vem com uma porta GCC para arquiteturas ARM. O JHC pode fazer isso trivialmente com um arquivo de estilo inf muito pequeno, que descreve a plataforma (tamanho da palavra, compilador c, etc). Fiz isso com o kit de desenvolvimento do Wii homebrew e foi bastante fácil. No entanto, o jhc ainda tem alguns problemas de estabilidade com códigos complexos, como o uso de uma pilha de transformadores de mônada com E / S, mas o jhc vem melhorando bastante nos últimos 6 meses. Há apenas uma pessoa trabalhando no JHC, que eu gostaria que mais pessoas pudessem ajudá-lo.
A outra opção é criar uma porta "não registrada" do GHC visando o ndk gcc, esse é um processo muito mais complicado, porque o GHC não é um verdadeiro cross-compilador no momento e você precisa entender o sistema de construção com quais partes você precisa. mudança. Outra opção é o NHC, que pode ser compilado de forma cruzada em C, como o GHC, você precisa criar o nhc direcionado a um compilador C; o NHC não possui muitas extensões Haskell como o GHC.
Depois de ter o compilador Haskell direcionado ao NDK GCC, você precisará escrever ligações na estrutura de código de cola NDN JNI do Android (adicionada desde o Android 2.3) ou escrever o código de cola JNI entre Java-C-Haskell, a primeira opção é a mais fácil solução e se bem me lembro pode realmente ser compatível com versões anteriores do Android abaixo de 2,3.
Depois de ter isso, você deve criar o código Haskell como biblioteca compartilhada ou biblioteca estática que é vinculada ao código de cola Java NDK (que é uma biblioteca compartilhada). Tanto quanto sei, você não pode executar oficialmente executáveis nativos no Android. Você provavelmente poderia fazê-lo com um telefone root, portanto, presumo que isso significa que você não pode distribuir executáveis nativos na loja de aplicativos, mesmo quando a porta NDK gcc pode gerar executáveis nativos sem problemas. Isso provavelmente também mata a opção de usar o LLVM, a menos que você possa fazer com que o NDK JNI trabalhe com o LLVM.
O maior obstáculo não é tanto obter um compilador Haskell para Android (o que ainda é um grande obstáculo), o maior problema é que alguém precisa escrever APIs de ligação para bibliotecas NDK, o que é uma tarefa enorme e a situação é pior se você é necessário escrever o código da interface do usuário do Android porque não há APIs NDK para esta parte do SDK do Android. Se você deseja criar o código da interface do usuário do Android no Haskell, alguém terá que escrever as ligações do Haskell no Java por meio do JNI / C. A menos que exista um processo mais automatizado para escrever bibliotecas de ligação (eu sei que existem algumas, elas simplesmente não são automatizadas o suficiente para mim), as chances de alguém fazer isso são bastante baixas.
L01man: Existe um tutorial sobre como fazer isso? Para a primeira parte, entendo que tenho que baixar o JHC. O que tenho para escrever no arquivo inf e como usá-lo?
Observe que, antes de responder a essa pergunta, não uso o jhc há algum tempo desde que escrevi isso originalmente e versões mais recentes foram lançadas desde então, não sei o quão estável o jhc atualmente é quando se trata de geração de código de programas Haskell mais complexos. Este é um aviso para qualquer pessoa antes de considerar fazer um programa Haskell grande com o JHC, você deve fazer alguns pequenos testes antes de continuar.
O jhc possui um manual http://repetae.net/computer/jhc/manual.html e uma seção sobre configuração de compilação cruzada e arquivo .ini com opções: http://repetae.net/computer/jhc/manual .html # compilação cruzada .
L01man: A segunda parte é uma alternativa à primeira. Não sei como fazer o que você disse no terceiro.
Antes de começar, você deve ter algum conhecimento de C e se familiarizar com o uso da interface de função externa Haskell (FFI) e ferramentas como hs2c. Você também deve estar familiarizado com o uso do Android NDK e a criação de .apk com bibliotecas compartilhadas. Você precisará conhecê-los para fazer a interface entre C-Haskell, Java / C-Haskell e desenvolver programas Haskell para Android que você pode distribuir / vender oficialmente na loja do mercado.
L01man: Entendo que seu objetivo é criar uma ligação para a API do Android. Mas ... a quarta parte diz que não podemos fazer .apk com Haskell?
O .apk é apenas um formato de arquivo de pacote de aplicativo e é construído com as ferramentas que acompanham o Android SDK (não o NDK); isso tem muito pouco a ver com a criação dos próprios binários. Os pacotes do Android podem conter bibliotecas compartilhadas nativas; é esse o seu programa Haskell e as bibliotecas compartilhadas / estáticas nativas são geradas pelo NDK do Android.