Menjalankan program Haskell di OS Android

216

Forenote: Ini adalah perpanjangan dari utas yang dimulai pada / r / haskell

Mari kita mulai dengan fakta:

  • Android adalah salah satu Sistem Operasi yang luar biasa
  • Haskell adalah bahasa pemrograman terbaik di planet ini

Karena itu, jelas, menggabungkan mereka akan membuat pengembangan Android jauh lebih baik. Jadi intinya saya hanya ingin tahu bagaimana saya bisa menulis program Haskell untuk OS Android. Pertanyaanku adalah:

Bagaimana saya bisa mendapatkan program Haskell untuk menjalankan / menjalankan pada OS Android?

Robert Massaioli
sumber

Jawaban:

81

Cara Anda melakukannya adalah dengan terlebih dahulu mendapatkan kompiler Haskell yang dapat menargetkan C dengan NDK android yang dilengkapi dengan port GCC untuk arsitektur ARM. JHC sepele dapat melakukan ini dengan file gaya inf sangat kecil yang menggambarkan platform (ukuran kata, c-compiler, dll) Saya sudah melakukan ini dengan kit homebrew dev Wii dan itu cukup mudah. Namun jhc masih memiliki beberapa masalah stabilitas dengan kode kompleks seperti menggunakan tumpukan trafo monad dengan IO tetapi jhc telah meningkat banyak selama 6 bulan terakhir. Hanya ada satu orang yang bekerja di JHC. Saya hanya berharap lebih banyak orang bisa membantunya.

Opsi lainnya adalah membangun port GHC "tidak terdaftar" yang menargetkan ndk gcc, ini lebih banyak proses yang terlibat karena GHC bukan kompilator silang sejati saat ini dan Anda perlu memahami sistem build bagian mana yang Anda butuhkan. perubahan. Opsi lain adalah NHC yang dapat melakukan kompilasi silang ke C, seperti GHC yang Anda butuhkan untuk membangun nhc yang menargetkan kompiler C, NHC tidak memiliki banyak ekstensi Haskell seperti GHC.

Setelah Anda memiliki kompiler Haskell yang menargetkan NDK GCC, Anda harus menulis binding ke kerangka kerja kode lem NDK JNI android (ditambahkan sejak android 2.3) atau Anda harus menulis kode lem JNI antara Java-C-Haskell, opsi sebelumnya adalah lebih mudah solusi dan jika saya ingat dengan benar mungkin sebenarnya kompatibel dengan versi Android sebelumnya di bawah 2.3.

Setelah Anda memiliki ini, Anda harus membangun kode Haskell sebagai shared library atau perpustakaan statis yang akan ditautkan ke kode lem java NDK (yang itu sendiri adalah shared library). Sejauh yang saya ketahui Anda tidak dapat secara resmi menjalankan executable asli di android. Anda mungkin dapat melakukannya dengan ponsel yang di-rooting, jadi saya berasumsi ini berarti Anda tidak dapat mendistribusikan executable asli di app store bahkan ketika port gcc NDK dapat menghasilkan executable asli dengan baik. Ini juga mungkin membunuh opsi untuk menggunakan LLVM kecuali Anda bisa mendapatkan NDK JNI bekerja dengan LLVM.

Rintangan terbesar tidak begitu banyak untuk mendapatkan kompiler Haskell untuk android (yang masih merupakan rintangan besar) masalah terbesar adalah bahwa seseorang perlu menulis API yang mengikat untuk perpustakaan NDK yang merupakan tugas besar dan situasinya lebih buruk jika Anda perlu menulis kode UI Android karena tidak ada NDK API untuk bagian SDK android ini. Jika Anda ingin melakukan kode UI Android di Haskell, seseorang harus menulis binding Haskell ke Java melalui JNI / C. Kecuali ada proses yang lebih otomatis untuk menulis perpustakaan yang mengikat (saya tahu ada beberapa, mereka tidak cukup otomatis untuk saya) maka kemungkinan seseorang melakukannya cukup rendah.

L01man: Apakah ada tutorial tentang cara melakukan ini? Untuk bagian pertama, saya mengerti saya harus mengunduh JHC. Apa yang harus saya tulis di file inf dan bagaimana cara menggunakannya?

Harap dicatat sebelum saya menjawab pertanyaan ini, saya belum pernah menggunakan jhc untuk beberapa waktu sejak saya awalnya menulis ini dan versi yang lebih baru telah dirilis sejak jadi saya tidak tahu seberapa stabil jhc saat ini ketika datang ke pembuatan kode program Haskell yang lebih kompleks. Ini adalah peringatan bagi siapa pun sebelum Anda mempertimbangkan untuk membuat program Haskell besar dengan JHC, Anda harus melakukan beberapa tes kecil sebelum melanjutkan.

jhc memang memiliki manual http://repetae.net/computer/jhc/manual.html dan bagian tentang pengaturan kompilasi silang dan file .ini dengan opsi: http://repetae.net/computer/jhc/manual .html # kompilasi silang .

L01man: Bagian kedua adalah alternatif dari yang pertama. Saya tidak tahu bagaimana melakukan apa yang Anda katakan pada yang ketiga.

Sebelum Anda mulai, Anda harus memiliki pengetahuan tentang C dan merasa nyaman dengan menggunakan antarmuka fungsi asing Haskell (FFI) dan alat-alat seperti hs2c. Anda juga harus terbiasa menggunakan Android NDK dan membangun .apk dengan perpustakaan bersama. Anda perlu mengetahui hal ini untuk menghubungkan antara C-Haskell, Java / C-Haskell dan mengembangkan program Haskell untuk Android yang dapat Anda distribusikan / jual secara resmi di market store.

L01man: Saya mengerti bahwa tujuannya adalah untuk membuat pengikatan untuk Android API. Tapi ... apakah bagian ke-4 mengatakan kita tidak bisa membuat .apk dengan Haskell?

.apk hanyalah format file paket aplikasi dan dibangun dengan alat-alat yang datang dengan Android SDK (bukan NDK), ini sangat sedikit untuk membangun binari itu sendiri. Paket Android dapat berisi pustaka bersama asli, ini akan seperti apa program Haskell Anda dan pustaka bersama / statis asli dihasilkan melalui Android NDK.

snk_kid
sumber
Saya bukan ahli Android. Tapi hari ini saya menemukan kelas baru ini yang disebut NativeACtivity sejak API level 9 developer.android.com/reference/android/app/NativeActivity.html . Mereka mengatakan itu dapat digunakan untuk melaksanakan kegiatan murni dalam kode asli. Saya ingin tahu seberapa relevan / bermanfaatnya ini untuk tujuan kita? Apakah ini menyiratkan tidak perlu interaksi antara Haskell dan Java?
Phil
@Po The NativeActivity adalah bagian dari kerangka kerja kode lem NDK android (android 2.3) yang telah saya tulis. Ini akan memungkinkan Anda untuk menulis semua kode Anda di C / C ++ tetapi Anda tidak akan memiliki executable asli, Anda akan memiliki perpustakaan bersama yang dipanggil dari Jawa. Jika Anda menulis binding Haskell ke NativeActivity, Anda tidak perlu menulis binding antara Java & Haskell tetapi seperti yang saya sebutkan API NDK adalah subset dari API Java penuh, tidak ada API asli untuk UI android standar misalnya Anda akan memiliki untuk menulis sendiri di OpenGL (ES) atau menulis binding JNI-Haskell.
snk_kid
Apakah ada tutorial tentang cara melakukan ini?
L01man
Untuk bagian pertama, saya mengerti saya harus mengunduh JHC. Apa yang harus saya tulis di file inf dan bagaimana cara menggunakannya? Bagian kedua adalah alternatif dari yang pertama. Saya tidak tahu bagaimana melakukan apa yang Anda katakan pada yang ketiga. Saya mengerti bahwa tujuannya adalah untuk membuat ikatan untuk API Android. Tapi ... apakah bagian ke-4 mengatakan kita tidak bisa membuat .apk dengan Haskell?
L01man
@ L01man Saya sudah menjawab pertanyaan Anda di jawaban utama karena batas karakter di komentar.
snk_kid
16

Ada https://github.com/neurocyte/android-haskell-activity mendemonstrasikan Haskellkode berjalan.

gliptak
sumber
4
Anak seorang ... seseorang benar-benar melakukannya! Pujian.
Robert Massaioli
Saya akan melihat lebih dekat ini segera. Jika tampaknya sah maka saya akan mengubah jawaban yang ditandai untuk yang ini.
Robert Massaioli
Robert, sepertinya memang sah. Tetapi neurocyte tampaknya tidak menawarkan instruksi terperinci tentang pembangunan. Baca github.com/neurocyte/android-haskell-activity/issues/1
gliptak
16

Bahasa yang baru-baru ini menjadi perhatian saya adalah Eta .

Compiler Eta adalah fork dari GHC 7.10 yang memiliki backend JVM. Dimungkinkan untuk menggunakan file JAR yang dihasilkan untuk menulis aplikasi Android dan bahkan menggunakan Antarmuka Fungsi Asingnya untuk memanggil perpustakaan Android Java asli.

Brian McKenna telah menulis posting blog tentang cara mengkonfigurasi proyek Android Studio untuk menggunakan perpustakaan Eta .

Robert Massaioli
sumber
9

Saya pernah menemukan utas Reddit yang sama, tetapi sudah lama, dan komentar ditutup. Saya mengirim pesan ke OP, tetapi tidak yakin apakah pesan itu sampai ke penerima. Saran saya di sini (dapat bekerja untuk Android yang lebih tua di mana kegiatan asli tidak dimungkinkan).

Saya (dikembangkan di Haskell beberapa waktu lalu, tetapi saat ini beralih ke Smalltalk) saat ini saya sedang mengembangkan port Squeak VM ke Android. Cara saya melakukan ini mirip dengan apa yang mungkin ditangani dalam proyek haskell-on-android: segumpal kode C yang perlu dipanggil dari bagian aplikasi Java (pada dasarnya semua yang dapat dilakukan di Android adalah untuk menangani berbagai acara; aplikasi tidak dapat melakukan polling untuk acara itu sendiri dan tidak memiliki loop acara). Dalam kasus saya, kode dihasilkan oleh alat bangunan Squeak VM, dalam kasus haskell di android ini akan menjadi output dari GHC JHC atau apa pun ujung depan yang digunakan. Repo ini mungkin layak dilihat:

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

Di bawah "src" ada kode Java yang menyediakan untuk intersepsi acara pengguna dan mengirimkannya ke kode asli (lihat kelas CogView). Kode C dari VM itu sendiri tidak sepenuhnya ada di sana (lihat squeakvm.org, cabang Cog untuk itu), tetapi orang mungkin mendapatkan idenya. Seseorang juga dapat melihat di bawah http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm yang merupakan C frontend ke penerjemah (termasuk penanganan acara pengguna, ketepatan waktu pengguna, dll. )

Semoga ini membantu.

Dmitry

Dmitry
sumber
6

Saya pikir jawaban umum harus berasal dari sumber -> transformasi sumber, karena memuat objek yang dikompilasi khusus tampaknya menjadi sedikit kludge (melibatkan ghc-> c dan langkah c-> java dalam jawaban di atas). Pertanyaan ini dengan demikian berada di bawah judul Haskell pada JVM, yang telah dicoba (dengan satu langkah sebagai representasi perantara Java) dan dibahas panjang lebar. Anda dapat menggunakan frege jika pustaka yang Anda perlukan kompilasi di sana. Satu-satunya langkah yang tersisa adalah permulaan API kerangka Android yang diterjemahkan ke dalam tindakan IO () dan mungkin pembungkus untuk membangun manifes xml dan apk.

David M. Rogers
sumber
1
Bahkan, ada aplikasi Android showcase yang ditulis dalam Java dan Frege, detailnya ada di sini groups.google.com/forum/#!topic/frege-programming-language/…
Ingo