ब्लॉक (प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
(Text)
(Text)
Line 9: Line 9:


== इतिहास ==
== इतिहास ==
ब्लॉक संरचना के विचार 1950 के दशक में पहले [[ऑटोकोड]] के विकास के दौरान विकसित किए गए थे, और उन्हें [[एल्गोल 58]] और एल्गोल 60 विवरण में औपचारिक रूप दिया गया था। एल्गोल 58 ने "कंपाउंड स्टेटमेंट्" की धारणा पेश की, जो केवल  पूरी तरह से कन्ट्रोल फ्लो से  संबंधित थी।'''<nowiki><ref name="algol58_report"></nowiki>{{cite journal
ब्लॉक संरचना के विचार 1950 के दशक में पहले [[ऑटोकोड]] के विकास के दौरान विकसित किए गए थे, और उन्हें [[एल्गोल 58]] और एल्गोल 60 विवरण में औपचारिक रूप दिया गया था। एल्गोल 58 ने "कंपाउंड स्टेटमेंट्" की धारणा पेश की, जो केवल  पूरी तरह से कन्ट्रोल फ्लो से  संबंधित थी। बाद की संशोधित विवरण जिसमें अल्गोल 60 के सिंटेक्स और सिमेंटिक का वर्णन किया गया है, एक ब्लॉक और [[ब्लॉक गुंजाइश|ब्लॉक स्कोप]] की धारणा को पेश करता है, जिसमें एक ब्लॉक होता है जिसमें डिक्लेरेशन का एक क्रम होता है, "जिसके बाद स्टेटमेंट्स का एक क्रम होता है और शुरुआत और अंत के बीच संलग्न होता है।" जिसमें [e] बहुत डिक्लेरेशन एक ब्लॉक में इस तरह से प्रकट होती है और केवल उस ब्लॉक के लिए मान्य होती है।
|last1= Perlis |first1 = A. J. |author-link1=Alan Perlis
|last2= Samelson |first2= K.
| date = 1958
| title = प्रारंभिक रिपोर्ट: अंतर्राष्ट्रीय बीजगणितीय भाषा| journal = Communications of the ACM
| doi = 10.1145/377924.594925
| publisher =ACM
| location = New York, NY, USA
| volume = 1
| issue = 12
| pages = 8–22
|s2cid = 28755282 }}</ रेफ>''' बाद की संशोधित रिपोर्ट जिसमें अल्गोल 60 के वाक्य-विन्यास और शब्दार्थ का वर्णन किया गया है, एक ब्लॉक और [[ब्लॉक गुंजाइश]] की धारणा को पेश करता है, जिसमें एक ब्लॉक होता है जिसमें घोषणाओं का एक क्रम होता है, जिसके बाद बयानों का एक क्रम होता है और शुरुआत और अंत के बीच संलग्न होता है। जिसमें [e] बहुत घोषणा एक ब्लॉक में इस तरह से प्रकट होती है और केवल उस ब्लॉक के लिए मान्य होती है।<ref name="algol60_report">{{cite journal
| first1=J. W. |last1=Backus |author-link1=John Backus
| first2=F. L. |last2=Bauer |author-link2=Friedrich L. Bauer
| first3=J.    |last3=Green
| first4=C.    |last4=Katz
| first5=J.    |last5=McCarthy
| first6=A. J. |last6=Perlis
| first7=H.    |last7=Rutishauser |author-link7=Heinz Rutishauser
| first8=K.    |last8=Samelson
| first9=B.    |last9=Vauquois
| first10=J. H.|last10=Wegstein
| first11=A.  |last11=van Wijngaarden
| first12=M.  |last12=Woodger
| editor1-last=Naur | editor1-first=Peter |editor1-link=Peter Naur
| date=May 1960
| title=एल्गोरिदमिक भाषा ALGOL 60 पर रिपोर्ट|journal=Communications of the ACM | publisher= ACM
| location = New York, NY, USA
| doi=10.1145/367236.367262
| issn=0001-0782
| volume = 3
| issue = 5
| pages = 299–314
|s2cid=278290 | url = http://www.masswerk.at/algol60/report.htm
| access-date = 2009-10-27
| doi-access=free
}}</रेफरी>


== सिंटेक्स ==
== सिंटेक्स ==
ब्लॉक अलग-अलग भाषाओं में अलग-अलग सिंटैक्स का उपयोग करते हैं। दो व्यापक परिवार हैं:
ब्लॉक अलग-अलग भाषाओं में अलग-अलग सिंटैक्स का उपयोग करते हैं। दो व्यापक परिवार हैं:


* [[ALGOL]] परिवार जिसमें ब्लॉक को कीवर्ड द्वारा सीमांकित किया गया है<code>begin</code>और<code>end</code>या उसके बराबर। C (प्रोग्रामिंग लैंग्वेज) में, ब्लॉक को कर्ली ब्रेसेस द्वारा सीमांकित किया जाता है -<code>{</code>और<code>}</code>. [[ALGOL 68]] कोष्ठकों का उपयोग करता है।
* [[ALGOL|एल्गोल]] परिवार जिसमें ब्लॉक "<code>begin"</code>और"<code>end"</code>या उसके बराबर को कीवर्ड द्वारा सीमांकित किया गया है। C में, ब्लॉक को कर्ली ब्रेसेस(मझला कोष्ठकों) द्वारा सीमांकित किया जाता है -<code>{</code>और<code>}</code>. [[ALGOL 68|एल्गोल 68]] कोष्ठकों का उपयोग करता है।
* कोष्ठक -<code>(</code>और<code>)</code>, MS-DOS [[बैच भाषा]] में उपयोग किए जाते हैं
* कोष्ठक -<code>(</code>और<code>)</code>, MS-DOS [[बैच भाषा]] में उपयोग किए जाते हैं
* ऑफ-साइड नियम, जैसा कि [[पायथन (प्रोग्रामिंग भाषा)]] में है
* इंडेंटेशन, जैसा कि [[पायथन (प्रोग्रामिंग भाषा)|पायथन]] में है
* [[एस-अभिव्यक्ति]] जैसे सिंटैक्टिक कीवर्ड के साथ <code>prog</code> या <code>let</code> (जैसा कि [[लिस्प (प्रोग्रामिंग भाषा)]] परिवार में है)
* [[एस-अभिव्यक्ति|एस-एक्सप्रेशन]] जैसे सिंटैक्टिक कीवर्ड के साथ <code>prog</code> या <code>let</code> (जैसा कि [[लिस्प (प्रोग्रामिंग भाषा)|लिस्प]] परिवार में है)
* 1968 में (ALGOL 68 के साथ), फिर Edsger W. Dijkstra की 1974 में गार्डेड कमांड लैंग्वेज#Selection: यदि सशर्त और पुनरावृत्त कोड ब्लॉक को वैकल्पिक रूप से ब्लॉक आरक्षित शब्द के साथ समाप्त कर दिया जाता है: उदा। <code><u>'''if'''</u> ~ <u>then</u> ~ <u>elif</u> ~ <u>else</u> ~ <u>'''fi'''</u></code>, <code><u>'''case'''</u> ~ <u>in</u> ~ <u>out</u> ~ <u>'''esac'''</u></code> और <code><u>for</u> ~ <u>while</u> ~ <u>'''do'''</u> ~ <u>'''od'''</u></code>
* 1968 में (एल्गोल 68 के साथ), फिरएडस्गेर डब्ल्यू. डिजकस्रा की 1974 में गार्डेड कमांड भाषा में सशर्त और पुनरावृत्त कोड ब्लॉक को वैकल्पिक रूप से ब्लॉक आरक्षित शब्द के साथ समाप्त कर दिया गया: उदा। <code><u>'''if'''</u> ~ <u>then</u> ~ <u>elif</u> ~ <u>else</u> ~ <u>'''fi'''</u></code>, <code><u>'''case'''</u> ~ <u>in</u> ~ <u>out</u> ~ <u>'''esac'''</u></code> और <code><u>for</u> ~ <u>while</u> ~ <u>'''do'''</u> ~ <u>'''od'''</u></code>




== सीमाएं ==
== सीमाएं ==
कुछ भाषाएँ जो घोषणाओं के साथ ब्लॉक का समर्थन करती हैं, वे सभी घोषणाओं का पूर्ण समर्थन नहीं करती हैं; उदाहरण के लिए कई सी-व्युत्पन्न भाषाएँ एक ब्लॉक ([[नेस्टेड समारोह]]) के भीतर फ़ंक्शन परिभाषा की अनुमति नहीं देती हैं। और अपने पूर्वज अल्गोल के विपरीत, पास्कल किसी मौजूदा ब्लॉक के आरंभ और अंत के अंदर अपनी स्वयं की घोषणाओं के साथ ब्लॉक के उपयोग का समर्थन नहीं करता है, केवल मिश्रित बयानों से बयानों के अनुक्रम को एक साथ समूहीकृत किया जा सकता है अगर, जबकि, दोहराना और अन्य नियंत्रण बयान।
कुछ भाषाएँ जो डिक्लेरेशन के साथ ब्लॉक का समर्थन करती हैं, वे सभी डेक्लरेशंस का पूर्ण समर्थन नहीं करती हैं; उदाहरण के लिए कई सी-व्युत्पन्न भाषाएँ एक ब्लॉक ([[नेस्टेड समारोह|नेस्टेड फंक्शन्स]] ) के भीतर फ़ंक्शन परिभाषा की अनुमति नहीं देती हैं। और अपने पूर्वज अल्गोल के विपरीत, पास्कल किसी मौजूदा ब्लॉक के आरंभ और अंत के अंदर अपनी स्वयं की डेक्लरेशंस के साथ ब्लॉक के उपयोग का समर्थन नहीं करता है, केवल कंपाउंड स्टेटमेंट्स से स्टेटमेंट्स के अनुक्रम को एक साथ समूहीकृत किया जा सकता है इफ, वाहील, रिपीट और अन्य नियंत्रण स्टेटमेंट्स।


== मूल शब्दार्थ ==
== मूल शब्दार्थ ==
एक ब्लॉक का शब्दार्थ अर्थ दुगना है। सबसे पहले, यह प्रोग्रामर को मनमाने ढंग से बड़े और जटिल ढांचे बनाने का एक तरीका प्रदान करता है जिसे इकाइयों के रूप में माना जा सकता है। दूसरे, यह प्रोग्रामर को वेरिएबल्स के दायरे को सीमित करने और कभी-कभी अन्य वस्तुओं को घोषित करने में सक्षम बनाता है।
एक ब्लॉक का शब्दार्थ अर्थ द्विमुखी है। सबसे पहले, यह प्रोग्रामर को मनमाने ढंग से बड़े और जटिल ढांचे बनाने का एक तरीका प्रदान करता है जिसे इकाइयों के रूप में माना जा सकता है। दूसरे, यह प्रोग्रामर को वेरिएबल्स के दायरे को सीमित करने और कभी-कभी अन्य ऑब्जेक्ट्स को डिक्लेअर करने में सक्षम बनाता है।


[[फोरट्रान चतुर्थ]] और [[बुनियादी]] जैसी शुरुआती भाषाओं में, कोई स्टेटमेंट ब्लॉक या कंट्रोल स्ट्रक्चर नहीं थे। कंडीशनल [[के लिए जाओ]] स्टेटमेंट्स का उपयोग करके सशर्त लागू किए गए थे:
[[फोरट्रान चतुर्थ]] और [[बुनियादी|बेसिक]] जैसी शुरुआती भाषाओं में, कोई स्टेटमेंट ब्लॉक या कंट्रोल स्ट्रक्चर नहीं थे। कंडीशनल [[के लिए जाओ|के लिए गो टू]] स्टेटमेंट्स का उपयोग करके सशर्त लागू किए गए थे:
      C    LANGUAGE: ANSI STANDARD FORTRAN 66


<वाक्यविन्यास प्रकाश लैंग = fortranfixed>
C     INITIALIZE VALUES TO BE CALCULATED
सी भाषा: एएनएसआई मानक फोरट्रान 66
      PAYSTX = .FALSE.
C परिकलित किए जाने वाले मानों को प्रारंभ करें
      PAYSST = .FALSE.
      PAYSX = .FALSE।
      TAX = 0.0
      भुगतान = .गलत।
      SUPTAX = 0.0
      कर = 0.0
C    SKIP TAX DEDUCTION IF EMPLOYEE EARNS LESS THAN TAX THRESHOLD
      एसयूपीटीएक्स = 0.0
      IF (WAGES .LE. TAXTHR) GOTO 100
सी कर कटौती छोड़ें यदि कर्मचारी कर सीमा से कम कमाता है
      PAYSTX = .TRUE.
      IF (WAGES .LE. TAXTHR) GOTO 100
      TAX = (WAGES - TAXTHR) * BASCRT
      PAYSX = .TRUE।
C     SKIP SUPERTAX DEDUCTION IF EMPLOYEE EARNS LESS THAN SUPERTAX THRESHOLD
      टैक्स = (मजदूरी - टैक्सथर) * BASCRT
      IF (WAGES .LE. SUPTHR) GOTO 100
C यदि कर्मचारी सुपरटैक्स सीमा से कम कमाता है तो सुपरटैक्स कटौती छोड़ दें
      PAYSST = .TRUE.
      IF (WAGES .LE. SUPTHR) GOTO 100
      SUPTAX = (WAGES - SUPTHR) * SUPRAT
      भुगतान = .TRUE।
  100 TAXED = WAGES - TAX - SUPTAX
      SUPTAX = (मजदूरी - SUPTHR) * SUPRAT
प्रोग्राम की तार्किक संरचना भाषा में परिलक्षित नहीं होती है, और जब किसी दिए गए कथन को निष्पादित किया जाता है तो उसका विश्लेषण करना कठिन हो सकता है।
  100 कर = मजदूरी - कर - उपकर
</वाक्यविन्यास हाइलाइट>


कार्यक्रम की तार्किक संरचना भाषा में परिलक्षित नहीं होती है, और जब किसी दिए गए कथन को निष्पादित किया जाता है तो उसका विश्लेषण करना कठिन हो सकता है।
ब्लॉक प्रोग्रामर को बयानों के एक समूह को एक इकाई के रूप में व्यवहार करने की अनुमति देते हैं, और पूर्व निर्धारित मान जो प्रोग्रामिंग की इस शैली में आरंभीकरण में प्रकट होते हैं, उन्हें ब्लॉक संरचना के साथ, निर्णय के करीब रखा जा सकता है:
      { Language: Jensen and Wirth Pascal }


ब्लॉक प्रोग्रामर को बयानों के एक समूह को एक इकाई के रूप में व्यवहार करने की अनुमति देते हैं, और डिफ़ॉल्ट मान जो प्रोग्रामिंग की इस शैली में आरंभीकरण में प्रकट होते हैं, उन्हें ब्लॉक संरचना के साथ, निर्णय के करीब रखा जा सकता है:
    if wages > tax_threshold then
        begin
        paystax := true;
        tax := (wages - tax_threshold) * tax_rate
        { The block structure makes it easier to see how the code could
          be refactored for clarity, and also makes it easier to do,
          because the structure of the inner conditional can easily be moved
          out of the outer conditional altogether and the effects of doing
          so are easily predicted. }
        if wages > supertax_threshold then begin
            pays_supertax := true;
            supertax := (wages - supertax_threshold) * supertax_rate
        end
        else begin
            pays_supertax := false;
            supertax := 0
        end
    end
    else begin
        paystax := false; pays_supertax := false;
        tax := 0; supertax := 0
    end;
    taxed := wages - tax - supertax;
[[पास्कल (प्रोग्रामिंग भाषा)|पास्कल]] के उपरोक्त खंड में ब्लॉक का उपयोग प्रोग्रामर के इरादे को स्पष्ट करता है, और परिणामी ब्लॉक को [[सशर्त (कंप्यूटर प्रोग्रामिंग)|कंडीशनल]] स्टेटमेंट के नेस्टेड पदानुक्रम में संयोजित करने में सक्षम बनाता है। कोड की संरचना प्रोग्रामर की सोच को अधिक बारीकी से दर्शाती है, जिससे इसे समझना और संशोधित करना आसान हो जाता है।


<वाक्यविन्यास लैंग = पास्कल>
उपरोक्त स्रोत कोड को और भी स्पष्ट किया जा सकता है यदि आंतरिक इफ स्टेटमेंट् को बाहरी एक से पूरी तरह से निकालकर, दो ब्लॉकों को एक के बाद एक लगातार निष्पादित करने के लिए रखा जाए। शब्दार्थ की दृष्टि से इस मामले में थोड़ा अंतर है, और पठनीयता के लिए इंडेंटिंग द्वारा समर्थित ब्लॉक संरचना का उपयोग, प्रोग्रामर के लिए कोड को रिफैक्टर करना आसान बनाता है।
    {भाषा: जेन्सेन और विर्थ पास्कल}
    यदि मजदूरी> कर_थ्रेशोल्ड तब
        शुरू
        भुगतान कर: = सच;
        कर := (मजदूरी - कर_सीमा) * कर_दर
        {ब्लॉक संरचना यह देखना आसान बनाती है कि कोड कैसे हो सकता है
          स्पष्टता के लिए रिफैक्टर किया जा सकता है, और यह करना भी आसान बनाता है,
          क्योंकि आंतरिक सशर्त की संरचना को आसानी से स्थानांतरित किया जा सकता है
          पूरी तरह से बाहरी सशर्त और करने के प्रभाव से बाहर
          इसलिए आसानी से भविष्यवाणी की जाती है। }
        यदि मजदूरी> सुपरटैक्स_थ्रेशोल्ड है तो शुरू करें
            pays_supertax := सच;
            सुपरटैक्स := (मजदूरी - सुपरटैक्स_थ्रेशोल्ड) * सुपरटैक्स_रेट
        अंत
        वरना शुरू करो
            pay_supertax := झूठा;
            सुपरटैक्स := 0
        अंत
    अंत
    वरना शुरू करो
        भुगतान कर : = असत्य; pay_supertax := झूठा;
        कर := 0; सुपरटैक्स := 0
    अंत;
    कर लगाया गया: = मजदूरी - कर - सुपरटैक्स;
</वाक्यविन्यास हाइलाइट>


[[पास्कल (प्रोग्रामिंग भाषा)]] के उपरोक्त खंड में ब्लॉक का उपयोग प्रोग्रामर के इरादे को स्पष्ट करता है, और परिणामी ब्लॉक को [[सशर्त (कंप्यूटर प्रोग्रामिंग)]] स्टेटमेंट के नेस्टेड पदानुक्रम में संयोजित करने में सक्षम बनाता है। कोड की संरचना प्रोग्रामर की सोच को अधिक बारीकी से दर्शाती है, जिससे इसे समझना और संशोधित करना आसान हो जाता है।
पुरानी भाषाओं में, वेरिएबल का व्यापक दायरा था। उदाहरण के लिए, IEMPNO नामक एक पूर्णांक वेरिएबल का उपयोग फोरट्रान प्रक्रिया के एक भाग में एक कर्मचारी सामाजिक सुरक्षा संख्या (ssn) को दर्शाने के लिए किया जा सकता है, लेकिन उसी प्रक्रिया पर रखरखाव कार्य के दौरान, एक प्रोग्रामर गलती से उसी वेरिएबल, IEMPNO का उपयोग कर सकता है। एक अलग उद्देश्य, और इसका परिणाम एक त्रुटि हो सकता है जिसे अवशेष करना मुश्किल था। ब्लॉक स्वरूप प्रोग्रामर्स के लिए एक मिनट के स्तर तक स्कोप को नियंत्रित करना आसान बनाता है।
  ;; Language: R5RS Standard Scheme


उपरोक्त स्रोत कोड को और भी स्पष्ट किया जा सकता है यदि आंतरिक कथन को बाहरी एक से पूरी तरह से निकालकर, दो ब्लॉकों को एक के बाद एक लगातार निष्पादित करने के लिए रखा जाए। शब्दार्थ की दृष्टि से इस मामले में थोड़ा अंतर है, और पठनीयता के लिए इंडेंटिंग द्वारा समर्थित ब्लॉक संरचना का उपयोग, प्रोग्रामर के लिए कोड को रिफैक्टर करना आसान बनाता है।
(let ((empno (ssn-of employee-name)))
 
  (while (is-manager empno)
आदिम भाषाओं में, चर का व्यापक दायरा था। उदाहरण के लिए, IEMPNO नामक एक पूर्णांक चर का उपयोग फोरट्रान सबरूटीन के एक भाग में एक कर्मचारी सामाजिक सुरक्षा संख्या (ssn) को दर्शाने के लिए किया जा सकता है, लेकिन उसी सबरूटीन पर रखरखाव कार्य के दौरान, एक प्रोग्रामर गलती से उसी चर, IEMPNO का उपयोग कर सकता है। एक अलग उद्देश्य, और इसका परिणाम एक बग हो सकता है जिसे ट्रेस करना मुश्किल था। ब्लॉक स्ट्रक्चर प्रोग्रामर्स के लिए एक मिनट के स्तर तक स्कोप को नियंत्रित करना आसान बनाता है।
    (let ((employees (length (underlings-of empno))))
 
      (printf "~a has ~a employees working under him:~%" employee-name employees)
<वाक्यविन्यास लैंग = योजना>
      (for-each
;; भाषा: R5RS मानक योजना
        (lambda (empno)
(चलो ((empno (ssn-of कर्मचारी-नाम)))
          ;; Within this lambda expression the variable empno refers to the ssn
  (जबकि (is-manager empno)
          ;; of an underling. The variable empno in the outer expression,
    (चलो ((कर्मचारी (लंबाई (अंडरलिंग्स-ऑफ एम्पो))))
          ;; referring to the manager's ssn, is shadowed.
      (printf ~a में ~एक कर्मचारी उसके अधीन काम कर रहा है:~% कर्मचारी-नाम कर्मचारी)
          (printf "Name: ~a, role: ~a~%"
      (प्रत्येक के लिए
                  (name-of empno)
        (लैम्ब्डा (ईएमपीएनओ)
                  (role-of empno)))
          ;; इस लैम्ब्डा अभिव्यक्ति के भीतर परिवर्तनीय एम्पो एसएसएन को संदर्भित करता है
        (underlings-of empno)))))
          ;; एक अधीनस्थ का। बाहरी अभिव्यक्ति में चर एम्पो,
उपरोक्त योजना के खंड में, एम्पो का उपयोग प्रबंधक और उनके अधीनस्थ दोनों को उनके संबंधित ssn द्वारा पहचानने के लिए किया जाता है, लेकिन क्योंकि अधीनस्थ ssn को एक आंतरिक ब्लॉक के भीतर घोषित किया जाता है, यह उसी नाम के वेरिएबल के साथ अन्तःक्रिया नहीं करता है प्रबंधक का एसएसएन निहित है। व्यवहार में, स्पष्टता के विचार संभवतः प्रोग्रामर को अलग-अलग वेरिएबल नाम चुनने के लिए प्रेरित करेंगे, लेकिन उनके पास विकल्प है और अनजाने में त्रुटि को पेश करना अधिक कठिन है।
          ;; मैनेजर के एसएसएन का जिक्र छाया हुआ है।
          (प्रिंटफ नाम: ~, भूमिका: ~~%
                  (नाम-एम्पनो)
                  (भूमिका-एम्पनो)))
        (अंडरलिंग्स-एम्पनो)))))
</वाक्यविन्यास हाइलाइट>
 
उपरोक्त योजना (प्रोग्रामिंग लैंग्वेज) के टुकड़े में, एम्पो का उपयोग प्रबंधक और उनके अंडरलिंग दोनों को उनके संबंधित ssn द्वारा पहचानने के लिए किया जाता है, लेकिन क्योंकि अंडरलिंग ssn को एक आंतरिक ब्लॉक के भीतर घोषित किया जाता है, यह उसी नाम के चर के साथ इंटरैक्ट नहीं करता है प्रबंधक का एसएसएन शामिल है। व्यवहार में, स्पष्टता के विचार शायद प्रोग्रामर को अलग-अलग चर नाम चुनने के लिए प्रेरित करेंगे, लेकिन उनके पास विकल्प है और अनजाने में बग को पेश करना अधिक कठिन है।


== उत्थापन ==
== उत्थापन ==
कुछ भाषाओं में, एक चर को संलग्न ब्लॉकों के भीतर भी कार्य क्षेत्र में घोषित किया जा सकता है। उदाहरण के लिए, जावास्क्रिप्ट में, घोषित चर <code>var</code> कार्यक्षेत्र है।
कुछ भाषाओं में, एक वेरिएबल को संलग्न ब्लॉकों के भीतर भी फंक्शन्स में घोषित किया जा सकता है। उदाहरण के लिए, जावास्क्रिप्ट में, <code>var</code> के साथ घोषित वेरिएबल्स में फंक्शन स्कोप है।


== यह भी देखें ==
== यह भी देखें ==

Revision as of 10:57, 6 March 2023

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

ब्लॉक के दो फंक्शन्स हैं: स्टेटमेंट्स को समूहित करना ताकि उन्हें एक स्टेटमेंट् के रूप में माना जा सके, और नाम स्कोप को परिभाषित करना ताकि उन्हें उसी नाम से अलग किया जा सके जो कहीं और उपयोग किया गया हो। एक ब्लॉक-संरचित प्रोग्रामिंग भाषा में, बाहरी ब्लॉकों में नामित ऑब्जेक्ट आंतरिक ब्लॉकों के अंदर दिखाई देते हैं, जब तक कि वे उसी नाम से घोषित ऑब्जेक्ट द्वारा नाम मास्किंग न हों।

इतिहास

ब्लॉक संरचना के विचार 1950 के दशक में पहले ऑटोकोड के विकास के दौरान विकसित किए गए थे, और उन्हें एल्गोल 58 और एल्गोल 60 विवरण में औपचारिक रूप दिया गया था। एल्गोल 58 ने "कंपाउंड स्टेटमेंट्" की धारणा पेश की, जो केवल पूरी तरह से कन्ट्रोल फ्लो से संबंधित थी। बाद की संशोधित विवरण जिसमें अल्गोल 60 के सिंटेक्स और सिमेंटिक का वर्णन किया गया है, एक ब्लॉक और ब्लॉक स्कोप की धारणा को पेश करता है, जिसमें एक ब्लॉक होता है जिसमें डिक्लेरेशन का एक क्रम होता है, "जिसके बाद स्टेटमेंट्स का एक क्रम होता है और शुरुआत और अंत के बीच संलग्न होता है।" जिसमें [e] बहुत डिक्लेरेशन एक ब्लॉक में इस तरह से प्रकट होती है और केवल उस ब्लॉक के लिए मान्य होती है।

सिंटेक्स

ब्लॉक अलग-अलग भाषाओं में अलग-अलग सिंटैक्स का उपयोग करते हैं। दो व्यापक परिवार हैं:

  • एल्गोल परिवार जिसमें ब्लॉक "begin"और"end"या उसके बराबर को कीवर्ड द्वारा सीमांकित किया गया है। C में, ब्लॉक को कर्ली ब्रेसेस(मझला कोष्ठकों) द्वारा सीमांकित किया जाता है -{और}. एल्गोल 68 कोष्ठकों का उपयोग करता है।
  • कोष्ठक -(और), MS-DOS बैच भाषा में उपयोग किए जाते हैं
  • इंडेंटेशन, जैसा कि पायथन में है
  • एस-एक्सप्रेशन जैसे सिंटैक्टिक कीवर्ड के साथ prog या let (जैसा कि लिस्प परिवार में है)
  • 1968 में (एल्गोल 68 के साथ), फिरएडस्गेर डब्ल्यू. डिजकस्रा की 1974 में गार्डेड कमांड भाषा में सशर्त और पुनरावृत्त कोड ब्लॉक को वैकल्पिक रूप से ब्लॉक आरक्षित शब्द के साथ समाप्त कर दिया गया: उदा। if ~ then ~ elif ~ else ~ fi, case ~ in ~ out ~ esac और for ~ while ~ do ~ od


सीमाएं

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

मूल शब्दार्थ

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

फोरट्रान चतुर्थ और बेसिक जैसी शुरुआती भाषाओं में, कोई स्टेटमेंट ब्लॉक या कंट्रोल स्ट्रक्चर नहीं थे। कंडीशनल के लिए गो टू स्टेटमेंट्स का उपयोग करके सशर्त लागू किए गए थे:

     C     LANGUAGE: ANSI STANDARD FORTRAN 66
C     INITIALIZE VALUES TO BE CALCULATED
      PAYSTX = .FALSE.
      PAYSST = .FALSE.
      TAX = 0.0
      SUPTAX = 0.0
C     SKIP TAX DEDUCTION IF EMPLOYEE EARNS LESS THAN TAX THRESHOLD
      IF (WAGES .LE. TAXTHR) GOTO 100
      PAYSTX = .TRUE.
      TAX = (WAGES - TAXTHR) * BASCRT
C     SKIP SUPERTAX DEDUCTION IF EMPLOYEE EARNS LESS THAN SUPERTAX THRESHOLD
      IF (WAGES .LE. SUPTHR) GOTO 100
      PAYSST = .TRUE.
      SUPTAX = (WAGES - SUPTHR) * SUPRAT
  100 TAXED = WAGES - TAX - SUPTAX

प्रोग्राम की तार्किक संरचना भाषा में परिलक्षित नहीं होती है, और जब किसी दिए गए कथन को निष्पादित किया जाता है तो उसका विश्लेषण करना कठिन हो सकता है।

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

      { Language: Jensen and Wirth Pascal }
    if wages > tax_threshold then
        begin
        paystax := true;
        tax := (wages - tax_threshold) * tax_rate
        { The block structure makes it easier to see how the code could
          be refactored for clarity, and also makes it easier to do,
          because the structure of the inner conditional can easily be moved
          out of the outer conditional altogether and the effects of doing
          so are easily predicted. }
        if wages > supertax_threshold then begin
            pays_supertax := true;
            supertax := (wages - supertax_threshold) * supertax_rate
        end
        else begin
            pays_supertax := false;
            supertax := 0
        end
    end
    else begin
        paystax := false; pays_supertax := false;
        tax := 0; supertax := 0
    end;
    taxed := wages - tax - supertax;

पास्कल के उपरोक्त खंड में ब्लॉक का उपयोग प्रोग्रामर के इरादे को स्पष्ट करता है, और परिणामी ब्लॉक को कंडीशनल स्टेटमेंट के नेस्टेड पदानुक्रम में संयोजित करने में सक्षम बनाता है। कोड की संरचना प्रोग्रामर की सोच को अधिक बारीकी से दर्शाती है, जिससे इसे समझना और संशोधित करना आसान हो जाता है।

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

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

 ;; Language: R5RS Standard Scheme
(let ((empno (ssn-of employee-name)))
  (while (is-manager empno)
    (let ((employees (length (underlings-of empno))))
      (printf "~a has ~a employees working under him:~%" employee-name employees)
      (for-each
        (lambda (empno)
          ;; Within this lambda expression the variable empno refers to the ssn
          ;; of an underling. The variable empno in the outer expression,
          ;; referring to the manager's ssn, is shadowed.
          (printf "Name: ~a, role: ~a~%"
                  (name-of empno)
                  (role-of empno)))
        (underlings-of empno)))))

उपरोक्त योजना के खंड में, एम्पो का उपयोग प्रबंधक और उनके अधीनस्थ दोनों को उनके संबंधित ssn द्वारा पहचानने के लिए किया जाता है, लेकिन क्योंकि अधीनस्थ ssn को एक आंतरिक ब्लॉक के भीतर घोषित किया जाता है, यह उसी नाम के वेरिएबल के साथ अन्तःक्रिया नहीं करता है प्रबंधक का एसएसएन निहित है। व्यवहार में, स्पष्टता के विचार संभवतः प्रोग्रामर को अलग-अलग वेरिएबल नाम चुनने के लिए प्रेरित करेंगे, लेकिन उनके पास विकल्प है और अनजाने में त्रुटि को पेश करना अधिक कठिन है।

उत्थापन

कुछ भाषाओं में, एक वेरिएबल को संलग्न ब्लॉकों के भीतर भी फंक्शन्स में घोषित किया जा सकता है। उदाहरण के लिए, जावास्क्रिप्ट में, var के साथ घोषित वेरिएबल्स में फंक्शन स्कोप है।

यह भी देखें

संदर्भ