2009-07-23 20 views
27

में मैंने कहीं पढ़ा है जहां अमीर हिक्की ने कहा:निरंतरता Clojure

"मुझे लगता है निरंतरता व्यवहार में सिद्धांत रूप में , लेकिन नहीं साफ हो सकता है"

मैं clojure से परिचित नहीं हूँ।
1. क्या क्लोजर में निरंतरता है?
2. यदि नहीं, तो आपको निरंतरता की आवश्यकता नहीं है? मैंने विशेष रूप से this guy से बहुत अच्छे उदाहरण देखे हैं। विकल्प क्या है?
3. यदि हां, तो क्या कोई दस्तावेज है?

+1

आपका प्रश्न शीर्षक प्रश्न टेक्स्ट के साथ बहुत कुछ नहीं लगता है। –

+0

क्या यह बेहतर है? कॉल स्टैक – unj2

उत्तर

26

जब निरंतरता के बारे में बात, आप उनमें से दो अलग अलग प्रकार के बीच भेद करना होगा:

  • प्रथम श्रेणी निरंतरता - कि गहराई से एकीकृत है निरंतरता-समर्थन भाषा में (योजना या रूबी)। क्लोजर प्रथम श्रेणी की निरंतरता का समर्थन नहीं करता है।

  • निरंतरता-गुजरने वाली शैली (सीपीएस) - सीपीएस कोडिंग की एक शैली है और अज्ञात कार्यों का समर्थन करने वाली कोई भी भाषा इस शैली को अनुमति देगी (जो क्लोजर पर भी लागू होती है)।

उदाहरण:

-- Standard function 
double :: Int -> Int 
double x = 2 * x 

-- CPS-function – We pass the continuation explicitly 
doubleCPS :: Int -> (Int -> res) -> res 
doubleCPS x cont = cont (2 * x) 
; Call 
print (double 2) 

; Call CPS: Continue execution with specified anonymous function 
double 2 (\res -> print res) 

विकिपीडिया पर पढ़ें continuation

मुझे नहीं लगता कि एक अच्छी भाषा के लिए निरंतरता आवश्यक है, लेकिन विशेष रूप से प्रथम श्रेणी की निरंतरताएं और एचएससीएल जैसी कार्यात्मक भाषाओं में सीपीएस काफी उपयोगी हो सकती है (intelligent backtracking example)।

+9

के लिए – harms

13

क्या एक भाषा में निरंतरता आवश्यक है?

नहीं। भाषाओं की बहुत सारी निरंतरता नहीं है।

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

एक कॉल स्टैक

+7

+1 आपके दो बिंदुओं के दूसरे भाग के संबंध में, सामान्य मामले में सीपीएस उपयोग करने योग्य बनाने के लिए पूंछ-कॉल अनुकूलन की आवश्यकता नहीं होगी? एक मानक फ़ंक्शन पर विचार करें, जिसे आप "जबकि (! निरस्त)" ब्लॉक में लपेटते हैं, इसे निरस्त करने तक इसे दोहराने के लिए। एक सीपीएस-शैली समारोह के बराबर उपयोग नहीं होगा इसे खुद को निरंतरता के रूप में भेजना होगा? इस प्रकार आप असंबद्ध रिकर्सन प्राप्त करते हैं और पूंछ-कॉल अनुकूलन की आवश्यकता होगी। मैं बस यहाँ जोर से सोच रहा हूं, इसलिए कृपया मुझे बताएं कि क्या यह समझ में आता है :-) – Dario

21

मैंने क्ल-कॉन्ट का क्लोजर पोर्ट लिखा है जो सामान्य लिस्प को निरंतरता जोड़ता है। के रूप में से निपटने के एक समारोह से लौट रहे, एक पाश से तोड़ने, अपवाद आदि अधिकांश भाषाओं (जावा की तरह, सी ++ आदि) प्रदान करते हैं इन सुविधाओं:

https://github.com/swannodette/delimc

7

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

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

बीटीडब्लू, यह जानना दिलचस्प होगा कि कैसे रिच हिकी ने निरंतरताओं के बारे में अपनी राय को सही ठहराया। उसके लिए कोई लिंक?

+1

किसी भाषा के लिए "पूर्ण" होने के लिए आपको क्या सुविधाएं चाहिए? – unj2

+2

यह "पूर्ण" नहीं होना चाहिए "पूर्ण"। जब मैंने कहा "पूरा" मेरा मतलब ट्यूरिंग पूरा नहीं था। मेरा मतलब उन सुविधाओं से है जो लोग आमतौर पर "आधुनिक" भाषाओं से अपेक्षा करते हैं। उदाहरण के लिए, कोशिश-पकड़ का उपयोग कर अपवाद हैंडलिंग। योजना प्रदान नहीं करती है, लेकिन प्रथम श्रेणी की निरंतरताओं का उपयोग करके आप अपने अपवाद हैंडलिंग तंत्र को कार्यान्वित कर सकते हैं। –

+8

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

0

खैर ... Clojure के -> लागू करता है कि आप क्या कर रहे हैं के बाद ... लेकिन एक मैक्रो के साथ बजाय

+0

मुझे लगता है कि यह एक वैध जवाब है। एक कदम का परिणाम अगले चरण के इनपुट में पारित किया जाता है। प्रभाव एक निरंतरता-प्रकार तंत्र है, जिसे कोड रीराइट – zcaudate

+0

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

+0

यह सच है, आपने निष्पादन पर नियंत्रण के बारे में क्या कहा था। वैसे भी ... यह आपको रूचि दे सकता है http://docs.caudate.me/hara/hara-concurrent-procedure.html – zcaudate

5

सार निरंतरता

निरंतरता एक अमूर्त धारणा है कि नियंत्रण प्रवाह अर्थ विज्ञान का वर्णन किया जाता है। इस अर्थ में, वे दोनों मौजूद हैं और मौजूद नहीं हैं (याद रखें, वे अमूर्त हैं) किसी भी भाषा में जो नियंत्रण ऑपरेटरों (जैसा कि किसी भी ट्यूरिंग पूर्ण भाषा को जरूरी है) प्रदान करता है, वैसे ही दोनों संख्याएं मौजूद हैं (सार तत्वों के रूप में) और अस्तित्व में नहीं है (मूर्त संस्थाओं के रूप में)।

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

प्रथम श्रेणी निरंतरता

तो एक निरंतरता की धारणा reified एक भाषा में एक प्रथम श्रेणी वस्तु के रूप में है, तो हम एक उपकरण है जिस पर नियंत्रण प्रभाव के सभी प्रकार किया जा सकता है बनाया। उदाहरण के लिए, यदि किसी भाषा में प्रथम श्रेणी की निरंतरता है, लेकिन अपवाद नहीं है, तो हम निरंतरता के शीर्ष पर अपवाद बना सकते हैं।

पहली कक्षा निरंतरता के साथ कोई समस्या

जबकि प्रथम श्रेणी निरंतरता कई मामलों में एक शक्तिशाली और उपयोगी उपकरण हैं, वहाँ भी उन्हें एक भाषा में उजागर करने के लिए कुछ कमियां हैं:

  • अलग बनाया कपोल-कल्पना निरंतरता के शीर्ष पर बनाये जाने पर अप्रत्याशित/अनजान व्यवहार हो सकता है। उदाहरण के लिए, यदि मैं गणना को निरस्त करने के लिए निरंतरता का उपयोग करता हूं तो finally ब्लॉक छोड़ा जा सकता है।
  • यदि किसी भी समय वर्तमान निरंतरता का अनुरोध किया जा सकता है, तो भाषा रन-टाइम को संरचित किया जाना चाहिए ताकि किसी भी समय वर्तमान निरंतरता के कुछ डेटा-संरचना का प्रतिनिधित्व करना संभव हो। यह एक सुविधा के लिए रन-टाइम पर कुछ बोझ रखता है, जो बेहतर या बदतर के लिए अक्सर "विदेशी" माना जाता है। यदि भाषा होस्ट की जाती है (जैसे क्लोजर JVM पर होस्ट किया गया है), तो वह प्रतिनिधित्व होस्टिंग प्लेटफॉर्म द्वारा प्रदान किए गए ढांचे के भीतर फिट होना चाहिए। ऐसी अन्य विशेषताएं भी हो सकती हैं जो एक भाषा को बनाए रखना चाहें (उदा।, सी इंटरऑप) जो समाधान स्थान को प्रतिबंधित करती है। इस तरह के मुद्दे "प्रतिबाधा विसंगति" की संभावना को बढ़ाते हैं, और एक प्रदर्शन समाधान के विकास को गंभीर रूप से जटिल कर सकते हैं।

एक भाषा

metaprogramming के माध्यम से करने के लिए पहली कक्षा निरंतरता जोड़ा जा रहा है, यह एक भाषा के लिए प्रथम श्रेणी के निरंतरता के लिए समर्थन जोड़ने के लिए संभव है। आम तौर पर, इस दृष्टिकोण में कोड को निरंतर-गुजरने वाली शैली (सीपीएस) में परिवर्तित करना शामिल है, जिसमें वर्तमान निरंतरता प्रत्येक कार्य के लिए एक स्पष्ट तर्क के रूप में पारित होती है।

उदाहरण के लिए, डेविड नोलन की delimc लाइब्रेरी मैक्रो ट्रांसफॉर्म की एक श्रृंखला के माध्यम से क्लोजर प्रोग्राम के हिस्सों की सीमित निरंतरता लागू करती है। इसी तरह से, मैंने pulley.cps लिखा है, जो एक मैक्रो कंपाइलर है जो कोड को सीपीएस में बदलता है, साथ ही कोर क्लोजर फीचर्स (जैसे अपवाद हैंडलिंग) के साथ-साथ देशी क्लोजर कोड के साथ इंटरऑप का समर्थन करने के लिए रन-टाइम लाइब्रेरी के साथ।

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

pulley.cps उत्तरार्द्ध की ओर जाता है, हालांकि उपयोगकर्ता को इसे प्रबंधित करने की अनुमति देने के लिए कुछ प्रयास किए गए हैं। उदाहरण के लिए, मूल कोड में कॉल करने के लिए सीपीएस कोड को अस्वीकार करना संभव है। इसके अलावा, मौजूदा मूल कार्यों के सीपीएस संस्करणों की आपूर्ति के लिए एक तंत्र प्रदान किया जाता है।

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

सारांश

अब हम जानकारी सीधे अपने तीन सवालों के जवाब देने के लिए आवश्यक है:

  1. Clojure प्रथम श्रेणी के व्यावहारिक दृष्टिकोण के कारण निरंतरता का समर्थन नहीं करता।
  2. सभी भाषाओं को सैद्धांतिक अर्थ में निरंतरता पर बनाया गया है, लेकिन कुछ भाषाएं प्रथम श्रेणी की वस्तुओं के रूप में निरंतरता का पर्दाफाश करती हैं। हालांकि, सीपीएस में परिवर्तन, उदाहरण के माध्यम से, किसी भी भाषा में निरंतरता जोड़ना संभव है।
  3. delimc और/या pulley.cps के लिए प्रलेखन देखें।
+0

इसमें लगभग सात साल लग गए, लेकिन आखिर में इस प्रश्न का सही और गहन जवाब है। अति उत्कृष्ट! यह स्वीकार्य उत्तर बनना चाहिए। –

+0

@BenKovitz धन्यवाद। मैंने इस बात पर बहस की कि क्या प्रश्न की उम्र दी गई है। आपकी टिप्पणी से मुझे खुशी है कि मैंने किया। –