Executando um programa Haskell no sistema operacional Android

216

Nota: Esta é uma extensão do encadeamento iniciado em / r / haskell

Vamos começar com os fatos:

  • Android é um sistema operacional incrível
  • Haskell é a melhor linguagem de programação do planeta

Portanto, combiná-los claramente tornaria o desenvolvimento do Android muito melhor. Então, basicamente, eu gostaria de saber como escrever programas Haskell para o sistema operacional Android. Minha pergunta é:

Como posso executar / executar um programa Haskell no sistema operacional Android?

Robert Massaioli
fonte

Respostas:

81

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.

snk_kid
fonte
Eu não sou de modo algum um especialista em Android. Mas hoje me deparei com essa nova classe chamada NativeACtivity desde o nível 9 da API developer.android.com/reference/android/app/NativeActivity.html . Eles dizem que pode ser usado para implementar atividades puramente em código nativo. Eu me pergunto o quão relevante / útil isso é para o nosso propósito? Isso não implica necessidade de interação entre Haskell e Java?
Phil
@Po O NativeActivity faz parte da estrutura de código de cola NDK para Android (Android 2.3) sobre a qual tenho escrito. Ele permitirá que você escreva todo o seu código em C / C ++, mas você não terá um executável nativo, uma biblioteca compartilhada que é chamada pelo Java. Se você escreveu ligações Haskell para NativeActivity, não precisaria escrever ligações entre Java e Haskell, mas como mencionei as APIs NDK são um subconjunto das APIs Java completas, não há APIs nativas para a interface do usuário padrão do Android, por exemplo, você teria para escrever seu próprio em OpenGL (ES) ou escrever ligações JNI-Haskell.
snk_kid
Existe um tutorial sobre como fazer isso?
L01man
Para a primeira parte, entendo que tenho que baixar o JHC. O que tenho para escrever no arquivo inf e como usá-lo? A segunda parte é uma alternativa à primeira. Não sei como fazer o que você disse no terceiro. 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?
L01man
@ L01man Eu respondi sua pergunta na resposta principal por causa do limite de caracteres nos comentários.
8123 snk_kid
16

Existe https://github.com/neurocyte/android-haskell-activity demonstrando a Haskellexecução do código.

gliptak
fonte
4
Filho da ... alguém realmente fez isso! Parabéns.
Robert Massaioli
Vou dar uma olhada nisso em breve. Se parece legítimo, vou alterar a resposta marcada para esta.
Robert Massaioli
Robert, parece legítimo. Mas o neurócito parece não oferecer instruções detalhadas sobre a construção. Leia github.com/neurocyte/android-haskell-activity/issues/1
gliptak
16

Uma linguagem que recentemente chamou minha atenção é a Eta .

O compilador do Eta é um fork do GHC 7.10 que possui um back-end da JVM. É possível usar os arquivos JAR gerados para gravar aplicativos Android e até mesmo usar sua Interface de Função Estrangeira para chamar bibliotecas Java nativas do Android.

Brian McKenna escreveu uma postagem no blog sobre como configurar um projeto do Android Studio para usar uma biblioteca Eta .

Robert Massaioli
fonte
9

Uma vez me deparei com o mesmo segmento do Reddit, mas ele era antigo e os comentários foram fechados. Enviei uma mensagem para o OP, mas não tenho certeza se chegou ao destinatário. Minha sugestão aqui (pode funcionar para Androids mais antigos, onde atividades nativas não eram possíveis).

Eu (desenvolvido em Haskell há algum tempo, mas atualmente mudei para Smalltalk) atualmente estou desenvolvendo uma porta do Squeak VM para o Android. A maneira como estou fazendo isso é semelhante ao que pode ser tratado em um projeto haskell-on-android: um pedaço de código C que precisa ser chamado da parte Java do aplicativo (basicamente tudo o que pode ser feito no Android é manipular vários eventos; um aplicativo não pode pesquisar eventos em si e não possui nenhum loop de eventos). No meu caso, o código é gerado pelas ferramentas de construção da Squeak VM, no caso de haskell no Android, isso será gerado pelo GHC do JHC ou por qualquer front end usado. Vale a pena examinar este repo:

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

Em "src", há o código Java que fornece a interceptação de eventos do usuário e os envia para o código nativo (consulte a classe CogView). O código C da própria VM não está completamente lá (consulte squeakvm.org, o ramo Cog para isso), mas pode-se ter uma idéia. Pode-se também procurar em http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm, que é o frontend C do intérprete (incluindo manipulação de eventos do usuário, algumas cronometragens, etc.). )

Espero que isto ajude.

Dmitry

Dmitry
fonte
6

Eu acho que a resposta geral deve vir das transformações fonte-> fonte, uma vez que carregar objetos compartilhados especialmente compilados parece um pouco problemático (envolvendo ghc-> ce c-> java nas respostas acima). Essa questão, portanto, se enquadra no cabeçalho de Haskell na JVM, que foi tentada (com uma etapa como uma representação intermediária Java) e discutida detalhadamente. Você pode usar o frege se as bibliotecas necessárias forem compiladas lá. As únicas etapas restantes seriam o início da API da estrutura do Android traduzida em ações de IO () e talvez um wrapper para criar o manifesto xml e apk.

David M. Rogers
fonte
1
De fato, existe um aplicativo de vitrine para Android escrito em Java e Frege, os detalhes estão aqui groups.google.com/forum/#!topic/frege-programming-language/…
Ingo