การเรียกใช้โปรแกรม Haskell บน Android OS


216

Forenote: นี่เป็นส่วนเสริมของเธรดที่เริ่มต้นใน/ r / haskell

เริ่มต้นด้วยข้อเท็จจริง:

  • Android เป็นระบบปฏิบัติการที่ยอดเยี่ยม
  • Haskell เป็นภาษาโปรแกรมที่ดีที่สุดในโลก

ดังนั้นการรวมกันอย่างชัดเจนจะทำให้การพัฒนา Android ดีขึ้นมาก โดยพื้นฐานแล้วฉันต้องการทราบว่าฉันสามารถเขียนโปรแกรม Haskell สำหรับ Android OS ได้อย่างไร คำถามของฉันคือ:

ฉันจะรับโปรแกรม Haskell เพื่อเรียกใช้ / เรียกใช้บน Android OS ได้อย่างไร

คำตอบ:


81

วิธีที่คุณทำได้คือการรับคอมไพเลอร์ Haskell ซึ่งสามารถกำหนดเป้าหมาย C ด้วย android NDK ซึ่งมาพร้อมกับพอร์ต GCC สำหรับสถาปัตยกรรม ARM JHC สามารถทำสิ่งนี้ได้เล็กน้อยด้วยไฟล์สไตล์ inf ขนาดเล็กมากซึ่งอธิบายแพลตฟอร์ม (ขนาดคำ, คอมไพเลอร์, ฯลฯ ) ฉันทำสิ่งนี้กับชุด homebrew dev ของ Wii และมันค่อนข้างง่าย อย่างไรก็ตาม jhc ยังคงมีปัญหาด้านความเสถียรกับรหัสที่ซับซ้อนเช่นการใช้ monad transformer stack กับ IO แต่ jhc ได้รับการปรับปรุงอย่างมากในช่วง 6 เดือนที่ผ่านมา มีเพียงคนเดียวที่ทำงานกับ JHC ฉันแค่อยากให้คนอื่นช่วยเขาได้

ตัวเลือกอื่นคือการสร้างพอร์ต "ไม่ได้ลงทะเบียน" ของ GHC ที่กำหนดเป้าหมายเป็น ndk gcc ซึ่งเป็นกระบวนการที่เกี่ยวข้องมากขึ้นเนื่องจาก GHC ไม่ใช่ตัวรวบรวมข้ามที่แท้จริงในขณะนี้และคุณจำเป็นต้องเข้าใจระบบการสร้างสิ่งที่คุณต้องการ เปลี่ยนแปลง ตัวเลือกอื่นคือ NHC ซึ่งสามารถคอมไพล์ข้ามไปที่ C เช่น GHC คุณต้องสร้าง nhc ที่กำหนดเป้าหมายเป็นคอมไพเลอร์ C NHC ไม่มีส่วนขยาย Haskell จำนวนมากเช่น GHC

เมื่อคุณมีผู้รวบรวม Haskell ที่กำหนดเป้าหมายไว้ที่ NDK GCC คุณจะต้องเขียนการผูกเข้ากับกรอบรหัสกาว NDK JNI ของ Android (เพิ่มตั้งแต่ android 2.3) หรือคุณต้องเขียนรหัสกาว JNI ระหว่าง Java-C-Haskell ตัวเลือกก่อนหน้านี้จะง่ายกว่า วิธีแก้ปัญหาและถ้าฉันจำได้อย่างถูกต้องอาจเข้ากันได้กับ Android รุ่นก่อนหน้านี้ด้านล่าง 2.3

เมื่อคุณมีสิ่งนี้แล้วคุณจะต้องสร้างรหัส Haskell เป็น shared library หรือ static library ที่เชื่อมโยงกับรหัสกาว NDK ของจาวา (ซึ่งตัวมันเองเป็น shared library) เท่าที่ฉันรู้ว่าคุณไม่สามารถเรียกใช้ไฟล์ปฏิบัติการดั้งเดิมบน Android ได้ คุณอาจจะทำได้ด้วยโทรศัพท์รูทดังนั้นฉันจึงคิดว่านี่หมายความว่าคุณไม่สามารถแจกจ่ายไฟล์ปฏิบัติการดั้งเดิมบนแอพสโตร์ได้แม้ว่าพอร์ต NDK gcc สามารถสร้างไฟล์ปฏิบัติการดั้งเดิมได้ นอกจากนี้ยังอาจฆ่าตัวเลือกสำหรับการใช้ LLVM เว้นแต่ว่าคุณสามารถทำให้ NDK JNI ทำงานกับ LLVM ได้

อุปสรรค์ที่ใหญ่ที่สุดนั้นไม่ค่อยได้รับคอมไพเลอร์ Haskell สำหรับ Android (ซึ่งยังคงเป็นอุปสรรค์ใหญ่) ปัญหาที่ใหญ่ที่สุดคือบางคนต้องการเขียน API ที่มีผลผูกพันสำหรับห้องสมุด NDK ซึ่งเป็นงานที่ใหญ่และสถานการณ์เลวร้ายกว่าถ้าคุณ จำเป็นต้องเขียนรหัส UI ของ android เนื่องจากไม่มี NDK API สำหรับส่วนนี้ของ android SDK หากคุณต้องการทำรหัส Android UI ใน Haskell ใครบางคนจะต้องเขียนการเชื่อมโยง Haskell ไปยัง Java ผ่าน JNI / C ถ้าไม่มีกระบวนการอัตโนมัติในการเขียนไลบรารีที่มีผลผูกพัน (ฉันรู้ว่ามีบางอย่างมันก็ไม่อัตโนมัติพอสำหรับฉัน) จากนั้นโอกาสที่บางคนทำมันจะค่อนข้างต่ำ

L01man: มีการสอนเกี่ยวกับวิธีการทำเช่นนี้หรือไม่? สำหรับส่วนแรกฉันเข้าใจว่าฉันต้องดาวน์โหลด JHC ฉันต้องเขียนอะไรในไฟล์ inf และใช้อย่างไร

โปรดทราบก่อนที่ฉันจะตอบคำถามนี้ฉันไม่ได้ใช้ jhc มานานแล้วตั้งแต่ฉันเขียนสิ่งนี้และรุ่นที่ใหม่กว่านั้นออกวางจำหน่ายแล้วดังนั้นฉันจึงไม่ทราบว่า jhc ที่เสถียรในปัจจุบันคือเมื่อมาถึงการสร้างรหัสของโปรแกรม Haskell ที่ซับซ้อนมากขึ้น นี่คือคำเตือนสำหรับทุกคนก่อนที่คุณจะพิจารณาสร้างโปรแกรม Haskell ขนาดใหญ่ด้วย JHC คุณควรทำแบบทดสอบเล็ก ๆ ก่อนที่คุณจะเริ่มต้น

jhc มีคู่มือhttp://repetae.net/computer/jhc/manual.html แบบแมนนวลและส่วนในการตั้งค่าการคอมไพล์ข้ามและไฟล์. ini พร้อมตัวเลือก: http://repetae.net/computer/jhc/manual .html

L01man: ส่วนที่สองเป็นทางเลือกแทนส่วนแรก ฉันไม่รู้จะทำสิ่งที่คุณพูดในสาม

ก่อนที่คุณจะเริ่มคุณควรมีความรู้เกี่ยวกับ C และคุ้นเคยกับการใช้ Haskell foreign function interface (FFI) และเครื่องมือต่าง ๆ เช่น hs2c คุณควรทำความคุ้นเคยกับการใช้ Android NDK และการสร้าง. apk กับไลบรารีที่แชร์ คุณจะต้องรู้สิ่งเหล่านี้ในการเชื่อมต่อระหว่าง C-Haskell, Java / C-Haskell และพัฒนาโปรแกรม Haskell สำหรับ Android ที่คุณสามารถแจกจ่าย / ขายอย่างเป็นทางการในตลาดร้านค้า

L01man: ฉันเข้าใจว่าเป้าหมายคือการสร้างการเชื่อมโยงสำหรับ Android API แต่ ... ส่วนที่ 4 บอกว่าเราไม่สามารถสร้าง. apk กับ Haskell ได้หรือไม่

.apk เป็นเพียงรูปแบบไฟล์แพคเกจแอปและสร้างขึ้นด้วยเครื่องมือที่มาพร้อมกับ Android SDK (ไม่ใช่ NDK) สิ่งนี้มีน้อยมากที่จะสร้างไบนารีเอง แพคเกจ Android สามารถมีไลบรารี่ที่แชร์กันภายในโปรแกรม Haskell ของคุณจะเป็นอย่างไรและไลบรารี่แบบแชร์ / แบบคงที่จะถูกสร้างขึ้นผ่าน Android NDK


ฉันไม่ใช่ผู้เชี่ยวชาญด้าน Android แต่วันนี้ผมมาในชั้นเรียนใหม่นี้เรียกว่า NativeACtivity ตั้งแต่ระดับ API 9 developer.android.com/reference/android/app/NativeActivity.html พวกเขาบอกว่ามันสามารถใช้สำหรับการดำเนินกิจกรรมอย่างหมดจดในรหัสพื้นเมือง ฉันสงสัยว่าสิ่งนี้มีความเกี่ยวข้อง / มีประโยชน์สำหรับจุดประสงค์ของเราหรือไม่ สิ่งนี้หมายความว่าไม่จำเป็นต้องมีปฏิสัมพันธ์ระหว่าง Haskell และ Java หรือไม่?
Phil

@Po The NativeActivity เป็นส่วนหนึ่งของกรอบรหัสกาว NDK ของ android (android 2.3) ซึ่งฉันได้เขียนเกี่ยวกับ มันจะช่วยให้คุณสามารถเขียนรหัสทั้งหมดของคุณใน C / C ++ แต่คุณจะไม่ได้ปฏิบัติการพื้นเมืองคุณจะมีห้องสมุดสาธารณะที่ได้รับการเรียกจาก Java หากคุณเขียนการเชื่อมโยง Haskell เป็น NativeActivity คุณไม่จำเป็นต้องเขียนการเชื่อมโยงระหว่าง Java & Haskell แต่อย่างที่ฉันได้กล่าวถึง NDK APIs เป็นส่วนย่อยของ Java API แบบเต็มไม่มี API ดั้งเดิมสำหรับ UI Android มาตรฐานเช่นคุณจะต้อง เพื่อเขียนของคุณเองใน OpenGL (ES) หรือเขียนการเชื่อม JNI-Haskell
snk_kid

มีการสอนเกี่ยวกับวิธีการทำเช่นนี้หรือไม่?
L01man

สำหรับส่วนแรกฉันเข้าใจว่าฉันต้องดาวน์โหลด JHC ฉันต้องเขียนอะไรในไฟล์ inf และใช้อย่างไร ส่วนที่สองเป็นทางเลือกแรก ฉันไม่รู้จะทำสิ่งที่คุณพูดในสาม ฉันเข้าใจว่าเป้าหมายคือสร้างการเชื่อมโยงกับ Android API แต่ ... ส่วนที่ 4 บอกว่าเราไม่สามารถสร้าง. apk กับ Haskell ได้หรือไม่?
L01man

@ L01man ฉันได้ตอบคำถามของคุณในคำตอบหลักเนื่องจากมีการ จำกัด จำนวนตัวอักษรในความคิดเห็น
snk_kid

17

ภาษาที่มีมาเมื่อเร็ว ๆ นี้ความสนใจของฉันคือEta

คอมไพเลอร์ของ Eta คือทางแยกของ GHC 7.10 ซึ่งมีแบ็คเอนด์ JVM เป็นไปได้ที่จะใช้ไฟล์ JAR ที่สร้างขึ้นเพื่อเขียนแอพ Android และแม้แต่ใช้ฟังก์ชั่นการทำงานต่างประเทศเพื่อเรียกไลบรารี Java Android

ไบรอันแม็คเคนได้เขียนบล็อกโพสต์เกี่ยวกับวิธีการกำหนดค่าโครงการ Android สตูดิโอที่จะใช้ห้องสมุด


16

มีhttps://github.com/neurocyte/android-haskell-activityสาธิตการHaskellเรียกใช้รหัส


4
ลูกชายของ ... ใครบางคนทำมันจริง! ความรุ่งโรจน์
Robert Massaioli

ฉันจะเข้าไปดูเรื่องนี้ในเร็ว ๆ นี้ หากดูเหมือนว่าถูกต้องแล้วฉันจะเปลี่ยนคำตอบที่ทำเครื่องหมายไว้สำหรับคำนี้
Robert Massaioli

โรเบิร์ตมันดูเหมือนถูกต้อง แต่ดูเหมือนว่า neurocyte จะไม่ให้คำแนะนำอย่างละเอียดเกี่ยวกับการสร้าง อ่านgithub.com/neurocyte/android-haskell-activity/issues/1
gliptak

9

ฉันเคยเจอเธรด Reddit เหมือนกัน แต่มันเก่าและความคิดเห็นก็ปิด ฉันส่งข้อความถึง OP แต่ไม่แน่ใจว่าส่งถึงผู้รับหรือไม่ คำแนะนำของฉันที่นี่ (อาจใช้ได้กับ Android รุ่นเก่าที่ไม่สามารถทำกิจกรรมพื้นเมืองได้)

ฉัน (พัฒนาใน Haskell เมื่อไม่นานมานี้ แต่ปัจจุบันเปลี่ยนเป็น Smalltalk) กำลังพัฒนาพอร์ตของ Squeak VM เป็น Android วิธีที่ฉันทำเช่นนี้คล้ายกับสิ่งที่อาจได้รับการจัดการในโครงการ haskell-on-android: ก้อนรหัส C ซึ่งต้องถูกเรียกจาก Java ส่วนหนึ่งของแอปพลิเคชัน (โดยทั่วไปสิ่งที่สามารถทำได้ใน Android คือ จัดการกับเหตุการณ์ต่าง ๆ แอปพลิเคชันไม่สามารถสำรวจความคิดเห็นสำหรับเหตุการณ์เองและไม่มีเหตุการณ์วนรอบใด ๆ ) ในกรณีของฉันรหัสถูกสร้างขึ้นโดยเครื่องมือสร้าง Squeak VM ในกรณีของ Haskell บน Android นี้จะถูกส่งออกจาก GHC ของ JHC หรือสิ่งที่ส่วนหน้าใช้ repo นี้อาจมีค่าดูที่:

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

ภายใต้ "src" มีโค้ด Java ที่ให้สำหรับการสกัดกั้นเหตุการณ์ผู้ใช้และส่งไปยังโค้ดเนทีฟ (ดูคลาส CogView) รหัส C ของ VM นั้นยังไม่สมบูรณ์ (ดู squeakvm.org, สาขา Cog สำหรับเรื่องนั้น) แต่อาจมีความคิด หนึ่งอาจดูภายใต้http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vmซึ่งเป็นส่วนหน้า C ไปยังล่าม (รวมถึงการจัดการกิจกรรมของผู้ใช้การจับเวลาบางครั้ง ฯลฯ ) )

หวังว่านี่จะช่วยได้

มิทรี



6

ฉันคิดว่าคำตอบทั่วไปควรมาจากการแปลงซอร์ส -> เนื่องจากการโหลดอ็อบเจ็กต์ที่แบ่งใช้ที่คอมไพล์แล้วที่รวบรวมเป็นพิเศษดูเหมือนจะเป็นบิตของ kludge (เกี่ยวข้องกับ ghc-> c และ c-> java step ในคำตอบข้างต้น) คำถามนี้จึงตกอยู่ภายใต้หัวข้อของ Haskell บน JVM ซึ่งได้ลองแล้ว (ด้วยขั้นตอนเดียวในฐานะสื่อกลางของ Java) และพูดคุยกันตามความยาว คุณสามารถใช้fregeหากห้องสมุดที่คุณต้องการรวบรวมมี ขั้นตอนที่เหลืออยู่เพียงอย่างเดียวคือจุดเริ่มต้นของ API เฟรมเวิร์ก Android ที่แปลเป็นการกระทำของ IO () และอาจเป็นเสื้อคลุมสำหรับการสร้างรายการ XML และ apk


1
ในความเป็นจริงมีอยู่แสดงแอป Android เขียนใน Java และ Frege มีรายละเอียดที่นี่groups.google.com/forum/#!topic/frege-programming-language/...
Ingo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.