पुनरावृत्ति का समर्थन करने के लिए क्या अनिवार्य प्रोग्रामिंग भाषाएं नहीं हैं?


21

मेरे ज्ञान के लिए, सभी आधुनिक अनिवार्य प्रोग्रामिंग भाषाएं इस अर्थ में पुनरावृत्ति का समर्थन करती हैं कि एक प्रक्रिया खुद को कॉल कर सकती है। यह हमेशा ऐसा नहीं होता था, लेकिन मैं त्वरित Google खोज के साथ कोई कठिन तथ्य नहीं खोज सकता। तो मेरा सवाल है:

किन भाषाओं ने शुरू से ही पुनरावृत्ति का समर्थन नहीं किया और उस समर्थन को कब जोड़ा गया?

जवाबों:


21

मुझे यकीन नहीं है कि COBOL करता है (यह निश्चित रूप से एक समय में नहीं था), लेकिन मैं किसी की भी बहुत देखभाल करने की कल्पना नहीं कर सकता।

फ़ोर्ट्रान फ़ॉर्टन 90 के बाद से है, लेकिन इसके लिए आपको recursiveयह बताने के लिए कीवर्ड का उपयोग करना होगा कि सबरूटीन पुनरावर्ती है।

PL / I बहुत अधिक समान था - पुनरावृत्ति का समर्थन किया गया था, लेकिन आपको स्पष्ट रूप से यह बताना था कि क्या प्रक्रियाएं पुनरावर्ती थीं।

मुझे संदेह है कि हालांकि उससे कई अधिक हैं। जब आप इसे करने के लिए नीचे उतरते हैं, तो पुनरावृत्ति पर प्रतिबंध लगाना ज्यादातर आईबीएम ने अपनी भाषा के डिजाइनों में किया था, इस साधारण कारण के लिए कि आईबीएम (360/370/3090 / ...) मेनफ्रेम हार्डवेयर में स्टैक का समर्थन नहीं करते हैं। जब अधिकांश भाषाएं आईबीएम से आईं, तो उन्होंने ज्यादातर पुनरावृत्ति पर रोक लगा दी। अब जब वे सभी अन्य स्थानों से आते हैं, तो पुनरावृत्ति की अनुमति हमेशा होती है (हालांकि मुझे यह जोड़ना चाहिए कि कुछ अन्य मशीनें, विशेष रूप से मूल क्रे 1, स्टैक के लिए हार्डवेयर समर्थन नहीं था)।


इस अवधि के नियंत्रण डेटा कंप्यूटर ने या तो पुनरावृत्ति का समर्थन नहीं किया (सबरूटीन कॉल एक निर्देश के साथ किया गया था, जिसने कॉलिंग निर्देश + 1 पर एक कूद सम्मिलित करने के लिए कोड को संशोधित किया था)। जब Wirth ने 6600 पर पास्कल विकसित किया, तो संभवतः उन्हें सबरूटीन्स को कॉल करने के लिए एक नया तरीका आना था।
डेविड थॉर्नले

@ डेविड: हाँ - और कोई संयोग नहीं, वे भी सेमुर क्रे द्वारा डिजाइन किए गए थे। मैं एक बार पास्कल 6000 कंपाइलर को देखने के लिए तैयार हो गया, लेकिन यह याद नहीं है कि इसने क्या बनाया है (अनुकरण?) स्टैक फ्रेम।
जेरी कॉफिन

notably the original cray 1तो, आप डायनासोर क्लोन करने के लिए पुनरावृत्ति की जरूरत नहीं है? मुझे लगता है कि यह वास्तव में हमारे ऊपर है कि हम बंदर पेड़ों से झूलें।
normanthesquid

2
यहां तक ​​कि CAML (और OCAML, F #) को स्पष्ट चिह्नित किए गए पुनरावर्ती कार्यों की आवश्यकता है।
जे.के.

1
@Panzercrisis: मुझे यकीन नहीं है कि आईबीएम x86 में शामिल था, लेकिन उनके वर्तमान मेनफ्रेम सीधे आईबीएम 360 पर वापस ट्रेस होते हैं, जो 1964 में बाजार में आया था, इसलिए मूल डिजाइन कुछ दशकों या तो x86 से पहले का है।
जेरी कॉफिन

16

विकिपीडिया कहता है:

फोरट्रान जैसी प्रारंभिक भाषाओं ने शुरू में पुनरावृत्ति का समर्थन नहीं किया क्योंकि चर को सांख्यिकीय रूप से आवंटित किया गया था, साथ ही वापसी पते के लिए स्थान भी।

http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy

फोरट्रान 77 पुनरावृत्ति की अनुमति नहीं देता है, फोरट्रान 90 करता है, (पुनरावर्ती दिनचर्या स्पष्ट रूप से घोषित की जानी चाहिए)।

अधिकांश फोरट्रान 77 संकलक पुनरावृत्ति की अनुमति देते हैं, कुछ (जैसे डीईसी) को एक संकलक विकल्प (संकलक विकल्प अध्याय देखें) का उपयोग करने की आवश्यकता होती है। जीएनयू जी 77, जो कि फोरट्रान 77 मानक के अनुरूप है, पुनरावृत्ति की अनुमति नहीं देता है।

http://www.ibiblio.org/pub/languages/fortran/ch1-12.html


iirc में कम से कम एक फोरट्रान 77 कंपाइलर था, जबकि यह तकनीकी रूप से पुनरावर्तन का समर्थन करता था, स्टैक फ्रेम की कुल संख्या जो आप हो सकती थी, इतनी छोटी पुनरावृत्ति कई समस्याओं के लिए प्रभावी रूप से प्रयोग करने योग्य नहीं थी
jk।

6

OpenCL प्रोग्रामिंग भाषा पुनरावृत्ति का समर्थन नहीं करती है। ( OpenCL कल्पना की धारा 6.8 देखें )

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

यह अच्छी तरह से अन्य GPU प्रोग्रामिंग भाषाओं, जैसे shader भाषाओं पर लागू हो सकता है।


2

छोटे माइक्रोकंट्रोलर के लिए कुछ ग संकलक पुनरावृत्ति का समर्थन नहीं करते हैं, संभवतः क्योंकि उनके पास एक अत्यंत सीमित स्टैक आकार है।


उन माइक्रोकंट्रोलर्स में से कुछ (जैसे PIC16 परिवार) में केवल एक हार्डवेयर कॉल स्टैक होता है (निर्देशों द्वारा सुलभ नहीं) और स्टैक का कोई अन्य रूप नहीं होता है, इसलिए पुनरावर्तन का उपयोग करते समय फ़ंक्शंस स्थानीय चर नहीं हो सकते हैं (डेटा स्टैक के रूप में स्पष्ट रूप से आवश्यक है उसके लिए ...) संदर्भ: en.wikipedia.org/wiki/PIC_microcontroller#Stacks
Ale

1

बुनियादी, लाइन-नंबरों के दिनों में, खराब पुनरावृत्ति समर्थन के लिए रुझान। उस समय के कई (सभी?) एनआईसीआईसी नेस्टेड गोस्ब कॉल का समर्थन किया, लेकिन एक तरह से मापदंडों या रिटर्न मानों को पारित करने के आसान तरीके का समर्थन नहीं किया, जिससे यह स्व-कॉल के लिए उपयोगी हो गया।

कई शुरुआती कंप्यूटरों में पुनरावृत्ति के साथ समस्याएं थीं, क्योंकि उन्होंने कॉल निर्देशों का उपयोग किया था जो कि रूटीन की शुरुआत में रिटर्न पता लिखा था (पीडीपी 8, मशीनों का आईएएस परिवार, शायद अधिक आर्किटेक्चर मैं इससे अपरिचित हूं), आमतौर पर इस तरह से यह मशीन के लिए कोड था "जो नियमित कहा जाता है के बाद निर्देश के लिए कूदो"।


1

यह इस बात पर निर्भर करता है कि आपको " समर्थन " से क्या मतलब है । पुनरावर्तन का समर्थन करने के लिए आपको एक स्टैक की आवश्यकता होती है जहां हर री-एंट्रेंस पर स्थानीय चर को फिर से इंस्टेंट करना होता है।

भले ही भाषा में स्थानीय चर की अवधारणा नहीं है, अगर इसमें "सबरूटीन" की अवधारणा है और एक समान चर (उर्फ सरणी) के बीच अनुक्रमण को प्रबंधित करने का एक तरीका है, तो आप हर प्रवेश / निकास के लिए एक वैश्विक सूचकांक बढ़ा / घटा सकते हैं। एक समारोह और इसके माध्यम से एक या अधिक सरणी का एक सदस्य का उपयोग।

मुझे नहीं पता कि क्या इसे "समर्थन" कहा जा सकता है। तथ्य यह है कि मैंने ZX-स्पेक्ट्रम बेसिक के साथ पुनरावर्ती कार्य लिखा है, जैसा कि मैंने फोर्ट फोरन में COBOL के रूप में किया था ... हमेशा उस चाल के साथ।


1

असेंबली भाषा सीधे पुनरावृत्ति का समर्थन नहीं करती है - आपको "इसे स्वयं करना है", आमतौर पर मशीन स्टैक पर मापदंडों को धक्का देकर।


2
जहाँ तक यह विधि कॉल का समर्थन करता है यह पुनरावृत्ति का समर्थन करता है। आमतौर पर एक CALLनिर्देश है, जो स्वचालित रूप से आईपी को सबरूटीन में कूदने से पहले स्टैक पर धकेलता है, और एक RETनिर्देश जो आईपी में रिटर्न एड्रेस को पॉप करता है। ऐसा कोई कारण नहीं है कि आप CALLअपना प्रवेश-बिंदु नहीं बना सकते ।
Blorgbeard

@Blorgbeard - बिल्कुल सच है, हालांकि मैं तर्क दूंगा कि यह आमतौर पर समझ में आने वाले अर्थों में "पुनरावृत्ति का समर्थन करता है" के रूप में गिनने के लिए अपर्याप्त है क्योंकि यह पुनरावर्ती कॉल के लिए आवश्यक मापदंडों को संभालता नहीं है।
मीका

1
ठीक है, पुनरावर्ती कॉल तकनीकी रूप से मापदंडों की आवश्यकता नहीं है, है ना? void f() { f(); }पुनरावर्ती है।
ब्लोर्बगार्ड

तकनीकी रूप से, नहीं। लेकिन एक तुच्छ मामले को कोड करने में सक्षम होने का मतलब यह नहीं है कि आपको असेंबली का वर्णन "सहायक पुनरावर्तन" के रूप में करना चाहिए। पुनरावर्तन के अधिकांश व्यावहारिक उपयोगों के लिए मापदंडों की आवश्यकता होती है।
मिकेरा

मुझे लगता है आप कह सकते हैं कि। लेकिन उस मामले में, असेंबली लूप का समर्थन नहीं करती है (आपको मैन्युअल रूप से सीएमपी और जेएनजेड को चुनना होगा)। मुझे लगता है कि यह एक बात है जिसे आप "समर्थन" कहते हैं।
Blorgbeard
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.