जनरेटर (कंप्यूटर प्रोग्रामिंग)

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

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

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

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

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

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

समयरेखा
जेनरेटर पहली बार CLU (प्रोग्रामिंग लैंग्वेज) (1975) में दिखाई दिए, स्ट्रिंग हेरफेर भाषा आइकन (प्रोग्रामिंग भाषा) (1977) में एक प्रमुख विशेषता थी और अब पायथन (प्रोग्रामिंग भाषा) (2001) में उपलब्ध है, सी शार्प (प्रोग्रामिंग लैंग्वेज)|सी#, रूबी (प्रोग्रामिंग भाषा), पीएचपी, ECMAScript (ECMAScript#6th_Edition_–_ECMAScript_2015|ES6/ES2015 के अनुसार), और अन्य भाषाएँ। सीएलयू और सी # में, जनरेटर को इटरेटर कहा जाता है, और रूबी में एन्युमरेटर्स।

लिस्प
अंतिम सामान्य लिस्प मानक मूल रूप से जनरेटर प्रदान नहीं करता है, फिर भी विभिन्न पुस्तकालय कार्यान्वयन मौजूद हैं, जैसे कि SERIES प्रलेखित CLtL2 या pygen में।

सीएलयू
उपयोक्ता-परिभाषित डेटा सार पर पुनरावृत्तियों को लागू करने के लिए एक उपज विवरण का उपयोग किया जाता है।

चिह्न
प्रत्येक अभिव्यक्ति (लूप सहित) एक जनरेटर है। भाषा में कई जनरेटर अंतर्निहित हैं और यहां तक ​​​​कि जनरेटर तंत्र (तार्किक संयोजन या OR इस तरह से किया जाता है) का उपयोग करके कुछ तर्क शब्दार्थों को लागू करता है।

0 से 20 तक के मुद्रण वर्गों को लिखकर एक सह-दिनचर्या का उपयोग करके प्राप्त किया जा सकता है: हालाँकि, अधिकांश समय कस्टम जनरेटर को सस्पेंड कीवर्ड के साथ लागू किया जाता है जो CLU में उपज कीवर्ड की तरह ही कार्य करता है।

सी
सी (प्रोग्रामिंग भाषा) में भाषा निर्माण के रूप में जनरेटर कार्य नहीं होते हैं, लेकिन, चूंकि वे कोरटाइन का एक सबसेट हैं, इसलिए उन्हें किसी भी ढांचे का उपयोग करके लागू करना आसान है जो स्टैकफुल कोरटाइन को लागू करता है, जैसे कि लिबडिल। POSIX प्लेटफार्मों पर, जब प्रति पुनरावृत्ति संदर्भ स्विचिंग की लागत चिंता का विषय नहीं है, या केवल समवर्ती (कंप्यूटर_साइंस) के बजाय पूर्ण समानांतर_कंप्यूटिंग वांछित है, तो pthreads और Anonymous_pipe का उपयोग करके एक बहुत ही सरल जनरेटर फ़ंक्शन फ्रेमवर्क लागू किया जा सकता है।

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

इसके बाद इसका उपयोग करके पुनरावृत्त किया जा सकता है:

इसके अलावा, सी ++ 11 foreach लूप को किसी भी वर्ग पर लागू करने की अनुमति देता है जो प्रदान करता है  और   कार्य करता है। दोनों पुनरावर्तनीय विधियों को परिभाषित करके जेनरेटर जैसी कक्षाएं लिखना संभव है (  और  ) और इटरेटर तरीके (,   और  ) समान कक्षा में। उदाहरण के लिए, निम्नलिखित प्रोग्राम लिखना संभव है:

एक मूल श्रेणी कार्यान्वयन ऐसा दिखाई देगा:

पर्ल
पर्ल मूल रूप से जनरेटर प्रदान नहीं करता है, लेकिन समर्थन Coro::Generator मॉड्यूल द्वारा प्रदान किया जाता है जो Coro का उपयोग करता है। ] सह-नियमित ढांचा। उदाहरण उपयोग:

राकु
आइकॉन के समानांतर उदाहरण भाषा के साथ जनरेटर प्राप्त करने के कई तरीकों में से एक के रूप में राकू (पूर्व/उर्फ पर्ल 6) रेंज क्लास का उपयोग करता है।

0 से 20 तक के वर्गों को लिखकर प्राप्त किया जा सकता है: हालाँकि, अधिकांश समय कस्टम जनरेटर एक आलसी संदर्भ में कीवर्ड इकट्ठा करने और लेने के साथ कार्यान्वित किए जाते हैं।

टीसीएल
टीसीएल 8.6 में, जेनरेटर मैकेनिज्म नामित कोरआउट्स पर आधारित है।

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

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

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

पीएचपी
PHP के समुदाय ने PHP 5.5 में जेनरेटर लागू किए। विवरण मूल Request for Comments: Generators में पाया जा सकता है।

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

रूबी
रूबी बिल्ट-इन एन्युमरेटर वर्ग के रूप में जेनरेटर (संस्करण 1.9 से शुरू) का समर्थन करता है।

जावा
जावा के शुरुआती दिनों से इटरेटर्स को लागू करने के लिए एक मानक इंटरफ़ेस रहा है, और जावा 5 के बाद से, फ़ॉरच कंस्ट्रक्शन उन ऑब्जेक्ट्स पर लूप करना आसान बनाता है जो प्रदान करते हैं  इंटरफेस। (जावा संग्रह ढांचे और अन्य संग्रह ढांचे, आम तौर पर सभी संग्रहों के लिए इटरेटर प्रदान करते हैं।)

या जावा 8 सुपर-इंटरफ़ेस बेसस्ट्रीम ऑफ़ स्ट्रीम इंटरफ़ेस से एक इटरेटर प्राप्त करें। आउटपुट:

सी#
एक उदाहरण सी # 2.0 जनरेटर (  सी # संस्करण 2.0 के बाद से उपलब्ध है): ये दोनों उदाहरण जेनरिक का उपयोग करते हैं, लेकिन इसकी आवश्यकता नहीं है। उपज कीवर्ड संग्रह पर कस्टम स्टेटफुल पुनरावृत्तियों को लागू करने में भी मदद करता है जैसा कि इस चर्चा में चर्चा की गई है।

एकाधिक का उपयोग करना संभव है  बयान और वे प्रत्येक पुनरावृत्ति पर अनुक्रम में लागू होते हैं:

एक्सएल
एक्सएल (प्रोग्रामिंग भाषा) में, इटरेटर 'लूप' के लिए आधार हैं:

एफ #
F Sharp (प्रोग्रामिंग भाषा)|F# संस्करण 1.9.1 के बाद से अनुक्रम अभिव्यक्ति के माध्यम से जनरेटर प्रदान करता है। ये एक अनुक्रम (आलस्यपूर्ण मूल्यांकन, अनुक्रमिक पहुंच) के माध्यम से परिभाषित कर सकते हैं, एक सूची (उत्सुकता से मूल्यांकन, अनुक्रमिक पहुंच) के माध्यम से   या एक सरणी (उत्सुकता से मूल्यांकन, अनुक्रमित पहुंच) के माध्यम से   जिसमें कोड होता है जो मान उत्पन्न करता है। उदाहरण के लिए, 0 से 25 तक की संख्याओं की श्रेणी से संख्याओं को छानकर 0 से 14 तक की संख्याओं के वर्गों का एक क्रम बनाता है।

पायथन
जनरेटर को 2001 में संस्करण 2.2 में पायथन (प्रोग्रामिंग भाषा) में जोड़ा गया था। एक उदाहरण जनरेटर:

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

पीईपी 380 (पायथन 3.3 में लागू) जोड़ता है  अभिव्यक्ति, एक जनरेटर को अपने संचालन का हिस्सा दूसरे जनरेटर या पुनरावर्तनीय को सौंपने की अनुमति देता है।

जेनरेटर भाव
पायथन में सूची की समझ के आधार पर एक सिंटैक्स तैयार किया गया है, जिसे जनरेटर अभिव्यक्ति कहा जाता है जो जनरेटर के निर्माण में सहायता करता है। निम्नलिखित से वर्गों की गणना करने के लिए जेनरेटर अभिव्यक्ति का उपयोग करके ऊपर दिए गए पहले उदाहरण का विस्तार करता है  जनरेटर समारोह:

ईसीएमएस्क्रिप्ट
ECMAScript (उर्फ हार्मनी) ने जेनरेटर फ़ंक्शंस पेश किए।

एक फ़ंक्शन जनरेटर का उपयोग करके एक अनंत फाइबोनैचि अनुक्रम लिखा जा सकता है:

आर
इस उद्देश्य के लिए इटरेटर्स पैकेज का उपयोग किया जा सकता है।

स्मालटॉक
फिरौन में उदाहरण:

नीचे दिया गया सुनहरा अनुपात  जेनरेटर प्रत्येक इनवोकेशन 'गोल्डनरेशियो नेक्स्ट' को गोल्डन रेशियो का एक बेहतर सन्निकटन देता है।

नीचे दिया गया व्यंजक अगले 10 सन्निकटन लौटाता है।

अधिक जानकारी Pharo: Generator में देखें।

यह भी देखें

 * मूल्यों के अनुक्रम उत्पन्न करने वाले अन्य निर्माण के लिए सूची समझ
 * एक समय में एक सूची एक तत्व बनाने की अवधारणा के लिए पुनरावर्तक
 * एक विकल्प के लिए Iteratee
 * जरूरत पड़ने पर मूल्यों के उत्पादन के लिए आलसी मूल्यांकन
 * उपज के बजाय पुनरावर्तन द्वारा संभावित अनंत डेटा के लिए कोरकर्शन
 * सबरूटीन से और भी अधिक सामान्यीकरण के लिए कोरूटीन
 * नियंत्रण प्रवाह के सामान्यीकरण के लिए निरंतरता

संदर्भ

 * Stephan Murer, Stephen Omohundro, David Stoutamire and Clemens Szyperski: Iteration abstraction in Sather. ACM Transactions on Programming Languages and Systems, 18(1):1-15 (1996)