जब लूप बॉडी को छोड़ दिया जाता है तो बेसिक एक आउट-ऑफ-ऑर्डर NEXT स्टेटमेंट का पता कैसे लगाता है


9

WABAC मशीन , शर्मन सेट करें । यह प्रश्न सामान्य रूप से BASIC और विशेष रूप से Microsoft के BASIC-80 के बारे में है। पुराना स्कूल बेसिक। लाइन नंबरों के साथ।

पुराने स्कूल-बेसिक दुभाषियों के लिए कैसे (या, बल्कि) किया गया था ... लूप बॉडी को निष्पादित नहीं किए जाने पर अगले लूप्स, और NEXT स्टेटमेंट ऑर्डर से बाहर हो गया?

समय से पहले का एक नया आदेश

यहाँ खेल से एक सबरूटीन है Awari से बाहर डेविड एच अहल की "101 बेसिक कंप्यूटर खेल" :

200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220

और यहाँ यह प्रवाह नियंत्रण को छोड़कर सब कुछ के साथ है:

200 GOSUB 600
215 FOR I=0 TO 5:IF ... THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF ... THEN RETURN
235 GOTO 220

क्या यह याद-शौकीन यादों को वापस नहीं लाता है? क्या आप दीजकस्ट्रा को उसकी कब्र में लुढ़कते हुए सुन सकते हैं ?

यहाँ इस टुकड़े में क्या हो रहा है का दिलचस्प हिस्सा हैं:

  • दूसरा लूप, चूंकि यह समान लूप वैरिएबल का उपयोग करता है, पहले लूप को बदल देता है
  • दो छोरों के लिए एक ही अगला बयान साझा करें
  • दूसरा लूप का NEXT स्टेटमेंट इसके पहले आता है, सोर्स ऑर्डर में, लेकिन इसके बाद, एक्जीक्यूशन ऑर्डर में

आप मान सकते हैं, कि, दुभाषिया ने एक लूप शुरू किया है, बस तब तक बयान चलता है जब तक कि यह नेक्स्ट लूप में न हो जाए। स्रोत में बयान का क्रम इस मामले में कोई फर्क नहीं पड़ता। लेकिन चलो देखते हैं कि बुनियादी 80 मैनुअल में लूप के बारे में क्या कहना है:

बेसिक -80 मैनुअल कहता है "मू ..."

लूप के शरीर को छोड़ दिया जाता है यदि लूप का प्रारंभिक मूल्य चरण का संकेत अंतिम मूल्य चरण के संकेत से अधिक है।

तो, लूप बॉडी को पूरी तरह से छोड़ दिया जा सकता है।

हमारे पास प्रकाशित कार्यक्रमों के रूप में सबूत हैं, कि मूल रूप से कम से कम कुछ संस्करण बेसिक रूप से उनके NEXT कथनों का पता लगा रहे थे। यह करना काफी आसान है जब लूप बॉडी को निष्पादित किया जा रहा है। हालाँकि, उस मामले में जहां फॉर स्टेटमेंट की बॉडी को छोड़ दिया जाना चाहिए, जैसा कि BASIC-80 परमिट, BASIC ने NEXT स्टेटमेंट का पता कैसे लगाया, यह देखते हुए कि यह सोर्स ऑर्डर में फॉर स्टेटमेंट से पहले हो सकता है ?

  • क्या "101 बेसिक कंप्यूटर गेम्स" में प्रयुक्त BASIC का संस्करण हमेशा लूप बॉडी को कम से कम एक बार निष्पादित करता है?
  • क्या स्रोत के क्रम में, कथन के बाद होने के लिए BASIC-80 को लूप के NEXT विवरण की आवश्यकता थी?

पुनश्च: हाँ, मैं पुराने स्कूल BASIC के लिए एक BASIC दुभाषिया लिख ​​रहा हूँ। यह एक बीमारी है।


अहल पुस्तक मूल रूप से 1973 में डीईसी द्वारा प्रकाशित की गई थी, दो साल तक माइक्रोसॉफ्ट बेसिक से पहले। कार्यक्रम शायद RT-11 BASIC या BASIC-PLUS में किए गए होंगे। सिस्टम-विशिष्ट एक्सटेंशनों के अलावा, अधिकांश बोलियाँ संगत थीं, और मैंने कई प्रणालियों पर पुस्तक के DEC संस्करण से बहुत कम या बिना किसी कठिनाई के कार्यक्रमों को चलाया। आपको अप्पसॉफ्ट बेसिक रॉम प्रबुद्ध के असंतुष्ट , प्रलेखित स्रोत मिल सकते हैं । NEXTकथन को लागू करने वाला कोड $ DCF9 से शुरू होता है।
ब्लर एफएल

BASIC-80 के बारे में नहीं जानते, लेकिन मुझे 100% यकीन है कि कमोडोर बेसिक (जो Microsoft BASIC V2 था) हमेशा लूप को एक बार निष्पादित करता है, और स्रोत में कथनों का क्रम कोई फर्क नहीं पड़ता - जैसे आपको संदेह है।
डॉक्टर ब्राउन

जवाबों:


7

यह पुराने समय को वापस लाता है ...

मेरे पास पुस्तक की एक प्रति है, 3 डी प्रिंटिंग, 1975। मैंने आपकी लिस्टिंग की जाँच की और यह गैर-मूल है। मूल स्रोत कोड में बयानों का कोई स्थान नहीं है और असाइनमेंट में LET का कीवर्ड है। उदाहरण के लिए

200 LETK=M:GOSUB600

बोली डिजिटल पीडीपी -11 बेसिक है (बेसिक-प्लस या बेसिक -80 नहीं)। अनुभव से, इन खेलों में से सभी ने BASIC की सभी बोलियों पर काम नहीं किया। मेरे पास इन खेलों में से कई को फिर से याद करने के लिए एक अस्पष्ट याद है, ताकि उन्हें अन्य बोलियों पर काम करने के लिए प्राप्त किया जा सके। इस तरह की भयानक लूप संरचना निश्चित रूप से एक समस्या थी।

मुझे BASIC की 20 से अधिक विभिन्न बोलियों का अनुभव था और मैं आपको बता सकता हूं कि यह उस समय एक प्रश्न था। 2 मुख्य शिविर थे।

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

अन्य शिविर टोकन या अर्ध-संकलक थे। वे निष्पादन से पहले सभी लाइनों को स्कैन करेंगे और उन्हें किसी प्रकार के आंतरिक प्रारूप में परिवर्तित करेंगे। उन्होंने फॉर / NEXT लूप्स का भी मिलान किया और लापता GOTO और GOSUB लक्ष्यों के लिए जाँच की। डीईसी और बेसिक -80 इस शिविर में थे, जैसा कि मुझे याद है, लेकिन यह बहुत समय पहले की बात है।

आपके सवालों के जवाब में,

  1. हाँ, अगर मूल रूप से संतुष्ट हैं तो BASIC की बोली एक लूप छोड़ देती है
  2. नहीं, फॉर नेक्स्ट की सीक्वेंसिंग एक दस्तावेजी आवश्यकता नहीं थी, लेकिन व्यवहार अपरिभाषित था। एक पेशेवर के रूप में, जाहिर है मैंने ऐसा कभी नहीं किया। :)

उम्मीद है की यह मदद करेगा। ये भयानक भाषाएं हैं, लेकिन अगर आप इसे करते हैं ...


यह बहुत मददगार है, धन्यवाद। पुस्तक में एक DEC संस्करण, एक TRS-80 संस्करण और एक माइक्रो कंप्यूटर संस्करण है। माइक्रो कंप्यूटर संस्करण में कार्यक्रम Microsoft 8080 बेसिक (MITS Altair Basic Rev 4.0) में हैं; यह मेरा दुभाषिया का लक्ष्य है।
वेन कॉनराड

मैंने 1980 के आसपास CP / M पर MBASIC का उपयोग किया था, लेकिन उन पहले की हॉबीस्ट मशीनों में से कोई भी नहीं। आपको एक फ़ाइल सिस्टम की आवश्यकता है! कई मायनों में मुझे एक DEC / DG / HP / CAI / Prime / Interdata / Tektronix बेसिक और अधिक दिलचस्प लगता है, लेकिन मैं समझ सकता हूं कि आप क्यों नहीं हो सकते। शुभकामनाएँ! मुझसे मदद कर सकते हैं तो मुझसे संपर्क करें।
david.pfx

2

मेरे सामने इन प्राचीन बेसिक दुभाषियों में से एक के लिए विनिर्देश की एक प्रति नहीं है (यह भी मौजूद नहीं हो सकती है), लेकिन मैं एक अंग पर बाहर जाने वाला हूं और कहता हूं कि बेसिक दुभाषिया निष्पादित नहीं करेगा एक लूप पर NEXT जो इसका नहीं है, भले ही लूप वैरिएबल का एक ही नाम हो।

तो, दूसरे शब्दों में, आपके उदाहरण में

200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220

जब लाइन 235 निष्पादित होती है और लाइन 220 पर जाती है, तो लाइन 220 लूप के लिए सबसे ऊपर होगा, नीचे नहीं।

यह त्रुटि संदेश के लिए "बिना अगले" में स्पष्ट है; बेसिक दुभाषिया किसी भी NEXT को अस्वीकार कर देता है जिसके लिए उसे संबंधित नहीं मिला। यह आमतौर पर तब होता है जब आप अपने NEXT को आउट ऑफ़ ऑर्डर प्राप्त कर लेते हैं, जैसे कि

100 FOR I = 1 to 10
110 FOR J = 1 to 10
120 ...
130 NEXT I
140 NEXT J

तो आपके बुलेटेड सवालों के जवाब देने के लिए:

  • हां, यदि लूप वेरिएबल की सीमा के भीतर है।
  • हां, मेरी जानकारी में, यही मामला है।

2
"बेसिक दुभाषिया एक फॉरेस्ट लूप पर एक नेक्स्ट को निष्पादित नहीं करेगा जो इसका नहीं है" - मुझे पता है कि पुराने बेसिक दुभाषियों के कम से कम एक परिवार को जहां यह कथन गलत है, आप इसे "सभी प्राचीन बेसिक दुभाषियों" के लिए सामान्यीकृत नहीं कर सकते।
डॉक ब्राउन

युक्ति मौजूद है। पीडीपी -11 बुनियादी के लिए खोजें।
david.pfx

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

2

"101 कंप्यूटर गेम्स" बेसिक क्या करता है

"101 कंप्यूटर गेम्स" के माइक्रो कंप्यूटर संस्करण में उपयोग की जाने वाली BASIC की बोली कम से कम एक बार एक ... के अगले लूप को निष्पादित करेगी। यह BASIC-80 v। 5 से अलग है ।

पी से। i12 , "सामान्य" मूल के अपवादों की सूची:

के लिए ... के लिए ... कदम

जैसा कि मानक बासीक में है, सिवाय इसके कि लूप को समाप्त करने के लिए परीक्षण किया जाता है जब इसे निष्पादित किया जाता है। यही है, जब यह कार्यक्रम चलाया जाता है:

10 FOR X=2 TO 1
20 PRINT "HI"
30 NEXT X
40 END

"HI" छपा होगा ...

उसके कारण, BASIC की इस बोली को NEXT कथन का पता लगाने में कोई परेशानी नहीं है, या एक ही अगले बयान को कई कथन के साथ साझा करना है। किसी स्थिर विश्लेषण की आवश्यकता नहीं है। बस हर स्टेटमेंट को निष्पादित करें जैसा कि होता है, और आप अंततः NEXT स्टेटमेंट में पहुंच जाएंगे, चाहे वह कहीं भी हो।

क्या बाहर के क्रम को संभालने के लिए BASIC-80 संभव है?

लूप बॉडी को छोड़ना एक फॉर स्टेटमेंट के लिए संभव है, जैसा कि BASIC-80 v.5 अनुमति देता है, और अभी भी ज्यादातर मामलों में आउट-ऑफ-ऑर्डर NEXT स्टेटमेंट की अनुमति देता है। ऐसे:

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

यह प्रश्न में सरल पैथोलॉजिकल अनुक्रमों को संभालता है। यह उन मामलों को संभाल नहीं पाएगा जहां NEXT एक IF ... GOTO स्टेटमेंट, या GOSUB द्वारा पहुँचा गया था। कोड जो ऐसा करता है वह पहले से ही खराब कोड की तुलना में बहुत खराब है कि यह सरल घोषणा के लिए अनुचित नहीं है कि दुभाषिया ऐसे मामलों का समर्थन नहीं करेगा। इस तरह के कोड को आग लगाने के लिए दुभाषिया की अनुमति भी हो सकती है।

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