その方法は、最初に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を介して生成されます。