2009-08-12 13 views
53

मैं समझता हूँ कि अगर यह, और Atom पैकेज पाया है googling में एम्बेडेड वास्तविक समय दुनिया के लिए हास्केल की शक्ति लागू करने के लिए संभव है उत्सुक किया गया है। मुझे लगता है था जटिल मामले में कोड सभी शास्त्रीय सी कीड़े हो सकता है - दुर्घटनाओं, स्मृति भ्रष्टाचार, आदि, जो तब मूल हास्केल कोड कि उन्हें कारण होता है का पता लगाया जा करने की आवश्यकता होगी। तो, यह सवाल का पहला हिस्सा है: "यदि आप एटम, आप संकलित सी कोड में निम्न स्तर के कीड़े डिबगिंग और उन्हें हास्केल मूल कोड में फिक्सिंग का कार्य के साथ कैसे पेश किया था के साथ अनुभव था?"बड़े पैमाने पर रीयल-टाइम सिस्टम के लिए हास्केल का उपयोग करना: कैसे (अगर?)?

मैंने एटम, this blog post के लिए कुछ और उदाहरणों की खोज की जिसके परिणामस्वरूप सी कोड 22KLOC (और स्पष्ट रूप से कोई कोड नहीं है), included example एक खिलौना है। This और this संदर्भों में थोड़ा अधिक व्यावहारिक कोड है, लेकिन यह वह जगह है जहां यह समाप्त होता है। और इस विषय में मैंने "बड़े" होने का कारण यह है कि, यदि आप 300KLOC + की श्रेणी में जेनरेट किए गए सी कोड के साथ काम करने के अपने अनुभव साझा कर सकते हैं तो मुझे सबसे अधिक दिलचस्पी है।

जैसा कि मैं हास्केल नौसिखिया हूं, जाहिर है कि मेरे अज्ञात अज्ञातों के कारण मुझे अन्य तरीकों से नहीं मिला, इसलिए इस क्षेत्र में आत्म-शिक्षा के लिए किसी अन्य संकेतक की सराहना की जाएगी - और यह दूसरा हिस्सा है प्रश्न - "हास्केल में रीयल-टाइम विकास करने के कुछ अन्य व्यावहारिक तरीकों (यदि) क्या होंगे?"। मल्टीकोर चित्र में हैं, तो उस एक अतिरिक्त है प्लस :-)

(इस उद्देश्य के लिए हास्केल खुद के उपयोग के बारे में: मैं क्या this blog post में पढ़ा से, कचरा संग्रहण और हास्केल में आलस्य यह नहीं बल्कि गैर नियतात्मक scheduling- बनाता है बुद्धिमान, लेकिन शायद दो साल में कुछ बदल गया है इतने पर Real world Haskell programming सवाल करीबी है कि मैं इस विषय से मिल सकता है)

नोट किया गया था:। "वास्तविक समय" ऊपर करीब होगा "हार्ड वास्तविक समय" - मैं उत्सुक हूं कि यह सुनिश्चित करना संभव है कि मुख्य कार्य निष्पादित नहीं होने पर रोकें समय 0.5ms से कम हो।

उत्तर

46

गाल्वा हम दो चीजों के लिए हास्केल का उपयोग करें:

  • शीतल वास्तविक समय (ओएस डिवाइस परतों, नेटवर्किंग), जहां 1-5 एमएस प्रतिक्रिया समय प्रशंसनीय हैं। जीएचसी तेजी से कोड उत्पन्न करता है, और सही समय प्राप्त करने के लिए जीसी और शेड्यूलर को ट्यून करने के लिए बहुत सपोर्ट है।
  • वास्तविक वास्तविक समय प्रणालियों के लिए ईडीएसएल का उपयोग अन्य भाषाओं के लिए कोड उत्पन्न करने के लिए किया जाता है जो मजबूत समय गारंटी प्रदान करते हैं। जैसे क्रिप्टोल, एटम और कॉपिलॉट।

इसलिए मेजबान भाषा (हास्केल) से ईडीएसएल (कोपिलोट या एटम) को अलग करने के लिए सावधान रहें।


महत्वपूर्ण प्रणालियों के कुछ उदाहरणों में, और कुछ मामलों में, वास्तविक समय प्रणाली, या तो लिखित या हास्केल से उत्पन्न, गाल्वा द्वारा निर्मित है।

EDSLs

सिस्टम

की क्रिप्टोग्राफिक घटकों के लिए एक डीएसएल
  • HaLVM - एम्बेडेड और मोबाइल अनुप्रयोगों
  • TSE के लिए एक हल्के microkernel - एक क्रॉस-डोमेन (सुरक्षा स्तर) नेटवर्क उपकरण
+1

कमाल, बहुत बहुत धन्यवाद! हां, मैं कोड जनरेटर और मेजबान भाषा के रूप में उपयोग किए जाने वाले ईडीएसएल के बीच का अंतर समझता हूं - क्षमा करें अगर मैं प्रश्न के पाठ में अस्पष्ट था। इसे "हैकसेल" श्रेणी में डालने का मेरा कारण यह था कि हास्केल की तरह एक कठोर भाषा का उपयोग करना (?) सीमा जांच, डबल फ्री इत्यादि जैसी "यांत्रिक" बग से बच सकता है, यह मानते हुए कि पर्याप्त अर्थशास्त्र में व्यक्त किया गया है ईडीएसएल - यह मेरी अटकलों में से एक है कि मैं यह समझने की कोशिश कर रहा हूं कि यह सच है या गलत है। –

5

यह एक लंबे समय से पहले हो जाएगा वहाँ एक हास्केल प्रणाली है कि छोटे स्मृति में फिट बैठता है और उप-मिलीसेकंड ठहराव बार की गारंटी कर सकते हैं। हास्केल कार्यान्वयनकर्ताओं के समुदाय को इस तरह के लक्ष्य में रुचि नहीं लगती है।

वहाँ बहुत ही कुशल कुछ करने के लिए नीचे संकलन करने हास्केल या कुछ और हास्केल की तरह का प्रयोग करने में स्वस्थ ब्याज है, उदाहरण के लिए, Bluespec हार्डवेयर के लिए संकलित करता है।

मुझे नहीं लगता कि यह आपकी आवश्यकताओं को पूरा करेगा, लेकिन यदि आप कार्यात्मक प्रोग्रामिंग और एम्बेडेड सिस्टम में रूचि रखते हैं तो आपको Erlang सीखना चाहिए।

+1

+1। इसे लावा से तुलना करना दिलचस्प होगा - जो मैंने पढ़ा है, उससे समान कार्य है। Erlang: हाँ, यह एक और बात है कि मैं अपनी नाक को देखने के लिए शुरू किया, लेकिन यह एक "नरम" वास्तविक समय का थोड़ा सा लगता है। –

+0

आप ओकंपल को भी देख सकते हैं। यह कार्यात्मक है और यदि आप इसे एल्गोरिदम के लिए चाहते हैं तो आलसी मूल्यांकन का भी समर्थन करता है, लेकिन यह सब कुछ आलसी मूल्यांकन के लिए मजबूर नहीं करता है। मुझे रीयलटाइम सिस्टम के लिए इस्तेमाल होने की सुनवाई याद आती है, हालांकि मैंने ऐसा नहीं किया है। यह वैसे भी Erlang से तेज और छोटा होना चाहिए। – Chuck

+2

ओकैमल, एरलांग और हास्केल सभी को सॉफ्ट रीयलटाइम के लिए उपयोग किया जाता है। उदाहरण के लिए प्रतिक्रिया समय के बारे में कोई भी गारंटी नहीं देता है। एक प्रणाली में हम काम पर उपयोग करते हैं, हम हस्केल में नेटवर्क डिवाइस पर खुशी से ~ 1ms प्रतिक्रिया समय प्राप्त करते हैं, इसलिए यह बॉल पार्क का प्रकार है। शोर को कम करने के लिए जीसी सेटिंग्स को ट्यून करना भी उपयोगी है। –

4

मुझे नहीं लगता कि हास्केल, या अन्य कचरा एकत्रित भाषा हार्ड-रीयलटाइम सिस्टम के लिए बहुत उपयुक्त हैं, क्योंकि जीसी अपने रनटाइम को कम विरामों में मिश्रित करने के लिए प्रवृत्त हैं। एटम में

लेखन वास्तव में, हास्केल में प्रोग्रामिंग नहीं है के रूप में हास्केल यहाँ के रूप में विशुद्ध रूप से वास्तविक कार्यक्रम आप लिख रहे हैं के लिए एक पूर्वप्रक्रमक देखा जा सकता है।

मुझे लगता है कि हास्केल एक भयानक पूर्वप्रक्रमक है, और DSEL का उपयोग जैसे एटम शायद एक शानदार तरीका बड़ा हार्ड वास्तविक समय प्रणाली बनाने के लिए है, लेकिन अगर एटम बिल फिट बैठता है या नहीं मैं नहीं जानता। यदि ऐसा नहीं होता है, तो मुझे यकीन है कि यह संभव है (और मैं जो भी करता हूं उसे प्रोत्साहित करता हूं!) जो एक डीएसईएल लागू करता है।

निम्न स्तर की भाषा के लिए हास्केल जैसे बहुत मजबूत प्री-प्रोसेसर होने के कारण कोड कोडिंग के माध्यम से अबास्ट्रक्शन को कार्यान्वित करने का मौका एक विशाल खिड़की खुलता है जो सी कोड टेक्स्ट जेनरेटर के रूप में लागू होने पर बहुत अधिक बेकार है।

+1

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

+4

> एटम शायद बड़े पैमाने पर हार्ड-रीयलटाइम सिस्टम बनाने के लिए एक शानदार तरीका है, यह वास्तव में एक "प्रीप्रोसेसर" ifit व्याकरण, चर, फ़ंक्शन और एक प्रकार की प्रणाली प्रदान नहीं करता है। उस बिंदु पर यह वास्तव में एक कस्टम कोड जनरेटर के साथ एक भाषा बन जाता है, जैसा कि एटम है। बड़े पैमाने पर सिस्टम बनाने के लिए: अमेरिकी शहरों की सड़कों पर चलने वाली बसों और कचरे के ट्रक में एटम का उपयोग किया जाता है। इस बारे में सीयूएफपी में ईटन की बात देखें। यदि सड़कों पर हास्केल ईडीएसएल डालना प्रोड्यूशन के लिए तैयार नहीं है, तो मुझे नहीं पता कि क्या है। –

+0

@ डॉन: ठीक है, यह मेरी पुस्तक में +1 भी मिलता है और साथ ही आपकी टिप्पणी के लिए धन्यवाद। व्यावहारिक अनुभव साझा करने के लिए Muchas gracias। मेरे लिए ब्रेक लेने और अधिक अभ्यास करने का समय। –

6

एंड्रयू,

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

+0

जानकारी के लिए बहुत बहुत धन्यवाद! –

3

मैं एटम के साथ चारों ओर बेवकूफ़ बना रहा हूं। यह बहुत अच्छा है, लेकिन मुझे लगता है कि यह छोटे सिस्टम के लिए सबसे अच्छा है। हां यह ट्रक और बसों में चलता है और वास्तविक दुनिया, महत्वपूर्ण अनुप्रयोगों को लागू करता है, लेकिन इसका मतलब यह नहीं है कि वे अनुप्रयोग जरूरी बड़े या जटिल हैं। यह वास्तव में हार्ड-रीयल-टाइम ऐप्स के लिए है और प्रत्येक ऑपरेशन को सटीक समय के बराबर करने के लिए बहुत अधिक समय तक जाता है। उदाहरण के लिए, एक if/else कथन के बजाय जो दो कोड शाखाओं में से एक को सशर्त रूप से निष्पादित करता है जो चलने वाले समय में भिन्न हो सकता है, इसमें "mux" कथन होता है जो सशर्त रूप से दो गणना मानों में से किसी एक को चुनने से पहले दोनों शाखाओं को निष्पादित करता है (इसलिए कुल निष्पादन समय वही है जो भी मूल्य चुना जाता है)। इसमें अंतर्निहित प्रकारों (सी के मुकाबले) के अलावा कोई महत्वपूर्ण प्रकार की प्रणाली नहीं है जो एटम मोनैड के माध्यम से जीएडीटी मूल्यों के माध्यम से लागू होती है। लेखक एक स्थिर सत्यापन उपकरण पर काम कर रहा है जो आउटपुट सी कोड का विश्लेषण करता है, जो बहुत अच्छा है (यह एक एसएमटी सॉल्वर का उपयोग करता है), लेकिन मुझे लगता है कि एटम को अधिक स्रोत-स्तरीय सुविधाओं और चेक से लाभ होगा।यहां तक ​​कि मेरे खिलौने के आकार के ऐप (एलईडी टॉर्चलाइट कंट्रोलर) में भी, मैंने कई नौसिखियों की त्रुटियां की हैं जो पैकेज के साथ अधिक अनुभवी हो सकती हैं, लेकिन इसके परिणामस्वरूप बग्गी आउटपुट कोड होता है जिसे मैं कंपाइलर द्वारा पकड़ा गया था परीक्षण के बजाय। दूसरी ओर, यह अभी भी संस्करण 0.1 पर है। कुछ सुधार निस्संदेह आ रहे हैं। ब्लूसेपेक लिंक के लिए

+0

+1, साझा करने के लिए बहुत बहुत धन्यवाद। आइए अगले संस्करणों के लिए तत्पर हैं! :-) –

संबंधित मुद्दे