Android OSでのHaskellプログラムの実行


216

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

事実から始めましょう:

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

したがって、明らかに、それらを組み合わせると、Androidの開発がはるかに改善されます。したがって、本質的に私は、Android OS用のHaskellプログラムを作成する方法を知りたいだけです。私の質問は:

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

回答:


81

その方法は、最初にARMアーキテクチャ用のGCCポートが付属するAndroid NDKでCをターゲットにできるHaskellコンパイラを入手することです。JHCは、プラットフォーム(ワードサイズ、cコンパイラなど)を記述した非常に小さなinfスタイルファイルで簡単にこれを行うことができます。ただし、jhcには、IOでモナド変換スタックを使用するなど、複雑なコードの安定性の問題がいくつかありますが、jhcは過去6か月間で大幅に改善されています。JHCに取り組んでいる人は1人だけです。

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

NDK GCCをターゲットとするHaskellコンパイラを作成したら、Android NDK JNIグルーコードフレームワーク(Android 2.3以降で追加)にバインディングを書き込むか、Java-C-Haskell間でJNIグルーコードを書き込む必要があります。前者のオプションの方が簡単ですソリューションと私が正しく覚えている場合は、2.3以前のAndroidの以前のバージョンと実際に下位互換性がある可能性があります。

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

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

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番目の部分は最初の部分の代替です。私はあなたが三番目に言ったことをどうやってやるかわかりません。

始める前に、Cについてある程度の知識があり、Haskell外部関数インターフェース(FFI)とhs2cなどのツールの使用に慣れている必要があります。また、Android NDKの使用と共有ライブラリを使用した.apkの構築についても理解している必要があります。C-Haskell、Java / C-Haskell間のインターフェースを確立し、Android向けにHaskellプログラムを開発して市場ストアで正式に配布/販売できるようにするには、これらを知る必要があります。

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

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


私は決してAndroidのエキスパートではありません。しかし、今日私はAPIレベル9 developer.android.com/reference/android/app/NativeActivity.html以来、NativeACtivityと呼ばれるこの新しいクラスに出くわしました。彼らは純粋にネイティブコードでアクティビティを実装するために使用できると言います。これは私たちの目的にとってどれほど関連性があり、便利なのでしょうか。これはHaskellとJavaの間の相互作用の必要がないことを意味しますか?
Phil

@Po NativeActivityは、私が書いてきたandroid NDKグルーコードフレームワーク(android 2.3)の一部です。C / C ++ですべてのコードを記述できますが、ネイティブ実行可能ファイルはなく、Javaから呼び出される共有ライブラリーがあります。NativeActivityへのHaskellバインディングを作成した場合、JavaとHaskellの間のバインディングを作成する必要はありませんが、NDK APIは完全なJava APIのサブセットであるため、標準のAndroid UI用のネイティブAPIはありません。 OpenGL(ES)で独自に作成したり、JNI-Haskellバインディングを作成したりします。
snk_kid

これを行う方法についてのチュートリアルはありますか?
L01man 2012年

最初の部分では、JHCをダウンロードする必要があることを理解しています。infファイルに何を記述し、どのように使用する必要がありますか?2番目の部分は最初の部分の代替です。私はあなたが三番目に言ったことをどうやってやるかわかりません。その目的はAndroid APIのバインディングを作成することであることを理解しています。しかし... 4番目の部分では、Haskellで.apkを作成できないと言っていますか?
L01man 2012

@ L01manコメントの文字数制限のため、メインの回答で質問に回答しました。
snk_kid 2012

16

実行中のコードを示すhttps://github.com/neurocyte/android-haskell-activityがありますHaskell


4
の息子...実際に誰かがやった!称賛。
ロバートマサイオリ2013年

これについてはすぐに詳しく見ていきます。正当と思われる場合は、マークされた回答をこれに変更します。
Robert Massaioli 2013年

ロバート、それは合法のようです。しかし、神経細胞はビルドに関する詳細な指示を提供していないようです。github.com/neurocyte/android-haskell-activity/issues/1
gliptak

16

最近気になった言語はイータですです。

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

Brian McKennaが、Etaライブラリを使用するようにAndroid Studioプロジェクトを構成する方法に関するブログ投稿を書きました


9

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

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

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

「src」の下には、ユーザーイベントのインターセプトを提供してネイティブコードに送信するJavaコードがあります(CogViewクラスを参照)。VM自体のCコードは完全にはそこにはありません(そのためのCogブランチであるsqueakvm.orgを参照)。また、http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm、インタプリタへのCフロントエンド(ユーザーイベントの処理、一部の計時などを含む)。 )

お役に立てれば。

ドミトリー



6

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


1
実際には、Javaとフレーゲで書かれたショーケースのAndroidアプリが存在し、詳細はこちらですgroups.google.com/forum/#!topic/frege-programming-language/...
インゴ・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.