गैर-मौजूद लाइन के लिए GOTO (आदि)?

Dec 07 2020

एक बेसिक दुभाषिया लिखने से कई रोचक जानकारी सामने आती है, जो प्रलेखन में उल्लिखित नहीं होती हैं। उदाहरण के लिए:

10 PRINT"ONE";:IF 1=2 THEN PRINT"TWO":PRINT"THREE"

ONEMicrosoft-व्युत्पन्न BASICs पर प्रिंट करेगा , जबकि डार्टमाउथ उत्पादन करेगा ONETHREE। अर्थात्, MS शेष भाग को संपूर्ण भाग के रूप में मानता है THEN, जो कि ... अजीब (और गलत IMHO) है। मैंने केवल इस पर ध्यान दिया क्योंकि उदाहरण कोड मैंने आखिरी स्टेटमेंट चलाया था , जिससे सुपर स्टार ट्रेक विफल हो गया था।

मैं एक और उदाहरण के साथ आया हूँ मैं होली पोलोई के लिए खुला फेंकना चाहता हूँ। इस कार्यक्रम पर विचार करें:

10 PRINT"HELLO"
20 GOTO 25
30 PRINT"WORLD"

उदाहरण कोड मेरे पास पंक्ति 25 या अगले उच्च विवरण दिखाई देगा । तो उस कोड में, लाइन 30 चलाई जाएगी। यह निश्चित रूप से कमोडोर बेसिक के लिए मामला नहीं है, जो "UNDEFN'D स्टेटमेंट" लौटाता है।

तो ... किसी को भी इस फैशन में काम करने वाले BASIC का एक संस्करण पता है, या क्या यह (जैसा कि मुझे दृढ़ता से संदेह है) बस उदाहरण कोड में एक बग है?

जवाब

5 Brian Dec 09 2020 at 22:36

ZX स्पेक्ट्रम पर सिनक्लेयर बेसिक अगले उपलब्ध लाइन नंबर पर कूद जाएगा। मैनुअल का कहना है

यदि GO से कमांड में लाइन नंबर एक गैर-मौजूद लाइन को संदर्भित करता है, तो दी गई संख्या के बाद अगली पंक्ति में कूदना है। वही RUN के लिए जाता है; वास्तव में RUN का अर्थ वास्तव में RUN 0 है।

13 Chromatix Dec 07 2020 at 21:04

बेसिक बोलियों को विवरणों में काफी भिन्नता के लिए जाना जाता है। अधिक निश्चित संस्करणों में से एक बीबीसी बेसिक है, जो निम्न कार्य करता है:

IF-THEN-ELSE निर्माण पर ध्यान दें, जो बहु-कथन IF-THEN निकायों के उपयोग को सही ठहराता है - जो वास्तव में व्यवहार में उपयोगी हैं।

BBC BASIC V ने एक ENDIF कीवर्ड और मल्टी-लाइन IF-THEN-ELSE-ENDIF ब्लॉक की सुविधा को जोड़ा। सामान्य तौर पर BBC BASIC को संरचित प्रोग्रामिंग को पहले के माइक्रो कंप्यूटर BASIC की तुलना में आसान बनाने के लिए तैयार किया जाता है।

13 snips-n-snails Dec 08 2020 at 01:54

उदाहरण बग नहीं बल्कि अपरिभाषित व्यवहार हैं, जो अन्य भाषाओं में भी आम है। यदि आप क्रॉस-प्लेटफॉर्म संगतता की अपेक्षा करते हैं, तो बस उन चीजों को न करें जो अपरिभाषित व्यवहार करते हैं।

इसके अलावा, पहले उदाहरण में प्रोग्रामर का इरादा स्पष्ट नहीं है, जिससे बग को ठीक करना मुश्किल हो सकता है। फिर, ऐसा मत करो। दूसरा उदाहरण बेहतर है क्योंकि या तो यह प्रोग्रामर के इरादे से काम करता है या पार्सर शिकायत करता है, जिससे बग को जल्दी से ढूंढना और ठीक करना आसान हो जाता है।

10 Raffzahn Dec 07 2020 at 22:18

10 PRINT"ONE";:IF 1=2 THEN PRINT"TWO":PRINT"THREE"

Microsoft व्युत्पन्न BASICs पर एक प्रिंट करेगा, जबकि डार्टमाउथ ONETHREE का उत्पादन करेगा। अर्थात्, MS THEN के भाग के रूप में संपूर्ण पंक्ति को मानता है, जो कि ... अजीब (और गलत IMHO) है।

खैर, मुझे लगता है कि कोई सही या गलत नहीं है, लेकिन प्रत्येक मूल तरीका है। एमएस 'रास्ता अनिवार्य रूप से GOTO की आवश्यकता के बिना एक खंड के भीतर एक कोड ब्लॉक के निर्माण की अनुमति देता है। डार्टमाउथ के साथ, जो उस बिंदु पर काम करता है जैसे कि फोरट्रान से पहले, THEN को कोड ब्लॉक में कूदने की आवश्यकता होती है, इसके बाद एक GOTO द्वारा आसपास जाने के लिए:

10 PRINT"ONE";
20 IF 1=2 THEN GOTO 40
30 GOTO 50
40 PRINT"TWO"
50 PRINT"THREE"
60 REM

ठीक है, या कोड ब्लॉक के चारों ओर कूदने के लिए एक उल्टे खंड का उपयोग करें। न ही वास्तव में महान निर्माण।

यह ध्यान दिया जाना चाहिए कि THEN के बाद के मनमाने ढंग से बयान की अनुमति देना डार्टमाउथ BASIC में मौजूद नहीं है। एक ही बृहदान्त्र द्वारा अलग-अलग बयानों के साथ जाता है।

एमएस 'तत्कालीन ब्लॉक के हिस्से के रूप में (बाकी) लाइन के इलाज के तरीके के साथ बहुत सारे मस्तिष्क जॉगिंग और गोटो के बिना इस निर्माण की अनुमति देता है।

लेकिन एमएस द्वारा इसका आविष्कार नहीं किया गया था, उन्होंने इसे 1972 के DEC BASIC-PLUS से लिया (आखिरकार, MS BASIC DEC BASIC का एक क्लोन है) जैसा कि मैनुअल के p.3-12 में वर्णित है:

तो यहाँ के बाद कई बयानों की अनुमति दी जाती है, लेकिन या तो पूरे के रूप में निष्पादित किया जाता है (यदि स्थिति सही है) या बिल्कुल नहीं।

अब, 'सही' तरीकों की तलाश करते समय, आम तौर पर सबसे पहले एक बेसिक मानकों पर ध्यान दिया जाता है। यहाँ पहले हो सकता है

  • 1978 का ईसीएमए 55 न्यूनतम आधार

    यह पोर्टेबल होने के लिए पालन करने के लिए हर बुनियादी आवश्यकता को बहुत कम बताता है। अनिवार्य रूप से यह डार्टमाउथ बेसिक को संहिताबद्ध करता है (थॉमस कर्ट्ज संपादकों में से एक था) यह बाद में एक स्पष्ट और प्रतिलिपि प्रस्तुत करने योग्य तरीके से अवतार है। यहाँ ये कथन केवल एक पंक्ति संख्या को कूदने की अनुमति देता है।

  • एएनएसआई न्यूनतम 1979 का बुनियादी

    अनिवार्य रूप से ईसीएमए -55 का एएनएसआई संस्करण।

यह बीटीडब्ल्यू है, समय के साथ एमएस-बेसिक एक आदर्श शक्ति बनने के लिए शुरू किया गया था

  • 1986 का ECMA 116 बेसिक , जिसे 'फुल बेसिक' भी कहा जाता है

    यहां मल्टी स्टेटमेंट और मल्टी लाइन थेन कंस्ट्रक्शन और उसके मिश्रण संभव हैं। मल्टी स्टेटमेंट 'MS way' की तरह काम करता है, जबकि मल्टी लाइन को ब्लॉक को बंद करने के लिए ENDIF (या ELSE / ELSEIF) स्टेटमेंट की जरूरत होती है। (इसे आधुनिक BASIC से कई अन्य नी फीचर्स भी मिले, बस लाइन नंबरों के साथ)

  • एएनएसआई / आईएसओ / आईईसी 1987 का पूर्ण बुनियादी

    कुछ स्पष्टीकरण / एक्सटेंशन के साथ अनिवार्य रूप से ECMA-116।

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

उदाहरण कोड मैं लाइन 25 या अगले उच्च कथन को देखूंगा [...]

तो ... किसी को भी इस फैशन में काम करने वाले BASIC का एक संस्करण पता है, या क्या यह (जैसा कि मुझे दृढ़ता से संदेह है) बस उदाहरण कोड में एक बग है?

मुझे एक TINY BASIC याद है, जिसने गणना की गई GOTO को आसान बनाने के लिए 'लाइनों' के बीच कूदने की अनुमति दी थी, लेकिन मूल स्रोत को देखकर ऐसा लगता है कि यह एक संशोधन था।

इसके विपरीत ECMA-55 उन ठिकानों में लक्ष्य के रूप में इस्तेमाल किया जाता है / GOTO / GOSUB:

All line-numbers in control-statements shall refer to lines in the program.
1 Davislor Dec 08 2020 at 07:35

व्यावहारिक शब्दों में,

  1. तय करें कि आपको कौन सा विरासत कोड चाहिए जो आपके दुभाषिया को चलाने में सक्षम हो

  2. तय करें कि कौन सी असंगत बोलियाँ हैं, यदि कोई हो, आप विकल्प के रूप में समर्थन करना चाहते हैं

  3. वही काम करें जो वे करते हैं।

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

इसी तरह, यह बहुत संभावना नहीं है कि कोई भी विरासत कोड जानबूझकर GOTOएक पंक्ति है जो मौजूद नहीं है, लेकिन यह संभव है कि कुछ मौजूदा कार्यक्रम टाइपो के GOTO 24बजाय सही ढंग से चल सकते हैं GOTO 25

यदि आपको असंगत व्यवहार पर निर्भर कोड चलाने की आवश्यकता है, तो आप विकल्प के रूप में प्रदान कर सकते हैं।

1 h22 Dec 09 2020 at 21:57

मेरे द्वारा उपयोग की जाने वाली बोली मौजूदा लाइन पर निकटतम बड़ी संख्या के साथ नियंत्रण कर रही थी, अगर ऐसा अस्तित्व में है। यदि नहीं, तो यह बिना किसी त्रुटि संदेश के कार्यक्रम को समाप्त करने का वैध तरीका था।

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

मशीन कुछ प्रकार की सोवियत "इलेक्ट्रोनिका" थी, लेकिन मुझे ठीक से याद नहीं है। यह कंसोल पर स्वयं की दो पंक्ति एलईडी डिस्प्ले के साथ एक बहुत ही उच्च अंत कैलकुलेटर की तरह दिखता था, लेकिन पहले से ही बाहरी मॉनिटर और कीबोर्ड का समर्थन करता था।