एंड्रॉइड ओएस पर एक हास्केल प्रोग्राम चला रहा है


216

Forenote: यह थ्रेड का विस्तार / r / haskell है

तथ्यों से शुरू करें:

  • Android एक कमाल का ऑपरेटिंग सिस्टम है
  • हास्केल ग्रह पर सबसे अच्छी प्रोग्रामिंग भाषा है

इसलिए, स्पष्ट रूप से, उनके संयोजन से Android का विकास बेहतर होगा। इसलिए अनिवार्य रूप से मैं यह जानना चाहूंगा कि मैं एंड्रॉइड ओएस के लिए हास्केल प्रोग्राम कैसे लिख सकता हूं। मेरा सवाल यह है कि:

एंड्रॉइड ओएस पर निष्पादित / चलाने के लिए मुझे हास्केल कार्यक्रम कैसे मिल सकता है?

जवाबों:


81

आप यह कैसे करते हैं कि पहले हास्केल कंपाइलर मिल रहा है जो सी को एंड्रॉइड एनडीके के साथ लक्षित कर सकता है जो एआरएम आर्किटेक्चर के लिए जीसीसी पोर्ट के साथ आता है। जेएचसी तुच्छ रूप से एक बहुत ही छोटी इन्फिनिटी फ़ाइल के साथ कर सकता है जो प्लेटफ़ॉर्म (शब्द आकार, सी-संकलक, आदि) का वर्णन करता है मैंने इसे Wii होमब्रे डी किट के साथ किया है और यह काफी आसान था। हालाँकि, jhc में अभी भी कुछ जटिल मुद्दे हैं, जैसे कि IO के साथ monad ट्रांसफार्मर स्टैक का उपयोग करना, लेकिन पिछले 6 महीनों में jhc में बहुत सुधार हुआ है। JHC पर केवल एक ही व्यक्ति काम कर रहा है, मैं चाहता था कि अधिक लोग उसकी मदद कर सकें।

दूसरा विकल्प ndk gcc को लक्षित करते हुए GHC के "अनरजिस्टर्ड" पोर्ट का निर्माण करना है, यह एक बहुत अधिक सम्मिलित प्रक्रिया है क्योंकि GHC इस समय एक सही क्रॉस-कंपाइलर नहीं है और आपको बिल्ड सिस्टम को समझने की आवश्यकता है कि किन भागों की आवश्यकता है परिवर्तन। एक अन्य विकल्प एनएचसी है जो सी को क्रॉस-कंपाइल कर सकता है, जैसे जीएचसी आपको सी-कंपाइलर को निशाना बनाने की आवश्यकता है, एनएचसी में जीएचसी जैसे कई हास्केल एक्सटेंशन नहीं हैं।

एक बार जब आपके पास एनडीके जीसीसी पर हस्केल कंपाइलर का लक्ष्य होता है, तो आपको एंड्रॉइड एनडीके जेएनआई गोंद कोड फ्रेमवर्क (एंड्रॉइड 2.3 के बाद से जोड़ा गया) के लिए बाइंडिंग लिखना होगा या आपको जावा-सी-हास्केल के बीच जेएनआई गोंद कोड लिखना होगा, पूर्व विकल्प आसान है समाधान और अगर मुझे याद है कि वास्तव में 2.3 से नीचे Android के पिछले संस्करणों के साथ पीछे की ओर संगत हो सकता है।

एक बार जब आप यह कर लेते हैं तो आपको साझा पुस्तकालय या स्थिर पुस्तकालय के रूप में हास्केल कोड का निर्माण करना चाहिए जो NDK जावा गोंद कोड (जो स्वयं एक साझा पुस्तकालय है) में लिंक हो जाता है। जहां तक ​​मुझे पता है कि आप आधिकारिक तौर पर एंड्रॉइड पर देशी निष्पादन को नहीं चला सकते हैं। आप शायद इसे एक रूट किए गए फोन के साथ कर सकते हैं, इस प्रकार मेरा मानना ​​है कि आप एनडीके जीसीसी पोर्ट को केवल ठीक निष्पादित कर सकते हैं, तब भी आप ऐप स्टोर पर देशी निष्पादनयोग्य वितरित नहीं कर सकते। यह संभवतः LLVM का उपयोग करने के विकल्प को भी मारता है जब तक कि आप NDK JNI को LLVM के साथ काम नहीं कर सकते।

सबसे बड़ी बाधा एंड्रॉइड के लिए हास्केल कंपाइलर नहीं है (जो अभी भी एक बड़ी बाधा है) सबसे बड़ी समस्या यह है कि कुछ को एनडीके पुस्तकालयों के लिए बाध्यकारी एपीआई लिखना पड़ता है जो एक बहुत बड़ा काम है और अगर आप बदतर हैं android UI कोड लिखने की आवश्यकता है क्योंकि Android SDK के इस भाग के लिए कोई NDK API नहीं हैं। यदि आप हास्केल में android UI कोड करना चाहते हैं तो किसी को JNI / C के माध्यम से जावा को Haskell बाइंडिंग लिखना होगा। जब तक बाध्यकारी पुस्तकालयों को लिखने के लिए एक अधिक स्वचालित प्रक्रिया नहीं होती (मुझे पता है कि कुछ हैं, वे मेरे लिए पर्याप्त स्वचालित नहीं हैं) तब कुछ करने की संभावना काफी कम है।

L01man: यह कैसे करना है के बारे में एक ट्यूटोरियल है? पहले भाग के लिए, मुझे लगता है कि मुझे जेएचसी डाउनलोड करना होगा। मुझे inf फ़ाइल में क्या लिखना है और इसका उपयोग कैसे करना है?

कृपया ध्यान दें कि इस प्रश्न का उत्तर देने से पहले मैंने कुछ समय के लिए jhc का उपयोग नहीं किया है क्योंकि मैंने मूल रूप से यह लिखा है और नए संस्करण जारी किए गए हैं, इसलिए मुझे नहीं पता कि वर्तमान में जब अधिक जटिल हास्केल प्रोग्राम की कोड पीढ़ी की बात आती है, तो यह कितना स्थिर है। यह किसी के लिए एक चेतावनी है इससे पहले कि आप जेएचसी के साथ एक बड़ा हास्केल कार्यक्रम बनाने पर विचार करें, आपको पूर्ण होने से पहले कुछ छोटे परीक्षण करने चाहिए।

jhc के पास एक मैनुअल http://repetae.net/computer/jhc/manual.html और विकल्पों के साथ सेटिंग-संकलन और .ini फ़ाइल पर एक अनुभाग है: http://repetae.net/computer/jhc-manual.html .html # crosscompilation

L01man: दूसरा भाग पहले का एक विकल्प है। मुझे नहीं पता कि तीसरे में आपने क्या कहा।

शुरू करने से पहले आपको सी का कुछ ज्ञान होना चाहिए और हास्केल विदेशी फ़ंक्शन इंटरफ़ेस (एफएफआई) और एचएस 2 सी जैसे उपकरणों का उपयोग करने के साथ सहज होना चाहिए। आपको Android NDK का उपयोग करने और साझा पुस्तकालयों के साथ .apk से परिचित होना चाहिए। आपको सी-हास्केल, जावा / सी-हास्केल के बीच इंटरफेस करने और एंड्रॉइड के लिए हास्केल प्रोग्राम विकसित करने की आवश्यकता होगी, जिसे आप आधिकारिक तौर पर बाजार स्टोर पर वितरित / बेच सकते हैं।

L01man: मैं समझता हूं कि इसका लक्ष्य Android API के लिए बाइंडिंग बनाना है। लेकिन ... क्या चौथा भाग कहता है कि हम हास्केल के साथ .apk नहीं बना सकते हैं?

.apk सिर्फ एक ऐप पैकेज फ़ाइल प्रारूप है और इसे उन टूल्स के साथ बनाया गया है जो एंड्रॉइड एसडीके (एनडीके नहीं) के साथ आते हैं, यह बायनेरिज़ के निर्माण के लिए बहुत कम है। एंड्रॉइड पैकेज में देशी साझा पुस्तकालय शामिल हो सकते हैं, यह आपका हास्केल कार्यक्रम क्या होगा और देशी साझा / स्थिर पुस्तकालय एंड्रॉइड एनडीके के माध्यम से उत्पन्न होते हैं।


मैं किसी भी तरह से एक Android विशेषज्ञ नहीं हूँ। लेकिन आज मैं एपीआई स्तर 9 डेवलपर . android.com/reference/android/app/NativeActivity.html के बाद से NativeACtivity नामक इस नई कक्षा में आया हूं । वे कहते हैं कि इसका उपयोग शुद्ध रूप से देशी कोड में गतिविधियों को लागू करने के लिए किया जा सकता है। मुझे आश्चर्य है कि यह हमारे उद्देश्य के लिए कितना प्रासंगिक / उपयोगी है? क्या इससे हास्केल और जावा के बीच बातचीत की कोई आवश्यकता नहीं है?
फिल

@Po NativeActivity Android NDK गोंद कोड फ्रेमवर्क (Android 2.3) का हिस्सा है, जिसके बारे में मैं लिख रहा हूं। यह आपको अपना सभी कोड C / C ++ में लिखने की अनुमति देगा, लेकिन आपके पास एक मूल निष्पादन योग्य नहीं होगा, आपके पास एक साझा पुस्तकालय होगा जिसे जावा से बुलाया जाता है। यदि आपने NativeActivity को Haskell बाइंडिंग लिखा है, तो आपको Java और Haskell के बीच बाइंडिंग लिखने की आवश्यकता नहीं होगी, लेकिन जैसा कि मैंने उल्लेख किया है कि NDK API पूर्ण जावा APIs के सबसेट हैं, मानक Android UI के लिए कोई मूल API नहीं हैं उदाहरण के लिए आपके पास होगा OpenGL (ES) में अपना लिखने के लिए या JNI-Haskell बाइंडिंग लिखने के लिए।
snk_kid 15

क्या ऐसा करने के बारे में एक ट्यूटोरियल है?
L01man

पहले भाग के लिए, मुझे लगता है कि मुझे जेएचसी डाउनलोड करना होगा। मुझे inf फ़ाइल में क्या लिखना है और इसका उपयोग कैसे करना है? दूसरा भाग पहले का एक विकल्प है। मुझे नहीं पता कि तीसरे में आपने क्या कहा। मैं समझता हूं कि इसका लक्ष्य Android एपीआई के लिए एक बंधन बनाना है। लेकिन ... क्या चौथा भाग कहता है कि हम हास्केल के साथ .apk नहीं बना सकते हैं?
L01man

@ L01man मैंने आपके प्रश्न का उत्तर मुख्य उत्तर में दिया है क्योंकि टिप्पणियों में चरित्र की सीमा है।
snk_kid

17

एक भाषा जो हाल ही में मेरे ध्यान में आई है वह है एटा

एटा का कंपाइलर जीएचसी 7.10 का कांटा है जिसमें जेवीएम बैकएंड है। एंड्रॉइड ऐप लिखने के लिए जेनरेट की गई JAR फ़ाइलों का उपयोग करना और यहां तक ​​कि देशी एंड्रॉइड जावा पुस्तकालयों को कॉल करने के लिए इसके फॉरेन फंक्शन इंटरफेस का उपयोग करना संभव है।

ब्रायन मैककेना ने एक ब्लॉग पोस्ट लिखा है कि एटा लाइब्रेरी का उपयोग करने के लिए एंड्रॉइड स्टूडियो प्रोजेक्ट को कैसे कॉन्फ़िगर किया जाए


16

नहीं है https://github.com/neurocyte/android-haskell-activity प्रदर्शन Haskellकोड चल रहा है।


4
बेटे की ... किसी ने वास्तव में यह किया! कुडोस।
राबर्ट मसायोली

मैं जल्द ही इस पर बारीकी से विचार करने जा रहा हूं। यदि यह वैध लगता है तो मैं इसका उत्तर देने वाला हूं।
राबर्ट मसायोली

रॉबर्ट, यह कानूनी लगता है। लेकिन न्यूरोसाइट बिल्ड पर विस्तृत निर्देश नहीं देता है। पढ़ें github.com/neurocyte/android-haskell-activity/issues/1
gliptak

9

मैं एक बार उसी Reddit धागे में आया था, लेकिन यह पुराना था, और टिप्पणियाँ बंद हो गईं। मैंने ओपी को एक संदेश भेजा, लेकिन यह सुनिश्चित नहीं है कि यह प्राप्तकर्ता तक पहुंच गया है या नहीं। यहां मेरा सुझाव है (पुराने एंड्रॉइड के लिए काम कर सकते हैं जहां देशी गतिविधियां संभव नहीं थीं)।

मैं (कुछ समय पहले हास्केल में विकसित हुआ था, लेकिन वर्तमान में स्मॉलटाक में बदल गया) वर्तमान में एंड्रॉइड में स्क्वीक वीएम का एक पोर्ट विकसित कर रहा हूं। जिस तरह से मैं यह कर रहा हूं, वह एक हैस्केल-ऑन-एंड्रॉइड प्रोजेक्ट से निपटा जा सकता है: सी कोड की एक गांठ जिसे आवेदन के जावा भाग से बुलाया जाना चाहिए (मूल रूप से एंड्रॉइड में किया जा सकता है) विभिन्न घटनाओं को संभालें; एक आवेदन स्वयं घटनाओं के लिए मतदान नहीं कर सकता है और किसी भी घटना लूप नहीं है)। मेरे मामले में कोड स्क्वेक वीएम बिल्डिंग टूल्स द्वारा बनाया गया है, एंड्रॉइड पर हैस्केल के मामले में यह जेएचसी के जीएचसी या जो भी फ्रंट एंड का उपयोग किया गया है, उससे आउटपुट होगा। यह रेपो देखने लायक हो सकता है:

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

"Src" के तहत जावा कोड होता है जो उपयोगकर्ता घटनाओं के अवरोधन और उन्हें मूल कोड (CogView वर्ग देखें) के लिए भेजने का प्रावधान करता है। स्वयं VM का C कोड पूरी तरह से नहीं है (देखें squeakvm.org, उस के लिए कोग शाखा), लेकिन किसी को भी विचार मिल सकता है। एक भी http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm के नीचे देख सकता है जो दुभाषिया का सी फ्रंटेंड है (उपयोगकर्ता ईवेंट्स हैंडलिंग, कुछ टाइमकीपिंग, आदि सहित) )

उम्मीद है की यह मदद करेगा।

दिमित्री



6

मुझे लगता है कि सामान्य उत्तर स्रोत-> स्रोत परिवर्तनों से आना चाहिए, क्योंकि विशेष रूप से संकलित साझा वस्तुओं को लोड करने से एक कीचड़ लगता है (ऊपर के उत्तरों में ghc-> c और c-> जावा चरण शामिल है)। यह प्रश्न इस प्रकार जेवीएम पर हास्केल के शीर्षक के अंतर्गत आता है, जिसे आजमाया गया है (जावा मध्यवर्ती प्रतिनिधित्व के रूप में एक कदम के साथ) और लंबाई पर चर्चा की गई है। यदि आप जिन पुस्तकालयों की आवश्यकता है, वहां आप फ्रीज का उपयोग कर सकते हैं । केवल शेष चरण IO () कार्यों में अनुवादित एंड्रॉइड फ्रेमवर्क एपीआई की शुरुआत और शायद एक्सपीएल और एपीके के निर्माण के लिए एक आवरण होगा।


1
वास्तव में, जावा और फ्रीज में लिखा एक शोकेस एंड्रॉइड ऐप मौजूद है, विवरण यहां दिए गए हैं। www.forfor//topic
Ingo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.