क्या रोसलिन सिंटेक्सनॉड्स का पुन: उपयोग किया जाता है?


124

मैं रोसलिन CTP पर एक नज़र डाल रहा हूं और, जबकि यह अभिव्यक्ति वृक्ष एपीआई के लिए एक समान समस्या हल करता है , दोनों अपरिवर्तनीय हैं, लेकिन रोसलिन एक अलग तरीके से ऐसा करता है:

  • Expressionनोड्स का मूल नोड के लिए कोई संदर्भ नहीं है, का उपयोग करके संशोधित किया जाता है ExpressionVisitorऔर इसीलिए बड़े भागों का पुन: उपयोग किया जा सकता है।

  • SyntaxNodeदूसरी तरफ रोजलिन का अपने माता-पिता के लिए एक संदर्भ है, इसलिए सभी नोड्स प्रभावी रूप से एक ब्लॉक बन जाते हैं जो फिर से उपयोग करना असंभव है। तरीके पसंद Update, ReplaceNode, आदि, संशोधन करने के लिए प्रदान की जाती हैं।

यह कहाँ समाप्त होता है? Document? Project? ISolution? एपीआई पेड़ के एक कदम-दर-चरण परिवर्तन (एक बटन अप के बजाय) को बढ़ावा देता है, लेकिन क्या प्रत्येक चरण एक पूर्ण प्रतिलिपि बनाता है?

उन्होंने ऐसा चुनाव क्यों किया? क्या कोई दिलचस्प ट्रिक मुझे याद आ रही है?

जवाबों:


181

अद्यतन: यह प्रश्न 8 जून 2012 को मेरे ब्लॉग का विषय था । महान प्रश्न के लिए धन्यवाद!


बड़ा सवाल है। हमने उन मुद्दों पर बहस की, जो आप लंबे समय से उठाते हैं।

हम चाहते हैं कि एक डेटा संरचना हो जिसमें निम्नलिखित विशेषताएं हों:

  • अपरिवर्तनीय।
  • एक वृक्ष का रूप।
  • चाइल्ड नोड्स से पैरेंट नोड्स तक सस्ती पहुंच।
  • पाठ में एक पेड़ से एक नोड में एक चरित्र ऑफसेट करने के लिए मैप करना संभव है।
  • लगातार

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

अब जब आप उन पाँचों चीज़ों को एक डेटा संरचना में रखने का प्रयास करते हैं जिन्हें आप तुरंत समस्याओं में चलाते हैं:

  • आप पहली जगह में एक नोड का निर्माण कैसे करते हैं? माता-पिता और बच्चा दोनों एक-दूसरे का उल्लेख करते हैं, और अपरिवर्तनीय हैं, इसलिए कौन सा पहले निर्मित होता है?
  • मान लीजिए कि आप उस समस्या को हल करने का प्रबंधन करते हैं: आप इसे कैसे बनाए रखते हैं? आप एक अलग अभिभावक में एक बच्चे के नोड का फिर से उपयोग नहीं कर सकते क्योंकि इसमें बच्चे को यह बताना शामिल होगा कि उसका नया माता-पिता है। लेकिन बच्चा अपरिवर्तनीय है।
  • मान लें कि आप उस समस्या को हल करने का प्रबंधन करते हैं: जब आप संपादन बफ़र में एक नया वर्ण सम्मिलित करते हैं, तो उस बिंदु के बाद स्थिति में मैप किए गए प्रत्येक नोड की पूर्ण स्थिति । यह लगातार डेटा संरचना बनाने के लिए बहुत मुश्किल बनाता है, क्योंकि कोई भी संपादन अधिकांश नोड्स के स्पैन को बदल सकता है!

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

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

आप, उपयोगकर्ता, केवल कभी लाल पेड़ देखते हैं; हरे पेड़ एक कार्यान्वयन विवरण है। यदि आप एक पार्स नोड के आंतरिक स्थिति में सहकर्मी हैं, तो आप वास्तव में देखेंगे कि एक अलग प्रकार के एक अन्य पार्स नोड का संदर्भ है ; वह हरे वृक्ष का वृक्ष है।

संयोग से, इन्हें "लाल / हरे पेड़" कहा जाता है क्योंकि वे व्हाइटबोर्ड मार्कर रंग थे जिनका उपयोग हम डिज़ाइन मीटिंग में डेटा संरचना को आकर्षित करने के लिए करते थे। रंगों का कोई अन्य अर्थ नहीं है।

इस रणनीति का लाभ यह है कि हम उन सभी महान चीजों को प्राप्त करते हैं: अपरिवर्तनीयता, दृढ़ता, माता-पिता के संदर्भ, और इसी तरह। लागत यह है कि यह प्रणाली जटिल है और बहुत सारी मेमोरी का उपभोग कर सकती है यदि "लाल" facades बड़े हो जाते हैं। हम वर्तमान में प्रयोग कर रहे हैं यह देखने के लिए कि क्या हम लाभ को खोए बिना कुछ लागत को कम कर सकते हैं।


3
और IProjects और IDocuments के बारे में आपके प्रश्न के भाग को संबोधित करने के लिए: हम सेवाओं की परत में एक समान मॉडल का उपयोग करते हैं। आंतरिक रूप से "DocumentState" और "ProjectState" प्रकार हैं जो नैतिक रूप से वाक्यविन्यास के पेड़ के हरे नोड्स के बराबर हैं। आपके द्वारा प्राप्त किए जाने वाले IProject / IDocument ऑब्जेक्ट इन के लिए लाल नोड facades हैं। यदि आप Roslyn.Services.Project के डिकम्प्रेसर में कार्यान्वयन को देखते हैं, तो आप देखेंगे कि लगभग सभी कॉल आंतरिक राज्य ऑब्जेक्ट्स के लिए आगे हैं।
जेसन मालिनोवस्की

@ टिप्पणी के लिए खेद है, लेकिन आप अपने आप का विरोध कर रहे हैं। The expense and difficulty of building a complex persistent data structure doesn't pay for itself.Ref: stackoverflow.com/questions/6742923/… यदि आपके पास उच्च प्रदर्शन लक्ष्य थे, तो आपने इसे पहले स्थान पर अपरिवर्तनीय क्यों बनाया? क्या स्पष्ट के अलावा कोई और कारण है? उदाहरण के लिए थ्रेडसेफ़ बनाना आसान है, आदि के बारे में
लुकाज़ मैडन

2
@ लुकास आप उस बोली को संदर्भ से बाहर ले जा रहे हैं। पिछला वाक्य था "क्योंकि जब आप ऑपरेशनों को देखते हैं जो आम तौर पर .NET प्रोग्राम्स में स्ट्रिंग्स पर किए जाते हैं, तो यह हर प्रासंगिक तरीके से होता है, जो कि पूरी तरह से नया स्ट्रिंग बनाने के लिए बिल्कुल भी बदतर नहीं है।" OTOH, जब आप उन ऑपरेशनों को देखते हैं जो आम तौर पर एक अभिव्यक्ति ट्री पर किए जाते हैं - जैसे कि स्रोत फ़ाइल में कुछ अक्षर टाइप करना - यह पूरी तरह से नया अभिव्यक्ति ट्री बनाने के लिए काफी बदतर है। इसलिए वे इसका आधा हिस्सा ही बनाते हैं।
टिम्बो

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

3
@lukas लगातार डेटा संरचनाएं कॉपी करने से अधिक कुशल होती हैं, जब डेटा संरचना आम तौर पर इसके परिवर्तनों से बहुत बड़ी होती है। आपकी बात, यदि आपके पास एक है, मुझ पर खो गया है।
क्वर्टी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.