एम्बेडेड सॉफ़्टवेयर बाज़ार में C हावी क्यों है? [बन्द है]


14

लगभग सभी अब आशीर्वाद कहेंगे:

प्रदर्शन !

ठीक है, C एथलेटिक कोड लिखने की अनुमति देता है। लेकिन अन्य भाषाएँ हैं जो ऐसा कर सकती हैं, आखिर! और आधुनिक संकलक की अनुकूलन शक्ति कमाल की है। क्या C के कुछ ऐसे फायदे हैं जो किसी अन्य भाषा में नहीं हैं? या डोमेन में अधिक लचीले उपकरणों की कोई आवश्यकता नहीं है?



@ स्वीकृत: हाँ, लेकिन यह एक उदाहरण है, और अधिकांश लोग जो डिवाइस बना रहे हैं वे Arduino का उपयोग कर रहे हैं।
एड एस।



1
@ dan04, अधिकांश मामलों में, यह वास्तव में एक समस्या नहीं थी। टेक्सास इंस्ट्रूमेंट्स डिफेंस सिस्टम एंड इलेक्ट्रॉनिक्स ग्रुप में 6DOF के एक सिमुलेशन ग्रुप ने लगभग 1988 में एक छोटा सा प्रयोग किया। तब तक, वे फोरट्रान में अपने सभी सिमुलेशन कर चुके थे। उन्होंने PASCAL में एक लिखने की कोशिश की, यह देखने के लिए कि यह कितना बुरा होगा। उन्हें पता चला कि PASCAL ने उन्हें एक छोटा प्रदर्शन दिया, लेकिन विश्वसनीयता में वृद्धि और इसके लिए किए गए से अधिक डीबगिंग में आसानी। स्पष्ट रूप से, उन्होंने पाया कि PASCAL की मजबूत प्रकार की जाँच एक अच्छी बात थी। (और हाँ, वे सरणियाँ कर रहे थे।)
जॉन आर। स्ट्रॉहेम

जवाबों:


41

लगभग सभी अब आशीर्वाद कहेंगे:

प्रदर्शन!

वह इसका हिस्सा है; नियतात्मक संसाधन का उपयोग सीमित संसाधनों के साथ शुरू करने के लिए उपकरणों पर महत्वपूर्ण है, लेकिन अन्य कारण हैं।

  1. निम्न स्तर के हार्डवेयर API की सीधी पहुँच।
  2. आप इन उपकरणों के विशाल बहुमत के लिए एक सी संकलक पा सकते हैं। मेरे अनुभव में किसी भी उच्च स्तरीय भाषा के लिए यह सही नहीं है।
  3. सी (रनटाइम और आपका उत्पन्न निष्पादन योग्य) "छोटा" है। कोड चलाने के लिए आपको सिस्टम में सामान का एक गुच्छा लोड करने की आवश्यकता नहीं है।
  4. हार्डवेयर API / ड्राइवर (ओं) को C या C ++ में लिखा जाएगा।

14
+ संकलक की उपलब्धता। जब हम असेंबली में सब कुछ लिख रहे थे, तो पहले जनरल कंपाइलर एक गॉड-सेंड थे।
क्रिस्टोफर Bibbs

8
+1, मुझे लगता है कि निर्धारक संसाधन उपयोग सबसे महत्वपूर्ण कारणों में से है। आपके पास डिशवॉशर में सभी प्रकार के फैंसी कचरा संग्रह करने के लिए बहुत सारी मेमोरी नहीं है।
user281377

4
+1 भी "निर्धारक संसाधन उपयोग" के लिए। कई एम्बेडेड सिस्टम पर, यह आवश्यकता यहां तक ​​कि गतिशील मेमोरी आवंटन के उपयोग को भी रोकता है। कई अन्य भाषाएं गतिशील मेमोरी आवंटन पर निर्भर करती हैं (यहां तक ​​कि C ++ के कई लाभकारी पहलुओं को गतिशील मेमोरी की आवश्यकता होती है)।
माइकल बूर

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

1
सिस्टम के आदमी के रूप में बोलते हुए, मैं बड़े अमूर्तताओं की लीरी हूं। वे महान हैं, जब तक वे काम करना बंद नहीं करते हैं या कुछ अजीब नहीं करते हैं, उस स्थिति में यह डिबग करने के लिए एक बड़ा सिरदर्द हो सकता है। यह एक ऐसी चीज नहीं है जिसे मैं निम्न स्तर की प्रणाली में चाहता हूं।
एड एस।

18

सी एक सीपीयू को मॉडल करने के लिए डिज़ाइन किया गया था, क्योंकि सी को केवल असेंबली भाषा लिखने के बजाय यूनिक्स को प्लेटफार्मों पर पोर्टेबल बनाने के लिए बनाया गया था।

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

नोट: C को 1970 के आसपास डिज़ाइन किया गया था और CPU के सरल थे।


3
+1: यह निश्चित रूप से कारण है। हो सकता है कि लोगों ने आधुनिक प्रोसेसर की विशेषताओं को पकड़ने वाली नई उच्च-स्तरीय भाषाओं को डिज़ाइन करने की कोशिश की हो, लेकिन किसी ने इसके लिए कोई भाषा डिज़ाइन नहीं की है।
केन ब्लूम

2
@vines, C एक बड़ी रनटाइम लाइब्रेरी के साथ एक छोटी भाषा है। यह सब रनटाइम लाइब्रेरी में किया जा सकता है। यह सिर्फ मानक सी लाइब्रेरी में स्वचालित रूप से माइग्रेट नहीं होगा इसलिए यह प्लेटफ़ॉर्म विशिष्ट है।

3
+1। सी के लिए बनाया गया था, और शुरू में एक पीडीपी -7 पर इस्तेमाल किया गया था, जिसमें 18-बिट शब्दों के अधिकतम 64kilowords थे। कई और "आधुनिक" भाषाओं में उस तरह के स्थान पर फिटिंग करने में अधिक कठिनाई होती है। खासतौर पर यूनिक्स जैसा ओएस लिखने के लिए।
ग्रेफेड

2
@ ग्रेफेड: ऐसा नहीं है। UNIX की उत्पत्ति PDP-7 पर हुई, लेकिन C ने नहीं किया। सी प्रोग्रामिंग भाषा की प्रस्तावना से उद्धृत करने के लिए : "सी मूल रूप से डेनिस रिची द्वारा डीईसी पीडीपी -11 पर यूनिक्स ऑपरेटिंग सिस्टम पर लागू किया गया था।"
जेरी कॉफिन

1
@vines: हालांकि यह निश्चित रूप से उचित है कि भाषा में प्रसार के लिए प्रत्यक्ष समर्थन पर विचार करें (cf, समवर्ती C), कैश का अधिकांश बिंदु यह है कि यह प्रोग्रामर या भाषा के भाग पर किसी भी हस्तक्षेप के बिना चीजों को तेज करता है ।
जेरी कॉफिन

11

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

और वीएम / व्याख्या की गई भाषाओं की उपयोगी विशेषताएं आमतौर पर संभव नहीं हैं और कार्यान्वयन से बाहर हैं, जैसे कि कचरा संग्रह।


3
"जावा और सी / सी ++ दोनों" - मुझे उम्मीद है कि आप का मतलब "तीनों: जावा सी और सी ++" है, क्योंकि सी और सी ++ अलग-अलग भाषाएं हैं।
B:53овиЈ

1
@ B @овиЈ: वर्षों बाद उस पुष्टि के लिए हाँ, कि मेरा मतलब तीनों से है। मैं इस परिभाषा के बाद दोनों का उपयोग कर रहा था: "दो या दो से अधिक चीजों को शामिल करने का संकेत देने और तनाव देने के लिए एक फ़ंक्शन शब्द के रूप में उपयोग किया जाता है" (दो या अधिक चीजें) :-)
celebdor

10

C को अपने आप में और बहुत कम रनटाइम समर्थन की आवश्यकता होती है, इसलिए ओवरहेड बहुत कम है। आप रनटाइम सपोर्ट पर मेमोरी या स्टोरेज नहीं खर्च कर रहे हैं, उस सपोर्ट को कम करने के लिए समय / प्रयास खर्च कर रहे हैं, या अपने प्रोजेक्ट के डिजाइन में इसके लिए अनुमति दे रहे हैं।


1
क्या वास्तव में ऐसा कभी नहीं होता है कि आपको उस कार्यक्षमता की आवश्यकता है और इसे खुद को फिर से मजबूत करना है? उदाहरण के लिए, switches के साथ निर्मित बड़ी राज्य मशीनें भयानक हैं, और वर्ग पदानुक्रम के साथ निर्मित समान मशीनें अच्छी और रखरखाव योग्य हैं।
दाखलता

1
@vines - आपके पास आम तौर पर इनपुट का एक निर्धारित सेट होता है, स्विच पर निर्मित राज्य मशीनें / यदि सीढ़ी स्पष्ट होती हैं और पर्दे के बहुरूपी कॉल के पीछे जादू की ऊँची एड़ी के जूते की तुलना में अधिक दस्तावेजी होती हैं।
मार्टिन बेकेट

2
@ मॉर्टिन: ओओ विकास में थोड़ा अनुभव रखने वाले किसी व्यक्ति के लिए, पॉलीमॉर्फिक कॉल न तो "जादू" है और न ही "पर्दे के पीछे" है, और यह धारणा कि विशाल स्विच / यदि कथन स्पष्ट हैं और अधिक दस्तावेजी स्पष्ट रूप से विचित्र लगता है।
माइकल बोर्गवर्ड

3
जानिए क्या होता है जब pin27 हाई जाता है विकल्प 1, "केस PIN27:" विकल्प 2 के लिए खोजकर्ता के नक्शे पर एक पुनरावृत्ति का पता लगाने के लिए यह पता लगाने के लिए कि किसी को पिन वस्तुओं के लिए बुलाया जाएगा जो रनटाइम पर 27 को पिन करने के लिए असाइन किया गया है। बहुत सारे ओओ कोड के साथ मुद्दा यह है कि इसे पढ़ने का एकमात्र तरीका अनिवार्य रूप से इसे चलाना है। बिना रन टाइम डीबगिंग या यहां तक ​​कि कंसोल पर, जिसका मतलब है कि कोड को कागज पर या आपके सिर में ट्रेस करना।
मार्टिन बेकेट

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

9

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

आजकल, आप 16-बिट एम्बेडेड माइक्रोकंट्रोलर के साथ एक ही या अधिक कंप्यूटर शक्ति प्राप्त कर सकते हैं जिसकी लागत चार डॉलर या उससे कम एकल मात्रा में है - जिसमें अंतर्निहित रैम और I / O नियंत्रक शामिल हैं। एक 32-बिट माइक्रोकंट्रोलर की लागत शायद एक डॉलर या दो अधिक है।

जब मैं इन छोटे लोगों को प्रोग्रामिंग कर रहा हूं, जो कि मैं उस समय का 90% करता हूं जब मैं उन बोर्डों को नहीं डिजाइन कर रहा हूं, जिन पर वे बैठते हैं, तो मैं कल्पना करना पसंद करता हूं कि प्रोसेसर क्या करने जा रहा है। अगर मैं असेंबलर में तेजी से प्रोग्राम कर सकता हूं, तो मैं ऐसा करूंगा।

मैं अमूर्तता की परतों के सभी प्रकार नहीं चाहता। मैं अक्सर स्क्रीन पर एक असंतुष्ट सूची के माध्यम से कदम रखते हुए डिबग करता हूं। ऐसा करना बहुत आसान है, जब आपने C को प्रोग्राम शुरू करने के लिए लिखा है।


1
कुछ एम्बेडेड अनुप्रयोगों के लिए, यह "डॉलर या दो और" बहुत महत्वपूर्ण है। किसी को भी उनकी कार पर कीमत के प्रभाव का ध्यान नहीं जा रहा है, लेकिन वे अपने थर्मोस्टेट या सीडी प्लेयर पर करेंगे।
डेविड थॉर्नले

3
@ डेविड थॉर्नले, हां, पूरी तरह से सहमत हूं, इसीलिए मैंने वर्तमान में विभिन्न ग्राहकों के लिए एक ही समय में 8, 16, और 32-बिट माइक्रो के साथ परियोजनाएं शुरू की हैं। (बिजली की खपत छोटे उपकरणों के साथ जाने का एक और कारण है।)
tcrosley

1
मूल्य पिन गणना की तुलना में प्रोसेसर की लागत से कम निर्धारित किया जाता है। चिप्स की तुलना में बोर्ड बहुत अधिक महंगे हैं।
Yttrill

7

यह पूरी तरह से हावी नहीं है क्योंकि सी ++ तेजी से उपयोग किया जा रहा है क्योंकि कंपाइलरों में सुधार हुआ है और हार्डवेयर प्रदर्शन में वृद्धि हुई है। हालाँकि कुछ कारणों से C अभी भी बहुत लोकप्रिय है;

  1. व्यापक समर्थन। बहुत ज्यादा हर चिप विक्रेता एसी संकलक प्रदान करता है और किसी भी उदाहरण कोड और ड्राइवरों को संभवतः सी में लिखा जाएगा। सी ++ संकलक तेजी से सामान्य हैं, लेकिन किसी दिए गए चिप के लिए एक मृत प्रमाण पत्र नहीं है, और वे अक्सर Buggier हैं। आप यह भी जानते हैं कि कोई भी एम्बेडेड इंजीनियर c में काम करने में सक्षम होगा। यह उद्योग का लिंगुआ फ्रेंका है।

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

  3. आकार। C ++ बड़ा होता है। निश्चित रूप से एसटीएल का उपयोग करने वाला कुछ भी बड़ा होगा। आम तौर पर कार्यक्रम के आकार और स्मृति पदचिह्न में दोनों।

  4. रूढ़िवाद। यह बहुत रूढ़िवादी उद्योग है। आंशिक रूप से क्योंकि विफलता की लागत अक्सर अधिक होती है और डिबगिंग अक्सर कम सुलभ होती है, आंशिक रूप से क्योंकि इसे बदलने की आवश्यकता नहीं होती है। एक छोटे से एम्बेडेड प्रोजेक्ट के लिए c अच्छी तरह से काम करता है।


11
देखें, यह # 3 एक है जो C ++ के बारे में सबसे अधिक प्रचलित मिथकों में से एक है। C में 5 अलग-अलग प्रकारों के लिए एक प्रकार-सुरक्षित कंटेनर लिखें और आपने कम से कम "ब्लोट" के रूप में 5 अलग-अलग प्रकारों पर एकल एसटीएल कंटेनर का उपयोग किया होगा। सी प्रोग्रामर इसके आसपास अपारदर्शी प्रकार (शून्य *) पर कंटेनर लिखकर प्राप्त करते हैं। एक STL टेम्पलेट के लिए तुलना करना एक श्रेणी त्रुटि है। यद्यपि यह स्वीकार करना है कि यह वास्तव में सी को पसंद करने के लिए सबसे आम "कारणों" में से एक है
एडवर्ड स्ट्रेंज

मैं पूरी तरह से सहमत हूं कि सी में पूर्ण कार्यक्षमता को दोहराने के लिए आप सी ++ के समान पदचिह्न के साथ समाप्त होते हैं। सी का 'लाभ' यह है कि यह आपको चयनात्मक होने की अनुमति देता है। किसी भी महत्वपूर्ण परियोजना पर मैं c ++ का उपयोग करना पसंद करूंगा, लेकिन कभी-कभी लक्ष्य हार्डवेयर उस बिंदु पर विवश होता है, जहां यह व्यावहारिक नहीं है। कहा कि # 1 वास्तव में मेरे अनुभव में मुख्य कारण है।
ल्यूक ग्राहम

6

एम्बेडेड सिस्टम के लिए, बड़ी चीज प्रदर्शन है । लेकिन जैसा आपने कहा, सी और कुछ अन्य प्रदर्शनकारी भाषा क्यों नहीं?

कई लोगों ने अब तक संकलक की उपलब्धता का उल्लेख किया है , लेकिन किसी ने भी डेवलपर्स की उपलब्धता का उल्लेख नहीं किया है । OCaml की तुलना में बहुत अधिक डेवलपर्स पहले से ही C जानते हैं।

वे तीनों बड़े दिग्गज हैं।


6

एंबेडेड सॉफ्टवेयर बहुत अलग है।

एक डेस्कटॉप ऐप पर, एब्सट्रैक्शन और लाइब्रेरी आपको विकास के बहुत से समय बचाते हैं। आपके पास एक समस्या पर एक और युगल मेगाबाइट या गीगाबाइट रैम या कुछ 2 + गीगाहर्ट्ज 64-बिट सीपीयू कोर को फेंकने की लक्जरी है, और कोई और (उपयोगकर्ता) उस हार्डवेयर के लिए भुगतान कर रहा है। आप नहीं जानते होंगे कि ऐप किस सिस्टम पर चलेगा।

एक एम्बेडेड परियोजना में, संसाधन अक्सर बहुत सीमित होते हैं। एक परियोजना में मैंने (PIC 17X-Series प्रोसेसर पर) काम किया था, हार्डवेयर में प्रोग्राम मेमोरी के 2Kwords, 8-लेवल (इन-हार्डवेयर) स्टैक और 192 बाइट्स (<0.2kB) रैम थे। विभिन्न I / O पिन में अलग-अलग क्षमताएं थीं और आपने हार्डवेयर को हार्डवेयर रजिस्टरों में लिखकर आवश्यकतानुसार कॉन्फ़िगर किया था। डीबगिंग में एक आस्टसीलस्कप और तर्क-विश्लेषक शामिल हैं।

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

एम्बेडेड सिस्टम को विकसित करने में मेरे लिए एक बहुत ही महत्वपूर्ण कारक यह है कि निर्देश, संसाधनों, स्मृति और निष्पादन समय के संदर्भ में कोड का अनुवाद क्या है, इसे जानना और नियंत्रित करना। अक्सर निर्देशों का सटीक अनुक्रम हार्डवेयर इंटरफ़ेस तरंगों के लिए समय नियंत्रण को नियंत्रित करता है।

सार और पीछे के दृश्य 'जादू' (उदाहरण के लिए एक कचरा-संग्राहक) डेस्कटॉप ऐप्स के लिए बहुत अच्छा है। कचरा-संग्राहक आपको मेमोरी लीक का पीछा करते हुए बहुत समय बचाते हैं, जब मेमोरी है / गतिशील रूप से आवंटित किया जा सकता है।

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

एक अधिक काल्पनिक उदाहरण एक इंजन नियंत्रक है जो सीधे स्पार्क-प्लग को निकालता है। यदि वह CPU बंद हो जाता है और 50ms के लिए कचरा-संग्रह करता है, तो इंजन एक क्षण के लिए कट जाएगा या गलत क्रैंकशाफ्ट स्थिति में आग लग जाएगी, संभवतः इंजन को रोकना (गुजरते समय?) या इसे यंत्रवत् रूप से क्षतिग्रस्त करना। आप किसी को मार सकते हैं।


यह उतना ही सही है जितना कि यह C के लिए अप्रासंगिक है - आपके द्वारा संदर्भित समस्या केवल GC का व्यवहार है ... C ++ में कोई GCs नहीं है, और क्या पता है? मैं व्यक्तिगत रूप से यह की वजह से उपयोग करें लाइन टिप्पणियों और सख्त प्रकार सुरक्षा =)
लताओं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.