web-dev-qa-db-ja.com

Android OSでHaskellプログラムを実行する

注:これは / r/haskell で開始されたスレッドの拡張です。

事実から始めましょう:

  • Androidは素晴らしいオペレーティングシステムの1つです
  • Haskellは地球上で最高のプログラミング言語です

したがって、明らかに、それらを組み合わせると、Android開発がはるかに良くなります。したがって、本質的には、Android OS私の質問は:

Android OSでHaskellプログラムを実行/実行するにはどうすればよいですか?

208

最近注目された言語は Eta です。

Etaのコンパイラは、JVMバックエンドを備えたGHC 7.10のフォークです。生成されたJARファイルを使用してAndroidアプリを記述し、その外部関数インターフェイスを使用してネイティブAndroid Javaライブラリーを呼び出すこともできます。

Brian McKennaが、Etaライブラリを使用するようにAndroid St​​udioプロジェクトを構成する方法 についてのブログ投稿を書いています

12

その方法は、最初にAndroid NDKにCをターゲットにできるHaskellコンパイラを入手することです。これには、ARMアーキテクチャ用のGCCポートが付属します。プラットフォーム(Wordサイズ、cコンパイラなど)を記述する非常に小さなinfスタイルファイルを使用してこれを実行します。これはWii homebrew開発キットを使用して実行しましたが、非常に簡単でした。たとえば、IOでモナド変換器スタックを使用するが、jhcは過去6か月で大幅に改善されています。JHCで作業している人は1人だけです。

もう1つのオプションは、ndk gccをターゲットとするGHCの「未登録」ポートを構築することです。現時点ではGHCは真のクロスコンパイラではないため、ビルドシステムを理解する必要があります。変化する。別のオプションは、Cコンパイラをターゲットとするnhcを構築する必要があるGHCのように、CにクロスコンパイルできるNHCです。NHCにはGHCのような多くのHaskell拡張がありません。

HaskellコンパイラーがNDK GCCをターゲットにしたら、Android NDK JNIグルーコードフレームワーク(Android 2.3以降に追加された)またはJava-C-Haskellの間にJNIグルーコードを記述する必要があります。前者の方が簡単な解決策です。正しく覚えていれば、実際には以前のバージョンのAndroid以下2.3.

これができたら、Haskellコードを共有ライブラリまたはNDK Javaグルーコード(それ自体は共有ライブラリ))にリンクされる静的ライブラリとしてビルドする必要があります。 Androidでネイティブ実行可能ファイルを公式に実行することはできません。おそらくルート化された電話で実行できます。したがって、NDK gccポートがネイティブ実行可能ファイルを正常に生成できる場合でも、アプリストアでネイティブ実行可能ファイルを配布できないことを意味すると思いますNLL JNIをLLVMで動作させることができない場合を除き、LLVMを使用するオプションを強制終了します。

最大のハードルは、Android(まだ大きなハードルです)のHaskellコンパイラを取得することではありません。最大の問題は、一部の人がNDKライブラリのバインディングAPIを記述する必要があることです。 Android UIコードを記述する必要がある場合、Android SDK。このSDKの部分にはNDK APIがありません。 Android HaskellのUIコードは、誰かがHaskellバインディングをJava JNI/Cを介して記述する必要があります。バインディングライブラリを記述するより自動化されたプロセスがない限り(私はいくつかあることを知っています、それらは私のために十分に自動化されていません)それからそれをする誰かの可能性は非常に低いです。

L01man:これを行う方法に関するチュートリアルはありますか?最初の部分では、JHCをダウンロードする必要があることを理解しています。 infファイルに何を書き込む必要があり、どのように使用するのですか?

この質問に答える前に、最初にこれを書いてから新しいバージョンがリリースされて以来、かなり長い間jhcを使用していないことに注意してください。そのため、より複雑なHaskellプログラムのコード生成に関して、jhcが現在どの程度安定しているかはわかりません。これは、JHCを使用して大規模なHaskellプログラムを作成することを検討する前にだれにも警告するものです。完全に実行する前に、いくつかの小さなテストを行う必要があります。

jhcには、マニュアル http://repetae.net/computer/jhc/manual.html と、クロスコンパイルおよび.iniファイルのセットアップに関するセクションがあります: http: //repetae.net/computer/jhc/manual.html#crosscompilation

L01man:2番目の部分は最初の部分に代わるものです。 3番目にあなたが言ったことをどうやってやるかわからない。

始める前に、Cについてある程度の知識があり、Haskellの外部関数インターフェイス(FFI)とhs2cなどのツールの使用に慣れている必要があります。また、Android NDKを使用し、共有ライブラリを使用して.apkを構築することに精通している必要があります。C-Haskell、Java/C-Haskell間のインターフェイス、およびAndroidマーケットストアで公式に配布/販売できます。

L01man:その目標はAndroid APIのバインディングを作成することだと理解しています。しかし...第4部ではHaskellで.apkを作成できないと言っていますか?

.apkは単なるアプリパッケージファイル形式であり、Android SDK(NDKではない)に付属するツールを使用して構築されます。これは、バイナリ自体を構築することはほとんどありません。Androidパッケージにはネイティブ共有ライブラリを含めることができます。これはHaskellプログラムになり、ネイティブ共有/静的ライブラリはAndroid NDKを介して生成されます。

80
snk_kid

https://github.com/neurocyte/Android-haskell-activity が実行されているHaskellコードを示しています。

15
gliptak

私はかつて同じRedditスレッドに出くわしましたが、それは古く、コメントは閉じられていました。 OPにメッセージを送信しましたが、受信者に届いたかどうかわかりません。ここでの私の提案(ネイティブアクティビティが不可能な古いAndroidで動作する可能性があります)。

私(少し前にHaskellで開発されましたが、現在Smalltalkに切り替えられています)は現在、Squeakのポートを開発していますVM Androidへ。これを行う方法は、 haskell-on-Androidプロジェクト:アプリケーションの一部であるJavaから呼び出される必要があるCコードの塊(基本的には、Android =はさまざまなイベントを処理することです;アプリケーションはイベント自体をポーリングすることはできず、イベントループもありません。私の場合、コードはSqueak VM haskell on Androidこれは、JHCのGHCまたはフロントエンドが使用したものから出力されます。このレポは一見の価値があります。

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

「src」の下にJavaコードがあり、ユーザーイベントをインターセプトしてネイティブコードに送信します(CogViewクラスを参照)。VM自体は完全に存在するわけではありません(そのためのCogブランチであるsqueakvm.orgを参照)が、アイデアは得られるかもしれません。 http://gitorious.org/ 〜golubovsky/cogvm/dmg-blessed/trees/master/platforms/Android/vm これはインタープリターのCフロントエンドです(ユーザーイベント処理、タイムキーピングなどを含む)

お役に立てれば。

ドミトリー

9
Dmitry

https://github.com/conscell/hugs-Android AndroidへのHUGS Haskellインタープリターのポートがあります。

7
conscell

特別にコンパイルされた共有オブジェクトをロードするのは少し手間がかかるように思えるので、一般的な答えはソースからソースへの変換から来ると思います(ghc-> cと上記の答えのc-> Javaステップを含む)。したがって、この質問はJVMのHaskellの見出しに該当します。これは 試行済み (Java中間表現としての1ステップ)および 議論 at length。 frege を使用できます。ライブラリをそこでコンパイルする必要がある場合。残りの手順は、AndroidフレームワークAPIをIO( )アクションと、マニフェストxmlおよびapkを構築するためのラッパー。

6
David M. Rogers