क्या मानक का पालन करना आवश्यक है, उस मामले के लिए C मानक लें?


17

स्टैक ओवरफ्लो पर कुछ बहुत अनुभवी लोग हैं जो हमेशा सी मानक के बारे में बात करते हैं। लोग गैर-पोर्टेबल समाधानों को पसंद नहीं करते हैं, भले ही वे मेरे लिए काम करें। ठीक है, मैं समझता हूं कि मानक का पालन करने की आवश्यकता है, लेकिन क्या यह प्रोग्रामर की रचनात्मकता पर हथकड़ी नहीं लगाता है?

एक मानक का पालन करने से क्या ठोस लाभ होते हैं? खासकर क्योंकि कंपाइलर मानक को थोड़ा अलग तरीके से लागू कर सकते हैं।


7
क्या आप स्पष्ट कर सकते हैं कि "मानक" से आपका क्या मतलब है? क्या आपका मतलब ऐसे व्यवहार पर नहीं है जो मानक द्वारा परिभाषित नहीं है? या एक्सटेंशन / संकलक सुविधाओं का उपयोग नहीं कर रहे हैं? या शैली सम्मेलनों?
ikhख

1
@ शेख वह आईएसओ सी मानकों (C90, C99, C11) के बारे में ले रहे हैं।
असेम बंसल

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

क्या आप "गैर-पोर्टेबल समाधानों की तरह नहीं लग रहे हैं, भले ही वे मेरे लिए काम करें" का एक उदाहरण जोड़ सकते हैं?
B:ови

1
@PHIfounder केवल उस अंतिम मामले को संबोधित करने के लिए, आप मुख्य से वापसी को छोड़ सकते हैं, यह निहित रूप से 0 है :)
डैनियल ग्रैज़र

जवाबों:


45

मानक से चिपके रहने के कुछ कारण हैं।

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

  2. एक मंच में बंद होने के कारण मुश्किल से बेकार होता है। यदि आप लिनक्स पर सॉफ्टवेयर को आगे बढ़ा रहे हैं और आप विंडोज पर स्विच करना चाहते हैं क्योंकि आपको एहसास है कि आपका बाजार वास्तव में है, तो आपको अच्छा खेलने के लिए अपने कोड में मिली हर गैर-पोर्टेबल हैक को बदलने की एक समय की बिल्ली है। GCC और MSVC दोनों के साथ। अगर आपको अपने कोर डिज़ाइन के कई टुकड़े मिल गए हैं, तो कुछ ऐसा ही है, गुड लक!

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

इसलिए यहां ओवरराइडिंग संदेश, मानक से चिपकना आपको अधिक लचीला बनाता है । आपके पास अधिक सीमित भाषा है, लेकिन आपके पास अधिक है

  • पुस्तकालय
  • समर्थन (लोग मानक जानते हैं, प्रत्येक जटिल संकलक-विशिष्ट हैक नहीं)
  • उपलब्ध प्लेटफ़ॉर्म
  • परिपक्व उपकरण
  • सुरक्षा (भविष्य का प्रमाण)

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


+1 उचित पर्याप्त :), धन्यवाद ... मैं गंभीर रूप से भ्रमित था जिस तरह से मानकों से थोड़ा विचलित हो गया था और मुझे इसके सख्ती से पालन करने में संदेह महसूस हुआ, इसके पेशेवरों और विपक्षों को जानने की जरूरत थी और आपने स्पष्ट रूप से उन लोगों की पहचान की।
डेसीमल 0

6
अपरिभाषित व्यवहार शायद थोड़ा सा भी चूसता है। यदि आप मानक का बारीकी से पालन नहीं करते हैं तो c के साथ UB में उद्यम करना बहुत आसान है।
कोडइन्चोस

@CodesInChaos सहमत, अपरिभाषित व्यवहार एक तरफ से महान है क्योंकि यह कुछ पागल अनुकूलन के लिए अनुमति देता है, लेकिन अन्य डिबगिंग पर ...
डैनियल ग्रैज़र

6

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

तो, अपने स्वयं के मानसिक मॉडल के बजाय मानक का पालन करने का क्या फायदा है?

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

लोग गैर-पोर्टेबल समाधानों को पसंद नहीं करते हैं, भले ही वे मेरे लिए काम करें।

यह कहना बेहतर होगा, "भले ही वे मेरे लिए काम करें।" जब तक आपका कंपाइलर विशेष रूप से दस्तावेज नहीं देता है कि एक दिया गया व्यवहार काम करेगा (वह है: जब तक आप एक समृद्ध मानक का उपयोग नहीं कर रहे हैं, मानक उचित प्लस कंपाइलर प्रलेखन से मिलकर), तो आप नहीं जानते कि यह वास्तव में काम करता है, या कि यह वास्तव में विश्वसनीय है। उदाहरण के लिए, हस्ताक्षरित पूर्णांक ओवरफ़्लो आमतौर पर कई प्रणालियों (इसलिए, INT_MAX+1आमतौर पर INT_MIN) पर रैपिंग के परिणामस्वरूप होता है - इसके अलावा, कंपाइलर "पता" को छोड़कर कि एक (सही) सी प्रोग्राम में पूर्णांक अंकगणितीय कभी भी ओवरफ्लो नहीं होता है, और अक्सर इसके आधार पर बहुत आश्चर्यजनक अनुकूलन करते हैं " ज्ञान"।


1
आप के साथ संकलन कर सकते हैं -fwrapv, और फिर आप थोड़ी अलग, गैर-मानक भाषा का उपयोग कर रहे हैं, जहां पूर्णांक अंकगणित हमेशा लपेटता है।
user253751

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

@ मिनीबिस: यह बहुत बुरा है कि संशोधनवादी लोगों को यह समझाने में सक्षम हैं कि कुछ प्लेटफॉर्मों के लिए कंपाइलरों के बीच सर्वसम्मति से लागू किए गए (या कुछ मामलों में 100% सर्वसम्मति से) ऐसे प्लेटफॉर्म पर कभी भी "मानक" नहीं रहे हैं, क्योंकि कई मामलों में इस तरह के व्यवहार से बचने के कारण होने वाली दक्षता का नुकसान किसी भी "अनुकूलन" द्वारा पुन: प्राप्त नहीं किया जाएगा जो कि एक संकलक को संशोधित करके प्राप्त करने में सक्षम था।
सुपरकैट

4

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

नहीं। मानक बताता है कि क्या करने की अनुमति है। यदि यह निर्दिष्ट नहीं है, तो आप अपरिभाषित व्यवहार क्षेत्र में हैं, और फिर सभी दांव बंद हैं - कार्यक्रम कुछ भी करने के लिए स्वतंत्र है।


चूंकि आपने void main()बनाम के विशिष्ट उदाहरण का उल्लेख किया है int main(), इसलिए मैं अपने उत्तर में सुधार कर सकता हूं।

void main()मुख्य कार्य की एक मानक घोषणा नहीं है। यह एक्सटेंशन के माध्यम से कुछ संकलक पर काम कर सकता है, लेकिन यह कार्यान्वयन पर निर्भर करता है। यहां तक ​​कि अगर यह काम करता है, तो आपको यह जांचना होगा कि क्या आप इसे चाहते हैं। समस्या यह है, कंपाइलर डेवलपर्स void main()आपके आवेदन को तोड़ते हुए, अगले संकलक रिलीज के साथ हटाने का निर्णय ले सकते हैं ।

दूसरी ओर, मानक स्पष्ट रूप से मुख्य के हस्ताक्षर को परिभाषित करता है int main()और यह बताता है कि उसे क्या करना चाहिए।


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


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

@jozefg जिस तरह से यह पूछा गया था - यह स्पष्ट है कि ओपी ने यूबी के कार्यान्वयन के तरीके के बारे में सोचा। उदाहरण के लिए, थ्रेड्स को c ++ 03 में परिभाषित नहीं किया गया था।
B44овиЈ

1
@deworde: टिप्पणी को उत्तर से हटा दिया गया था।
केविन

@jozefg यदि कोई विशेष संकलक हमेशा हस्ताक्षर किए गए पूर्णांकों को लपेटता है, तो इसे एक अनिर्दिष्ट भाषा एक्सटेंशन माना जा सकता है। (बेशक,
अनैच्छिक

-6

नियमों का पालन न करें यदि आपकी परियोजना विशेष परियोजनाओं के बारे में है, उदाहरण के लिए एक gov परियोजना या सेना एक, लेकिन आपको नियमों का पालन करने की आवश्यकता है यदि आप किसी वितरित टीम के साथ एक खुले स्रोत या बड़ी परियोजना के बारे में बात कर रहे हैं।


2
स्पष्टीकरण के बिना, यह उत्तर उस स्थिति में बेकार हो सकता है जब कोई अन्य व्यक्ति एक विपरीत राय पोस्ट करता है। उदाहरण के लिए, यदि कोई दावा करता है जैसे "नियमों का पालन करें यदि आपकी परियोजना विशेष परियोजनाओं के बारे में है, उदाहरण के लिए एक gov परियोजना या सेना एक, लेकिन आपको नियमों का पालन करने की आवश्यकता नहीं है यदि आप एक खुले स्रोत के बारे में बात कर रहे हैं ..." , यह जवाब पाठक को दो विरोधी राय लेने में कैसे मदद करेगा? एक बेहतर आकार में इसे संपादित करने पर विचार करें
gnat

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