Android işletim sisteminde bir Haskell programı çalıştırma


216

Forenote: Bu, / r / haskell'de başlatılan iş parçacığının bir uzantısıdır

Hadi gerçeklerle başlayalım:

  • Android harika bir İşletim Sistemidir
  • Haskell gezegendeki en iyi programlama dilidir

Bu nedenle, açıkça, bunları birleştirmek Android geliştirmeyi çok daha iyi hale getirecektir. Yani aslında Android işletim sistemi için Haskell programlarını nasıl yazabileceğimi bilmek istiyorum. Sorum şu:

Android işletim sisteminde bir Haskell programını nasıl çalıştırabilir / çalıştırabilirim?

Yanıtlar:


81

Bunu nasıl yapacağınız ilk önce ARM mimarileri için bir GCC portu ile birlikte gelen android NDK ile C'yi hedefleyebilen bir Haskell derleyicisi alarak. JHC bunu Wii homebrew dev kit ile yaptığım platformu (kelime boyutu, c-derleyici, vb) açıklayan çok küçük bir inf tarzı dosya ile yapabilirsiniz ve oldukça kolay oldu. Ancak jhc hala IO ile bir monad transformatör yığını kullanmak gibi karmaşık kod ile ilgili bazı istikrar sorunları var ama jhc son 6 ay içinde çok gelişiyor. JHC üzerinde çalışan sadece bir kişi var, ona daha fazla insanın yardım etmesini diledim.

Diğer seçenek, ndk gcc'yi hedefleyen bir "kayıtsız" GHC portu oluşturmaktır, bu çok daha karmaşık bir süreçtir, çünkü GHC şu anda gerçek bir çapraz derleyici değildir ve yapı sistemine hangi parçalara ihtiyacınız olduğunu anlamanız gerekir değişiklik. Başka bir seçenek, C'ye çapraz derlenebilen NHC'dir, GHC gibi bir C derleyicisini hedefleyen nhc oluşturmanız gerekir, NHC'nin GHC gibi birçok Haskell uzantısı yoktur.

NDK GCC'yi hedefleyen Haskell derleyicisine sahip olduğunuzda, android NDK JNI tutkal kodu çerçevesine (android 2.3'ten beri eklenmiştir) bağlamalar yazmanız veya Java-C-Haskell arasında JNI tutkal kodunu yazmanız gerekir, eski seçenek daha kolaydır ve doğru hatırlamıyorsam, Android 2.3'ün altındaki önceki sürümleriyle geriye dönük olarak uyumlu olabilir.

Bunu yaptıktan sonra, Haskell kodunu paylaşılan kütüphane veya NDK java tutkal koduna (kendisi paylaşılan bir kütüphane olan) bağlanan statik kütüphane olarak oluşturmanız gerekir. Bildiğim kadarıyla resmen android yerel yürütülebilir çalıştırmak olamaz. Muhtemelen köklü bir telefonla yapabilirsin, bu yüzden bu NDK gcc portu yerel yürütülebilir dosyaları gayet iyi üretebilse bile uygulama mağazasında yerel yürütülebilir dosyaları dağıtamayacağınız anlamına gelir. NDK JNI'nin LLVM ile çalışmasını sağlayamazsanız, bu muhtemelen LLVM kullanma seçeneğini de öldürür.

En büyük engel android için bir Haskell derleyici (bu hala büyük bir engel) almak o kadar büyük değil. android SDK'nın bu kısmı için NDK API'si olmadığından android UI kodu yazmanız gerekir. Eğer Haskell android UI kodu yapmak istiyorsanız, birileri JNI / C aracılığıyla Java Haskell bağları yazmak zorunda kalacak. Bağlama kütüphaneleri yazmak için daha otomatik bir süreç olmadığı sürece (bazıları olduğunu biliyorum, onlar benim için yeterince otomatik değiller) o zaman bunu yapma şansı oldukça düşüktür.

L01man: Bunun nasıl yapılacağı hakkında bir eğitim var mı? İlk kısımda, JHC'yi indirmem gerektiğini anlıyorum. Inf dosyasına ne yazmam gerekiyor ve nasıl kullanılır?

Bu soruya cevap vermeden önce, jhc'yi bir süredir kullanmadığımı lütfen unutmayın, çünkü başlangıçta bunu yazdım ve daha yeni sürümler piyasaya sürüldü, bu yüzden daha karmaşık Haskell programlarının kod üretimi söz konusu olduğunda jhc'nin ne kadar kararlı olduğunu bilmiyorum. Bu, JHC ile büyük bir Haskell programı yapmayı düşünmeden önce herkes için bir uyarıdır, devam etmeden önce bazı küçük testler yapmalısınız.

jhc'de manuel http://repetae.net/computer/jhc/manual.html ve çapraz derleme ve .ini dosyası kurma seçenekleriyle ilgili bir bölüm vardır: http://repetae.net/computer/jhc/manual .html # çapraz derleme .

L01man: İkinci kısım birinciye alternatif. Üçüncüsü söylediklerini nasıl yapacağımı bilmiyorum.

Başlamadan önce C hakkında bilgi sahibi olmanız ve Haskell yabancı işlev arabirimini (FFI) ve hs2c gibi araçları kullanmanız konusunda rahat olmanız gerekir. Android NDK'yı kullanma ve paylaşılan kütüphanelerle .apk oluşturma konusunda da bilgi sahibi olmalısınız. C-Haskell, Java / C-Haskell arasında arayüz oluşturmak ve pazar için resmi olarak dağıtabileceğiniz / satabileceğiniz Android için Haskell programları geliştirmek için bunları bilmeniz gerekecek.

L01man: Amacının Android API için bir bağlayıcı oluşturmak olduğunu anlıyorum. Ama ... 4. bölüm Haskell ile .apk yapamayacağımızı söylüyor mu?

.apk sadece bir uygulama paketi dosya biçimidir ve Android SDK (NDK değil) ile birlikte gelen araçlarla oluşturulmuştur, bu ikili dosyaların kendisini oluşturmak için çok az şey vardır. Android paketleri yerel paylaşılan kütüphaneler içerebilir, Haskell programınız bu olacak ve yerel paylaşılan / statik kütüphaneler Android NDK aracılığıyla oluşturulur.


Ben kesinlikle bir Android uzmanı değilim. Ancak bugün API seviye 9 geliştirici.android.com/ reference/android/app/NativeActivity.html'den beri NativeACtivity adlı bu yeni sınıfa rastladım . Faaliyetlerin sadece yerel yasalarda uygulanması için kullanılabileceğini söylüyorlar. Bunun amacımız için ne kadar alakalı / yararlı olduğunu merak ediyorum. Bu, Haskell ve Java arasında etkileşime gerek olmadığı anlamına mı geliyor?
Phil

@Po NativeActivity, hakkında yazdığım android NDK tutkal kodu çerçevesinin (android 2.3) bir parçasıdır. Tüm kodunuzu C / C ++ 'da yazmanıza izin verecektir, ancak yerel bir yürütülebilir dosyaya sahip olmayacaksınız, Java'dan çağrılan paylaşılan bir kütüphaneye sahip olacaksınız. NativeActivity'ye Haskell bağları yazdıysanız, Java ve Haskell arasında bağlamalar yazmanız gerekmez, ancak NDK API'lerinin tam Java API'lerinin alt kümesi olduğundan bahsettiğim gibi, standart android kullanıcı arayüzü için yerel API'ler yoktur. OpenGL'de (ES) kendi yazmanız veya JNI-Haskell bağlamaları yazmanız gerekir.
snk_kid

Bunun nasıl yapılacağı hakkında bir eğitim var mı?
L01man

İlk kısımda, JHC'yi indirmem gerektiğini anlıyorum. Inf dosyasına ne yazmam gerekiyor ve nasıl kullanılır? İkinci kısım birinciye bir alternatiftir. Üçüncüsünde söylediklerini nasıl yapacağımı bilmiyorum. Amacının Android API için bir bağlayıcı oluşturmak olduğunu anlıyorum. Ama ... 4. bölüm Haskell ile .apk yapamayacağımızı söylüyor mu?
L01man

@ L01man Yorumdaki karakter sınırı nedeniyle sorunuzu ana cevapta yanıtladım.
snk_kid


16

Kodun çalıştığını gösteren https://github.com/neurocyte/android-haskell-activity var Haskell.


4
Biri ... birileri gerçekten yaptı! Kudos.
Robert Massaioli

Yakında buna daha yakından bakacağım. Eğer yasal görünüyorsa, o zaman bu cevabı işaretli cevabı değiştireceğim.
Robert Massaioli

Robert, yasal görünüyor. Ancak nörosit, yapı hakkında ayrıntılı talimatlar sunmuyor gibi görünüyor. Oku github.com/neurocyte/android-haskell-activity/issues/1
gliptak

9

Bir keresinde aynı Reddit iş parçacığına rastladım, ama eskiydi ve yorumlar kapatıldı. OP'ye bir mesaj gönderdim, ancak alıcıya ulaşıp ulaşmadığından emin değilim. Buradaki önerim (yerel etkinliklerin mümkün olmadığı eski Android'ler için çalışabilir).

Ben (bir süre önce Haskell'de geliştirdim, ancak şu anda Smalltalk'a geçtim) şu anda Android için bir Squeak VM limanı geliştiriyorum. Bunu yaptığım yol, bir haskell-on-android projesinde ele alınabilecek şeye benziyor: uygulamanın Java kısmından çağrılması gereken bir C kodu parçası (temelde Android'de yapılabilecek tek şey çeşitli olayları işlemek; bir uygulama olayların kendisini yoklayamaz ve herhangi bir olay döngüsüne sahip değildir). Benim durumumda kod Squeak VM oluşturma araçları tarafından üretiliyor, android üzerinde haskell durumunda bu JHC'nin GHC'sinden veya kullanılan ön uçtan çıkar. Bu repo bakmaya değer olabilir:

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

"Src" altında, kullanıcı olaylarının ele geçirilmesini ve yerel koda gönderilmesini sağlayan Java kodu vardır (CogView sınıfına bakın). VM'nin C kodu tamamen orada değildir (bunun için Cog şubesi olan squeakvm.org'a bakın), ancak bir fikir olabilir. Ayrıca , yorumlayıcının C ön ucu olan http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm altına da (kullanıcı etkinliklerinin işlenmesi, bazı zaman işleyişi vb. Dahil) bakılabilir . )

Bu yardımcı olur umarım.

Dmitry



6

Genel cevap kaynak -> kaynak dönüşümlerinden gelmelidir, çünkü özel olarak derlenmiş paylaşılan nesnelerin yüklenmesi biraz çamur gibi görünmektedir (yukarıdaki cevaplarda ghc-> c ve c-> java adımı dahil). Bu soru, böylece edilmiş JVM, Haskell başlığı altına düştüğünde çalıştı (bir Java ara temsili olarak bir adımla) ve ele uzunluğunda verilir. İhtiyacınız olan kütüphaneler orada derlenirse frege kullanabilirsiniz . Geriye kalan tek adım, IO () eylemlerine çevrilen Android çerçeve API'sinin başlangıcı ve belki de manifesto xml ve apk'yi oluşturmak için bir sargı olacaktır.


1
Aslında, Java ve Frege ile yazılmış bir vitrin Android uygulaması var, ayrıntılar burada groups.google.com/forum/#!topic/frege-programming-language/…
Ingo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.