2016-01-31 8 views
5

मूल सी भाषा लूप प्रारंभिकरणों में प्रारंभिक घोषणाओं का समर्थन क्यों नहीं करती?प्री-सी 99 सी के लिए तर्क लूप के लिए शुरुआती घोषणा नहीं है?

जाहिर है मूल निर्माता, और फिर पूर्व-सी 99 मानकीकरण, इस तरह से निर्दिष्ट नहीं किया था। लेकिन मुझे के लिए कोई भी तर्क नहीं मिल रहा है कि डिज़ाइन पसंद किया गया था।

मुझे लगता है कि एक उत्तर के लिए सबसे नज़दीकी चीज है this answer यह बताते हुए कि मिश्रित घोषणाओं और कोड को कैसे प्रतिबंधित किया गया था ताकि संकलकों को एकल-पास वापस होने की अनुमति दी जा सके। पहली नज़र में यह समझ में आता है कि लूप स्टेटमेंट में घोषणाओं में कोड के साथ मिश्रित घोषणाओं के समान/समान समस्याएं होंगी।

लेकिन, पूर्व C99 सी किया ब्लॉक के शुरू में समर्थन घोषणाओं:

{ 
    unsigned int i; 
    for(i = 0; i < WHATEVER; i += 1) 
    { 
     /* ... */ 
    } 
} 

मैं व्यक्तिगत रूप से नहीं देखते हैं कैसे उस के लिए संकलक तर्क इस बात के लिए की तुलना में काफी अलग है:

for(unsigned int i = 0; i < WHATEVER; i += 1) 
{ 
    /* ... */ 
} 

मुझे लगता है कि यदि एक कंपाइलर पूर्व सिंगल पास कर सकता है, तो यह बाद वाले भी कर सकता है। इसकी आवश्यकता हो सकती है कि for कथन हमेशा एक स्कोप ब्लॉक बनाएं (भले ही केवल एक कथन के बाद और { ... } बयानों के ब्लॉक न हों), लेकिन मैं इस तरह के अर्थशास्त्र के किसी अन्य प्री-सी 99 को तोड़ने का कोई तरीका नहीं सोच सकता सी कोड (या तो कथन के बाद एक ब्लॉक द्वारा पीछा किया जाता है, जिस स्थिति में यह पहले से ही "स्कॉप्ड" है, या उसके बाद एक ही कथन है, इस मामले में वैसे भी एक ही घोषणा में एक नई घोषणा की अनुमति नहीं दी जाएगी)।

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

मैं कहाँ देखा है

  • मैं इस यहाँ करने के लिए और सामान्य वेब खोज फू के माध्यम से उत्तर ढूंढना की कोशिश की है, कोई भाग्य के साथ: सभी खोज शब्द मैं के बारे में सोचा उलझन के साथ संतृप्त हो रहे हैं लूप प्रारंभिक घोषणाओं के लिए सी के बारे में प्रश्न, "सी 99 मोड के बाहर इस्तेमाल किया गया" त्रुटि संदेश, आदि (खोज शब्द "तर्क" को छोड़कर, जिसने मुझे उपयोगी जानकारी के लिए निर्देशित किया, लेकिन कुछ भी जो इसका उत्तर नहीं दिया गया)।
  • मैंने डेनिस रिची द्वारा खुद को भाषा विकसित करने पर this article पर खोज की, और कुछ भी नहीं देखा।
  • मैंने सी प्रोग्रामिंग भाषा (द्वितीय संस्करण) की अपनी प्रतिलिपि के माध्यम से खोज की, पहले लूप समझाते हुए अनुभाग के लिए वास्तविक पढ़ना, फिर "लूप" के लिए "के लिए"/"के अन्य उल्लेखों के लिए इंडेक्स की जांच करना। मैंने कुछ अन्य स्थानों पर पढ़ा है जो मैंने सोचा था कि इसका उल्लेख हो सकता है, लेकिन कुछ भी नहीं मिला।
+1

सी 99 से पहले, सी ने आपको ब्लॉक की शुरुआत को छोड़कर चर परिभाषित करने की अनुमति नहीं दी। 'For' लूप के नियंत्रण भाग में परिभाषित चर एक ब्लॉक की शुरुआत में नहीं थे, इसलिए कोई उम्मीद नहीं थी कि उन्हें समर्थित किया जाएगा। सी ++ ने दोनों अवधारणाओं को प्रस्तुत किया (ब्लॉक में कहीं भी वैरिएबल परिभाषित करें, और 'for' loo के नियंत्रण भाग में परिभाषित चर) - और सी 99 ने उन्हें भी जोड़ा। –

+0

एकमात्र लोग जो इसका उत्तर दे सकते हैं वे लेखक हैं, कोई और अनुमान लगाएगा। इन प्रकार के प्रश्नों को ऑफ-विषय माना जाता है। – cimmanon

+0

@ जोनाथन लेफ्लर मैंने आपकी टिप्पणी को ऊपर उठाया। क्या आपको लगता है कि यह वर्तमान में दिए गए उत्तर में बेहतर होगा? यह "विशेषताओं को जोड़ने तक नहीं है जब तक प्रोग्रामर कुछ नहीं करने से रोक दिए जाते हैं" उत्तर में विचार, लेकिन समस्या को देखने का थोड़ा अलग तरीका कैप्चर करता है। – mtraceur

उत्तर

10

मुझे विश्वास नहीं है कि ऐसी सुविधाओं को बाहर करने का कोई विशिष्ट निर्णय था, न ही तर्कसंगत घुड़सवार ऐसा करते हैं।

रोमांटिक के रूप में ऐसा लगता है कि डिजाइनरों (कर्निघान, रिची, आदि) ने सभी संभावनाओं के बारे में सोचा था, और केवल गहरे और सार्थक विचार के बाद सुविधाओं को छोड़ दिया गया है, वास्तविकता यह है कि सी डिजाइन करने के प्रारंभिक वर्षों (काफी कुछ अन्य प्रोग्रामिंग भाषाओं) ने बहुत अधिक नम्र दर्शन का पालन किया जैसे "छोटे से शुरू करें, विशेषताओं को जोड़ने के बारे में पसीना न करें जब तक प्रोग्रामर कुछ करने से रोक नहीं रहे हैं"।

for लूप में परिवर्तनीय प्रारंभिकरण जैसी विशेषताएं प्रोग्रामर सुविधा हैं - उनकी अनुपस्थिति ने चीजों को पूरा नहीं किया है। तो, यहां तक ​​कि अगर कोई ऐसी सुविधा के लिए भीख मांग रहा था या प्रचार कर रहा था (जो शायद वहां नहीं था), तो शायद यह प्राथमिकता क्रम में नीचे चला गया।

कैसे चीजें विकसित करने के लिए के रूप में .....

1999 से पहले, चर घोषणाओं सी में ब्लॉक के शुरू में थे (कोड { के साथ शुरू और बंद करने } में समाप्त), अन्य बयानों के भीतर नहीं। इस तरह मूल रूप से चीजें पूर्व-मानक (के & आर) सी में काम करती हैं, और बी जैसी पूर्ववर्ती भाषाओं (जो वास्तव में पिछली भाषाओं का कट-डाउन व्युत्पन्न था)।

for लूप के भीतर परिवर्तनीय घोषणा/प्रारंभिकता पहले सी ++ में पेश की गई थी। यह बहुत जल्दी दिखाई दिया (उदाहरण के लिए एआरएम में धारा 1 9), और अंततः 1 99 8 के अंत में अनुमोदित किए गए पहले सी ++ मानक में पेश किया गया।

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

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

+3

के एंड आर सिर्फ फेड-अप लेखन असेंबलर थे और एक ऐसी भाषा चाहते थे जो सरल थी और लगभग सीधे असेंबलर में अनुवाद करे ताकि वे यूनिक्स पर काम करना जारी रख सकें। मेरे प्रारंभिक दिनों (1 9 83) में, एक अच्छा सी प्रोग्रामर कोई था जो जानता था कि कंपाइलर जेनरेट किया गया था। –

+0

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

+2

सी 99 तर्क खोजें। शुरुआत के दौरान (परिचय का पहला पृष्ठ) यह कहता है: _ ... समग्र लक्ष्य [सी] के लिए एक स्पष्ट, सुसंगत और स्पष्ट मानक विकसित करना था जो सी की सामान्य, मौजूदा परिभाषा को संहिताबद्ध करता है और जो उपयोगकर्ता कार्यक्रमों की पोर्टेबिलिटी को बढ़ावा देता है ... मूल X3J11 चार्टर ने स्पष्ट रूप से सामान्य मौजूदा अभ्यास को संहिताबद्ध करने के लिए अनिवार्य रूप से अनिवार्य किया है, और सी 8 9 समिति जहां भी स्पष्ट और अस्पष्ट थी, उदाहरण के लिए तेजी से आयोजित की गई थी। भाषा का विशाल बहुमत ... जैसा कि परिशिष्ट ए में परिभाषित किया गया था ... ब्रायन कर्निघन और डेनिस रिची द्वारा सी प्रोग्रामिंग भाषा ... _ –

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