नई C परियोजनाओं को बहुत पुराने C मानकों (> 20 वर्ष पुराने, C89) को कब लक्षित करना चाहिए?


12

कभी-कभी मुझे बहुत पुराने C मानकों को लक्षित करने वाली प्रमुख, अपेक्षाकृत नई, खुली स्रोत C परियोजनाएँ दिखाई देती हैं, आमतौर पर C89। एक उदाहरण प्रणालीगत है। इन परियोजनाओं में बुद्धिमान लोग हैं, इसलिए वे शायद इस निर्णय के पीछे एक अच्छा तर्क रखते हैं जिसके बारे में मुझे नहीं पता है। एक तरफ संदेह का लाभ, यह लगभग ऐसा लगता है जैसे तर्क "पुराने और मानकीकृत हमेशा अधिक पोर्टेबल और बेहतर है" जो हास्यास्पद है क्योंकि तार्किक निष्कर्ष यह होगा कि फोरट्रान सी से बेहतर है और कॉबोल फोरमैन से भी बेहतर है।

नई C परियोजनाओं के लिए बहुत पुराने C मानकों को लक्षित करना कब और क्यों उचित है?

मैं एक ऐसे परिदृश्य की कल्पना नहीं कर सकता जहाँ उपयोगकर्ता का सिस्टम बिल्कुल अपने सी कंपाइलर को अपडेट न करे, लेकिन नए सॉफ़्टवेयर को स्थापित करने के लिए स्वतंत्र है। उदाहरण के लिए, डेबियन के एलटीएस संस्करण में एक gcc 4.6 पैकेज है जो C99 और कुछ C11 का समर्थन करता है। मुझे लगता है कि अजीब परिदृश्य मौजूद होना चाहिए, हालांकि सिस्टमड जैसे प्रोग्राम उन उपयोगकर्ताओं को लक्षित कर रहे हैं।

सबसे उचित उपयोग के मामले में मैं कल्पना कर सकता हूं कि उपयोगकर्ताओं को विदेशी आर्किटेक्चर होने का अनुमान है, जिस पर केवल C89 संकलक उपलब्ध है, लेकिन वे नए सॉफ़्टवेयर को स्थापित करने के लिए पूरी तरह से तैयार हैं। निर्देश सेट आर्किटेक्चर की विविधता में गिरावट को देखते हुए, यह एक अत्यधिक काल्पनिक परिदृश्य की तरह लगता है, लेकिन मुझे यकीन नहीं है।


10
"मैं एक ऐसे परिदृश्य की कल्पना नहीं कर सकता जहाँ उपयोगकर्ता का सिस्टम बिल्कुल अपने सी कंपाइलर को अपडेट न करे, लेकिन नए सॉफ़्टवेयर को स्थापित करने के लिए स्वतंत्र है।" आपने पर्याप्त एंबेडेड काम नहीं किया है ;-)
फिलिप केंडल

2
@PhilipKendall मैंने कोई एम्बेडेड काम नहीं किया है। मैं तुम्हें एक जवाब के साथ मुझे बताए जाने के लिए प्रोत्साहित करता हूं!
प्रिक्सॉलिटिक

2
एक मानक स्थापित होने के बाद, यह वस्तुतः हमेशा के लिए पकड़ में आ जाएगा। कभी-कभी 2000 वर्ष से अधिक
डॉक ब्राउन

1
@DocBrown लेकिन ध्यान दें कि वह पृष्ठ बताता है कि यह दावा है कि यह 2000 साल पुराना मानक गलत है।
जेसपर

1
जब आप ऐसा कुछ देखते हैं, तो आपको जो पहला प्रश्न पूछना चाहिए, वह है "लक्ष्य करने के लिए क्या मंच है?", इसके बाद, सी के किस संस्करण (ओं) को उक्त प्लेटफॉर्म पर / के लिए संकलित किया जा सकता है? )? " फिर आता है, "C का कौन सा संस्करण (s) परियोजना की आवश्यकताओं के साथ सबसे अधिक अनुकूलता प्रदान करता है?" और अगला शायद होगा, "सी के किस संस्करण (एस) के अधिकांश प्रोजेक्ट सबसे परिचित हैं?"
जस्टिन टाइम -

जवाबों:


14

... "पुराना और मानकीकृत हमेशा अधिक पोर्टेबल और बेहतर होता है" जो हास्यास्पद है ...

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

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

सी के लिए विशेष रूप से, यह सवाल है कि आपको नवीनतम मानक के पालन के लिए क्या मिलता है। K & R-to-C89 संक्रमण एक बड़ा परिवर्तन था जिसे पुराने कोड को साफ करने के लिए बहुत प्रयास करने की आवश्यकता थी लेकिन अंततः बहुत अच्छा किया। C99 में परिवर्तन और C11तुलना में मामूली हैं, और हाल ही में विकसित सीआई मुठभेड़ में से अधिकांश अभी भी C89 पास करेंगे क्योंकि यह नई सुविधाओं का उपयोग नहीं करता है। यह तर्क देना कठिन है कि C89 पर C99 को लागू करना सही काम होगा क्योंकि यह एक-लाइन टिप्पणियों का समर्थन करता है, इसमें एक मूल बूलियन डेटा प्रकार होता है और यह चर-लंबाई सरणियाँ कर सकता है। टिप्पणियों और बूलियनों में गैर-बदसूरत वर्कअराउंड हैं और वीएलएएएस को अन्य, थोड़ा-कम-कुशल तरीकों से नियंत्रित किया जा सकता है। C11 ने वैकल्पिक रूप से VLAs को डिमैट किया और पुराने C99 को चुनने का औचित्य हो सकता है यदि वे आपके कार्यान्वयन में प्रमुखता से शामिल हैं।


3
वैसे, परिवर्तनीय घोषणाओं और बयानों को मिलाना समझदारी के लिए काफी अच्छा है। इनलाइन-फ़ंक्शंस, सीमित यूनिकोड-समर्थन और long longइसके लिए भी अच्छा है।
डिडुप्लिकेटर

इसके अलावा, कभी-कभी मल्टीथ्रेडिंग करना अच्छा होता है ...
डेडुप्लिकेटर

@Deduplicator मैं असहमत नहीं हूं कि C99 और C11 में क्या सुधार हैं। यदि आप चाहें तो सभी C11 को लिख सकते हैं यदि आप पुराने परिवेश में पोर्टेबिलिटी के मूल्य से अधिक के अच्छे-से-मूल्य के मूल्य के लिए एक व्यावसायिक मामला बना सकते हैं। फ़ाइल जिसके तहत "समस्या का अध्ययन करें और नौकरी के लिए सही उपकरण ढूंढें।"
ब्लरफाल

2
खैर, मुद्दा यह था कि आपने महत्वपूर्ण सुधारों का उल्लेख नहीं किया था ।
डिडुप्लिकेटर

@ डेडप्लिकेटर: मैं 1990 के दशक में मल्टी थ्रेडेड कोड लिख रहा था। कोड जो भाषा-आधारित थ्रेडिंग सुविधाओं पर निर्भर करता है, वह फ्रीस्टैंडिंग कार्यान्वयन पर अनुपयोगी हो सकता है जो मानक की आवश्यकता के लिए हर चीज का समर्थन नहीं कर सकता है, जबकि वे जो पुस्तकालयों का उपयोग प्लेटफ़ॉर्म फ़ंक्शंस को लपेटने के लिए करते हैं जो उनकी ज़रूरत की कार्यक्षमता का समर्थन करते हैं जो ऐसे फ़ंक्शंस का समर्थन करने वाले किसी भी प्लेटफ़ॉर्म के अनुकूल होंगे। ।
सुपरकैट

10

जब प्लेटफार्मों की एक विस्तृत श्रृंखला में पोर्टेबिलिटी महत्वपूर्ण है। इसमें अप्रचलित प्लेटफॉर्म और कई एम्बेडेड प्रोसेसर शामिल हो सकते हैं, जिनके लिए केवल एक न्यूनतम संकलक उपलब्ध है।

वहाँ भी एक समझ है जिसमें C89 "सबसे कम आम भाजक" है। यह पहला ठीक से मानकीकृत संस्करण था, और आज बहुत अधिक उपयोग में आने वाले किसी भी संकलक को C89 के कुछ सुपरसेट को लागू करने के लिए ग्रहण किया जा सकता है।

यह भी समस्या है कि Microsoft Visual C ++, जबकि C ++ मानकों के साथ बनाए रखने में अपेक्षाकृत अच्छा था, C मोड में लंबे समय तक C89 पर अटका रहा। इसलिए नवीनतम Visual Studio का उपयोग न करने वाला कोई भी व्यक्ति C89 तक सीमित हो सकता है।


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

1
@Praxeolitic यह वास्तव में एक सवाल है कि क्या आप एक ऐसा कोड बना रहे हैं जो विभिन्न प्रकार के विभिन्न लोग उपयोग करेंगे। क्योंकि पुराने कंपाइलरों का उपयोग करने वाले बहुत से लोग होंगे, या तो वे उन्नयन नहीं कर सकते, या क्योंकि वे इसे बहुत अधिक जोखिम और उन्नयन का प्रयास मानते हैं।
सिमोन बी

3

मुझे यह स्वीकार करना चाहिए कि मैं अभी भी मुख्य रूप से Microsoft के कारण pseudo-C89 कोड (पूरी तरह से C99-अनुरूप) नहीं लिखता हूं। मैं विंडोज साइड के लिए MSVC पर बहुत अधिक झुकाव रखता हूं और वे अभी भी पूरी तरह से C99- अनुरूप नहीं हैं, इसके बजाय C ++ 17 और उसके बाद के अपने फोकस के थोक को रखते हैं।

इसके शीर्ष पर मैं सी एसडीके पर काम कर रहा हूं, जिसके खिलाफ बहुत सारे प्लगइन डेवलपर्स अपने प्लगइन विकास के लिए MSVC का उपयोग करते हैं, और कुछ अभी भी MSVC 2010 हैं। इसलिए अभी भी लोकप्रिय कंपाइलर व्यापक रूप से प्लेटफार्मों पर उपयोग किए जा रहे हैं जो इतने विदेशी नहीं हैं (जब तक आप विचार नहीं करते हैं Windows विदेशी) जो अभी तक पूरी तरह से C99 को लागू नहीं करते हैं। जब आप संकलक की सबसे बड़ी श्रेणी के साथ व्यापक संगतता को लक्षित करते हैं (जो कि मुख्य कारणों में से एक है एसडीके सी और सी ++ में नहीं लिखा गया है), तो अभी भी उनमें से कई का व्यापक रूप से उपयोग किया जा रहा है (कम से कम एमएसवीसी) जो समय के पीछे हैं। जब यह सी समर्थन की बात आती है। C99 के बाद से लगभग दो दशक हो गए हैं और अभी भी हमारे पास वीएलएएस नहीं हैं, उदाहरण के लिए, MSVC AFAIK में (MSVC 2017 को अभी तक चेक नहीं किया गया है लेकिन C पर Microsoft का रुख दिया गया है, मुझे संदेह है कि यह C99 के साथ अधिक अनुरूप है) ।

और इसलिए अभी भी दुर्भाग्य से नए संकलक हैं जो वास्तव में अच्छे ऑप्टिमाइज़र और डीबगर्स के साथ काफी अच्छे हैं जो अभी भी पूरी तरह से सी 99-अनुरूप नहीं हैं। बेशक अगर यह इस के लिए नहीं था, मैं C11 भर में कूद जाएगा।

प्लगइन्स और MSVC के साथ स्रोत संगतता के अलावा, अन्य भाषाओं के साथ भी इंटरोप है। कुछ अन्य भाषाएं एक एफएफआई के माध्यम से एसडीके का उपयोग करती हैं, और उनमें से कुछ एफएफआई केवल C89 को समझते हैं। एक dylib से कार्यों को आयात करते समय वे केवल एक साधारण उदाहरण के रूप में समझ नहीं सकते हैं boolया _Boolकेवल समझ सकते हैं, कह सकते हैं int

हां, पक्ष में तर्क पोर्टेबिलिटी है लेकिन सवाल यह है कि क्या वास्तव में गैर-काल्पनिक सिस्टम हैं जो केवल C89 कंपाइलर का उपयोग कर सकते हैं लेकिन सॉफ्टवेयर के नए वितरण को संकलित कर रहे हैं। यानी अगर मैं एक नई सी परियोजना शुरू कर रहा था, तो मैं कैसे तय करूंगा कि C89 का पालन करने से संभावित उपयोगकर्ताओं की संख्या बढ़ सकती है?

बस इस पर एक तरह का ध्यान दिया Blrfl, लेकिन C99 और C11 का उपयोग करके उत्पादकता लाभ मेरे मामले में इतना बड़ा नहीं है, जबकि लोगों को MSVC में अपने प्लगइन्स को लिखने की अनुमति देने की क्षमता बहुत बड़ी लागत हो सकती है (विशेषकर जब मैं उत्पाद काम करता हूं सबसे बड़ी बाजार हिस्सेदारी है, अब तक, विंडोज ओर और औसत उपयोगकर्ता अक्सर कई थर्ड पार्टी प्लगइन्स खरीदता है और डाउनलोड करता है)। जिस तरह का उत्पाद मैं काम करता हूं, वह प्रोग्रामर / स्क्रिप्टर्स और कलाकारों के लिए उपयोगकर्ता-अंत उत्पाद के विकास के माहौल के बीच लगभग आधा है, क्योंकि बहुत से लोग नई क्षमताओं को विकसित करने और विशेष प्रभाव प्राप्त करने के लिए इसके शीर्ष पर नई चीजों को विकसित करना चाहते हैं दयालु लोगों ने अभी तक नहीं देखा है। तो मेरे मामले में यह वास्तव में कम से कम एसडीके के लिए C89 के पक्ष में एक बहुत ही सरल निर्णय था।

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

लेकिन एमएसवीवी से लेकर एफएफआई जैसी अन्य भाषाओं में लोकप्रिय कंपाइलरों से पीछे रहने वाली कई सारी चीजें हैं, जो इस मायने में अच्छी हैं कि वे डीआईएलआई से सीधे सी फंक्शंस को आयात और कॉल कर सकते हैं, लेकिन हो सकता है बार। इसलिए आपके डोमेन के आधार पर, पुराने के अनुकूल और किसी प्रकार के सौंदर्य के लिए मानकीकृत होने के बजाय, बहुत अधिक व्यावहारिक व्यावसायिक चीजें हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.