दिलचस्प पोस्ट
एनएसडीटा टू यूआईमेज एंड्रॉइड देखें.ग्रेडिंग कैश शून्य, केवल अशक्त का रिटर्न देता है UIView पर कस्टम राउंडिंग कोने नक्शे के लिए स्वयं के तुलनक बनाएं एक्शनबर्न मेनूइयेम डिवाइडर पायथन में एकल उद्धरण बनाम दोहरे उद्धरण कैसे प्रोग्रामिंग मेरे सी # आवेदन के बैंडविड्थ उपयोग को सीमित करने के लिए? पाइप को तोड़ने के बिना एक प्रक्रिया के साथ कई बार संवाद करें? मुक्केबाजी और अनबॉक्सिंग क्या है और व्यापार बंद क्या हैं? MySQL में टाइमस्टैम्प को डेटटाइम में कैसे परिवर्तित करें? ऑपरेटर == डेटा में तार्किक कॉलम में असंगत WPF में यूआई (मुख्य) थ्रेड सुरक्षित रूप से एक्सेस करना एंड्रॉइड: वर्तमान स्थान से गंतव्य तक रूट दिशानिर्देश Google नक्शे एपीआई V2 कैसे आकर्षित करें एक फ़ोन कॉल को प्रोग्रामेटिक रूप से बनाएं Async का उपयोग / कई कार्यों के लिए इंतजार

स्टैकलेस भाषा कैसे काम करती है?

मैंने स्टैकलेस भाषा के बारे में सुना है हालांकि मेरे पास कोई भी विचार नहीं है कि ऐसी भाषा कैसे लागू की जाएगी। क्या कोई समझा सकता है?

वेब के समाधान से एकत्रित समाधान "स्टैकलेस भाषा कैसे काम करती है?"

हमारे पास आधुनिक ऑपरेटिंग सिस्टम (विंडोज़, लिनक्स) मैं "बड़ा स्टैक मॉडल" कहां से काम करता हूं। और वह मॉडल गलत है, कभी-कभी, और "स्टैकलेस" भाषाओं की आवश्यकता को प्रेरित करता है

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

एक सामान्य समस्या यह है कि ऐसे सभी अनुप्रयोग हैं, "मेरा स्टैक कितना बड़ा होना चाहिए?" । याददाश्त में सस्ती मिट्टी होने के कारण, ज्यादातर क्या होता है कि स्टैक (एमएस चूक 1 एमबी) के लिए एक बड़ा हिस्सा अलग रखा जाता है, और सामान्य अनुप्रयोग कॉल संरचना इसे इस्तेमाल करने के लिए कहीं भी नहीं मिलती। लेकिन अगर कोई एप्लिकेशन इसका उपयोग करता है, तो यह उसकी ढेर के अंत तक पहुंचने के आधार पर, एक गैरकानूनी स्मृति संदर्भ ("मुझे माफ करना, दवे, मैं ऐसा नहीं कर सकता हूँ") के साथ मर जाता है।

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

स्टैक फ्रेम के लिए ढेर आवंटन का उपयोग करने के कई कारण हैं:

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

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

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

PARLANSE प्रोग्रामिंग लैंगेज मैं लागू किया 1) और 2)। मैं 3 पर काम कर रहा हूं)।

स्टैकलेस पायथन में अभी भी एक पायथन स्टैक है (हालांकि इसमें टेल कॉल ऑप्टिमाइज़ेशन और अन्य कॉल फ़्रेम विलय करने वाली युक्तियां हो सकती हैं), लेकिन यह दुभाषिए के सी स्टैक से पूरी तरह से तलाक हो गया है

हास्केल (जैसा कि सामान्यतः लागू किया गया है) में कॉल स्टैक नहीं है; मूल्यांकन ग्राफ़ कमी पर आधारित है।

http://www.linux-mag.com/cache/7373/1.html पर भाषा रूपरेखा तोते के बारे में एक अच्छा लेख है। तोता कॉल करने के लिए स्टैक का उपयोग नहीं करता है और यह आलेख तकनीक को थोड़ा समझाता है।

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

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

संपादित करें: मुझे पता है कि कुछ आर्किटेक्चर्स ने स्टैक्स समर्पित किए हैं, लेकिन वे आवश्यक नहीं हैं।

इस लेख पर निरंतरता का विवरण समझना आसान है: http://www.defmacro.org/ramblings/fp.html

निरंतरताएं ऐसी होती हैं जो आप किसी स्टैक-आधारित भाषा में किसी फ़ंक्शन में पास कर सकते हैं, लेकिन जो भी भाषा का स्वयं के शब्दों को "स्टैकलेस" बनाने के लिए इस्तेमाल किया जा सकता है बेशक, स्टैक अभी भी वहां है, लेकिन ईरा बैक्सटर के रूप में वर्णित है, यह एक बड़ा निकटतम खंड नहीं है

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

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

जाहिर है, वह पुनरावर्ती कॉल के साथ काम नहीं करता है (और मेरी याद यही है कि सीडीसी फोरट्रान चतुर्थ संकलक टूटा कोड उत्पन्न करेगा यदि आप पुनरावृत्ति का प्रयास करते हैं …)

कहते हैं कि आप स्टैकलेस सी को लागू करना चाहते हैं। एहसास करने वाली पहली बात यह है कि उसे स्टैक की आवश्यकता नहीं है:

a == b 

लेकिन, यह करता है?

 isequal(a, b) { return a == b; } 

नहीं, क्योंकि एक स्मार्ट कंपाइलर इनलाइन को कॉल करता है, जो उन्हें a == b में बदल देता है। तो, क्यों सब कुछ सिर्फ इनलाइन नहीं? ज़रूर, आप अधिक कोड जनरेट करेंगे, लेकिन अगर स्टैक से छुटकारा मिल रहा है तो आप के लायक है, तो यह एक छोटे से कारोबार के साथ आसान है।

पुनरावर्ती के बारे में क्या? कोई बात नहीं। जैसे एक पूंछ-पुनरावर्ती समारोह:

 bang(x) { return x == 1 ? 1 : x * bang(x-1); } 

अभी भी रेखांकित किया जा सकता है, क्योंकि वास्तव में यह केवल भेस में लूप के लिए है:

 bang(x) { for(int i = x; i >=1; i--) x *= x-1; return x; } 

सिद्धांत रूप में वास्तव में एक स्मार्ट कंपाइलर आपके लिए यह पता लगा सकता है। लेकिन एक कम स्मार्ट वाला अभी भी इसे गोटो के रूप में समतल कर सकता है:

 ax = x; NOTDONE: if(ax > 1) { x = x*(--ax); goto NOTDONE; } 

एक ऐसा मामला है जहां आपको एक छोटा व्यापार बंद करना है इसे इनलाइन नहीं किया जा सकता है:

 fib(n) { return n <= 2 ? n : fib(n-1) + fib(n-2); } 

स्टैकलेस सी बस ऐसा नहीं कर सकता क्या आप बहुत दे रहे हैं? ज़रुरी नहीं। यह कुछ सामान्य सी बहुत ही अच्छी तरह से नहीं कर सकते हैं अगर आप मुझे विश्वास नहीं करते हैं तो मुझे fib(1000) और देखें कि आपके बहुमूल्य कंप्यूटर का क्या होता है

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