2012-06-16 17 views
62

Google की गो भाषा एक नई भाषा है। इसलिए मुझे आश्चर्य हुआ कि यह 'goto' कथन है। मुझे हमेशा सिखाया जाता है कि 'गोटो' कथन अतीत की बात है और इसके लिए बुराई एक कार्यक्रम के वास्तविक प्रवाह को दर्शाती है। फंक्शन (या यदि आप करेंगे तो विधियां) प्रवाह को नियंत्रित करने का हमेशा एक बेहतर तरीका है।गो के पास "गोटो" कथन क्यों है

मुझे कुछ याद आना चाहिए। 'गोटो' का उपयोग क्यों और कब एक अच्छा विचार है? या Google ने इसे क्यों शामिल किया?

+2

ऐसे समय होते हैं जहां आपको वास्तव में गोटो स्टेटमेंट की आवश्यकता होती है। गोटो केवल तब ही बुराई करते हैं जब अंधाधुंध इस्तेमाल किया जाता है। उदाहरण के लिए, यदि यह असंभव नहीं है, तो एक कठिन राज्य मशीन पार्सर के साथ गेटो स्टेटमेंट लिखना बहुत मुश्किल है। – xbonez

+3

यह जाने के लिए विशिष्ट नहीं है, लेकिन अच्छी चर्चा के लिए कि क्यों भाषाएं बयान जारी रखती हैं, और इसके उपयोग के खिलाफ तर्क देखने के लिए, [इस पोस्ट] को देखें (http://stackoverflow.com/questions/46586/goto-still- माना-हानिकारक)। प्रश्न में जुड़े कुछ अच्छे संदर्भ हैं। संपादित करें: [यहां एक और है] (http://stackoverflow.com/questions/24451/goto-usage)। –

+0

ओपी को प्रदान की गई एसओ चर्चाओं के माध्यम से grepping से बचाने के लिए, यहां [एलकेएमएल पर चर्चा] (http://kerneltrap.org/node/553/2131) जो काफी हद तक बताती है कि कुछ मामलों में 'गोटो' उपयोगी क्यों है । @ किसाकी के जवाब का अध्ययन करने के बाद पढ़ें। – kostix

उत्तर

48

में इन प्रतिबंधों देखें।

उदाहरण के लिए, math/gamma.go फ़ाइल में, the goto statement is used:

for x < 0 { 
    if x > -1e-09 { 
     goto small 
    } 
    z = z/x 
    x = x + 1 
    } 
    for x < 2 { 
    if x < 1e-09 { 
     goto small 
    } 
    z = z/x 
    x = x + 1 
    } 

    if x == 2 { 
    return z 
    } 

    x = x - 2 
    p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] 
    q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] 
    return z * p/q 

small: 
    if x == 0 { 
    return Inf(1) 
    } 
    return z/((1 + Euler*x) * x) 
} 

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

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

+18

'गोटो 'के बिना, वह कोड कम पठनीय, या कम से कम लंबा होता। इससे दिमाग में जावा प्रोग्रामर आश्चर्यचकित होंगे। –

+34

अपने उदाहरण में, क्यों न केवल एक कॉल 'छोटे (एक्स, जेड)' को कॉल करने के लिए कॉल करें? इस तरह हमें इस बारे में सोचना नहीं है कि 'छोटे:' लेबल में कौन से चर उपलब्ध हैं। मुझे संदेह है कि संकल्प में अभी भी कुछ प्रकार के इनलाइनिंग समर्थन की कमी है। –

+0

@ थॉमस, मुझे पूरा यकीन है कि यह कई मामलों में इनलाइनिंग की कमी के कारण है। कम्प्यूटेशनल गहन अनुप्रयोग जहां फंक्शन कॉल मामले में बहुत सारे गणित होते हैं, इसलिए गणित पैकेज में गोटो का उपयोग करना उचित है। –

15

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

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

आखिरकार यह ध्यान देने योग्य है कि गो के गोटो में कुछ अस्पष्ट बग से बचने के लिए कुछ प्रतिबंध हैं। जब हम वास्तव में Gos स्रोत कोड (मानक पुस्तकालय), हम देख सकते हैं जहां goto रों वास्तव में अच्छी तरह से लागू होते हैं जाँच the spec.

1

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

gotocontinue, break और return के समान तकनीकी तरीके से कूदता है। कोई तर्क दे सकता है कि ये बयान एक ही तरीके से बुरा हैं लेकिन वे नहीं हैं।

गो टीम में शामिल क्यों है गॉटोस शायद इस तथ्य के कारण हैं कि यह एक सामान्य प्रवाह नियंत्रण आदिम है। इसके अतिरिक्त वे उम्मीद करते हैं कि गो के दायरे में एक बेवकूफ-सुरक्षित भाषा को दुरुपयोग के लिए संभव नहीं है।

-2

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

+0

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

+0

हां, लेकिन एक अच्छा संकलक आपके लिए अनुकूलन करना चाहिए। अफसोस की बात है, गो का कंपाइलर अनुकूलन पर संकलन गति का समर्थन करता है। – Antimony

+0

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