রোজলিন সিনট্যাক্স নোডগুলি কি আবার ব্যবহার করা হয়েছে?


124

আমি রোজলিন সিটিপি- তে একবার নজর রেখেছি এবং এক্সপ্রেশন ট্রি এপিআই- তে এটি একইরকম সমস্যা সমাধান করার সময় উভয়ই অপরিবর্তনীয় তবে রোজলিন একে একে অন্যরকম উপায়ে করেন:

  • Expressionনোডগুলির প্যারেন্ট নোডের কোনও রেফারেন্স নেই, একটি ব্যবহার করে সংশোধন করা হয়েছে ExpressionVisitorএবং এজন্য বড় অংশগুলি পুনরায় ব্যবহার করা যেতে পারে।

  • SyntaxNodeঅন্যদিকে, রোজলিন্স এর পিতামাতার একটি উল্লেখ রয়েছে, সুতরাং সমস্ত নোড কার্যকরভাবে একটি ব্লকে পরিণত হয় যা পুনরায় ব্যবহার করা অসম্ভব। পদ্ধতি পছন্দ করি Update, ReplaceNodeইত্যাদি পরিবর্তন করতে প্রদান করা হয়।

কোথায় এই শেষ? Document? Project? ISolution? এপিআই গাছের ধাপে ধাপে পরিবর্তনের (বাটন আপের পরিবর্তে) পদোন্নতি দেয়, তবে কি প্রতিটি পদক্ষেপ একটি সম্পূর্ণ অনুলিপি তৈরি করে?

তারা কেন এমন পছন্দ করলেন? আমি অনুপস্থিত কিছু আকর্ষণীয় কৌশল আছে?

উত্তর:


181

আপডেট: 8 ই জুন, 2012 এ এই প্রশ্নটি আমার ব্লগের বিষয় ছিল । মহান প্রশ্নের জন্য ধন্যবাদ!


দুর্দান্ত প্রশ্ন। আপনি উত্থাপিত বিষয়গুলি দীর্ঘ, দীর্ঘ সময়ের জন্য বিতর্ক করেছি।

আমরা একটি ডেটা কাঠামো থাকতে চাই যাতে নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে:

  • অপরিবর্তনীয়।
  • গাছের রূপ।
  • চাইল্ড নোডগুলি থেকে পিতামাতার নোডগুলিতে সস্তা অ্যাক্সেস।
  • গাছের নোড থেকে পাঠ্যের অফসেটে থাকা অক্ষরটিতে ম্যাপ করা সম্ভব।
  • অবিচল

অধ্যবসায়ের দ্বারা আমি বোঝাতে চাইছি যখন পাঠ্য বাফারে কোনও সম্পাদনা করা হয় তখন গাছের বেশিরভাগ নোডের পুনরায় ব্যবহার করার ক্ষমতা । নোডগুলি যেহেতু অপরিবর্তনীয়, সেগুলি পুনরায় ব্যবহার করতে কোনও বাধা নেই। পারফরম্যান্সের জন্য আমাদের এটি দরকার; আপনি যখনই কোনও কী চাপলেন তখনই আমরা ফাইলটির বিশাল ওয়াজগুলিকে পুনরায় পার্সিং করতে পারি না। আমাদের সম্পাদনা দ্বারা প্রভাবিত গাছের কেবলমাত্র অংশগুলি পুনরায় লেক্স করতে এবং পুনরায় পার্স করা দরকার।

এখন যখন আপনি এই পাঁচটি জিনিসকে একটি ডেটা স্ট্রাকচারে রাখার চেষ্টা করেন আপনি তত্ক্ষণাত্ সমস্যার মধ্যে পড়ে যান:

  • আপনি কিভাবে প্রথম স্থানে একটি নোড তৈরি করবেন? পিতা-মাতা এবং শিশু উভয়ই একে অপরকে উল্লেখ করে এবং অপরিবর্তনীয়, তাই কোনটি প্রথমে নির্মিত হয়?
  • ধরুন আপনি এই সমস্যাটি সমাধান করতে পরিচালনা করেছেন: আপনি কীভাবে এটি অবিরাম বানাবেন? আপনি পৃথক পিতামাতায় চাইল্ড নোডটি পুনরায় ব্যবহার করতে পারবেন না কারণ এটির মধ্যে এটির একটি নতুন পিতা বা মাতা রয়েছে তা শিশুকে জানানো জড়িত। তবে শিশুটি অপরিবর্তনীয়।
  • ধরুন আপনি এই সমস্যাটি সমাধান করতে পরিচালনা করেছেন: আপনি যখন সম্পাদনা বাফারে একটি নতুন অক্ষর সন্নিবেশ করান, তখন প্রতিটি নোডের পরম অবস্থান যা সেই বিন্দুটির পরে কোনও অবস্থানে ম্যাপ করা হয় পরিবর্তিত । এটি একটি ধ্রুবক ডেটা কাঠামো তৈরি করা খুব কঠিন করে তোলে কারণ কোনও সম্পাদনা বেশিরভাগ নোডের স্প্যান পরিবর্তন করতে পারে!

তবে রোজলিন দলে আমরা নিয়মিত অসম্ভব কাজ করি। আমরা দুটি পার্স গাছ রেখে আসলেই অসম্ভবকে ঘৃণা করি। "সবুজ" গাছটি অপরিবর্তনীয়, অবিচলিত, কোনও পিতামাতুল্য উল্লেখ নেই, নির্মিত হয়েছে "নীচে-আপ", এবং প্রতিটি নোড এর প্রস্থকে অনুসরণ করে তবে এটির নয় সম্পূর্ণ অবস্থান নয় । যখন কোনও সম্পাদনা ঘটে তখন আমরা কেবল সবুজ গাছের কিছু অংশ পুনর্নির্মাণ করি যা সম্পাদনা দ্বারা প্রভাবিত হয়েছিল, যা সাধারণত গাছের মোট পার্স নোডের ও (লগ এন) সম্পর্কে।

"লাল" গাছটি একটি অপরিবর্তনীয় মুখোমুখি যা সবুজ গাছের চারপাশে নির্মিত; এটি চাহিদার ভিত্তিতে "টপ-ডাউন" নির্মিত এবং প্রতিটি সম্পাদনা থেকে দূরে নিক্ষেপ করা হয়। আপনি উপরে থেকে গাছের উপর দিয়ে নামার সাথে সাথে এটি পিতামাতার রেফারেন্সগুলিকে চাহিদার ভিত্তিতে উত্পাদন করে গণনা করে । আপনি নীচে নেমে এগুলি আবার প্রস্থগুলি থেকে তাদের গণনা করে নিখুঁত অবস্থানগুলি তৈরি করে।

আপনি, ব্যবহারকারী, কখনও কখনও লাল গাছ দেখতে পাবেন; সবুজ গাছ একটি বাস্তবায়ন বিশদ। আপনি যদি কোনও পার্স নোডের অভ্যন্তরীণ অবস্থার দিকে নজর রাখেন তবে আপনি বাস্তবে দেখতে পাবেন যে সেখানে কোনও অন্য ধরণের পার্স নোডের রেফারেন্স রয়েছে; এটাই সবুজ গাছের নোড।

ঘটনাক্রমে, এগুলিকে "লাল / সবুজ গাছ" বলা হয় কারণ সেগুলি হ'ল হোয়াইটবোর্ড চিহ্নিতকারী রঙ যা আমরা ডিজাইনের মিটিংয়ে ডেটা কাঠামো আঁকতে ব্যবহার করি। রঙগুলির অন্য কোনও অর্থ নেই।

এই কৌশলটির সুবিধা হ'ল আমরা সেই দুর্দান্ত জিনিসগুলি পেয়েছি: অপরিবর্তনীয়তা, অধ্যবসায়, পিতামাতার উল্লেখ এবং আরও অনেক কিছু। ব্যয়টি হ'ল এই সিস্টেমটি জটিল এবং "লাল" সম্মুখিনগুলি বড় হয়ে গেলে প্রচুর স্মৃতি গ্রহণ করতে পারে। সুবিধাগুলি না হারিয়ে আমরা কিছু ব্যয় হ্রাস করতে পারি কিনা তা দেখার জন্য আমরা বর্তমানে পরীক্ষা-নিরীক্ষা করছি।


3
এবং আইফ্রোজেক্টস এবং আইডোকুমেন্টস সম্পর্কে আপনার প্রশ্নের অংশটি সম্বোধন করার জন্য: আমরা পরিষেবা স্তরে অনুরূপ মডেল ব্যবহার করি। অভ্যন্তরীণভাবে "ডকুমেন্টস্টেট" এবং "প্রজেক্টস্টেট" প্রকারগুলি নীতিগতভাবে সিনট্যাক্স গাছের সবুজ নোডের সমতুল্য। আপনি যে আইপ্রোজেক্ট / আইডোকোমেন্ট অবজেক্টগুলি পান সেগুলি হ'ল এগুলির জন্য লাল নোড ফ্যাকাস। যদি আপনি রোজলিন.স সার্ভিসেস.প্রজেক্টের একটি ডিসকোপিলারের মধ্যে রূপান্তর করেন তবে আপনি দেখতে পাবেন যে প্রায় সমস্ত কলই অভ্যন্তরীণ অবস্থার অবজেক্টের দিকে এগিয়ে চলেছে।
জেসন ম্যালিনোভস্কি

@ এরিক মন্তব্যটির জন্য দুঃখিত, তবে আপনি নিজের সাথে বিরোধিতা করছেন। The expense and difficulty of building a complex persistent data structure doesn't pay for itself.রেফ: স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা / 4429২৯২৩ /… যদি আপনার উচ্চ পারফরম্যান্সের লক্ষ্য থাকে তবে কেন আপনি এটিকে প্রথম স্থানে অপরিবর্তনীয় করে তুলেছিলেন? সুস্পষ্ট বিষয়গুলি বাদ দিয়ে কি অন্য কোনও কারণ রয়েছে? যেমন থ্রেডসেফ তৈরি করা সহজ, ইত্যাদি সম্পর্কে যুক্তিযুক্ত
লুকাশজ ম্যাডন

2
@ লুকাস আপনি সেই উদ্ধৃতিটিকে প্রসঙ্গের বাইরে নিয়ে যাচ্ছেন। পূর্ববর্তী বাক্যটি ছিল "কারণ আপনি যখন নেট নেটওয়ার্কগুলিতে সাধারণত স্ট্রিংয়ের কাজগুলি দেখেন তখন প্রতিটি প্রাসঙ্গিকভাবে একেবারে সম্পূর্ণ নতুন স্ট্রিং তৈরি করা মোটেই খারাপ হয়।" OTOH, আপনি যখন অভিব্যক্তি গাছের উপর সাধারণত সঞ্চালিত ক্রিয়াকলাপগুলি দেখুন - যেমন উত্স ফাইলে কয়েকটি অক্ষর টাইপ করেন - সম্পূর্ণ নতুন এক্সপ্রেশন ট্রি তৈরি করা তাত্পর্যপূর্ণভাবে খারাপ। সুতরাং তারা কেবল এটির অর্ধেকটি তৈরি করে।
টিম্বো

1
@ লুকাস আমার অনুমান: রোজলিন ব্যাকগ্রাউন্ড থ্রেডে পরিচালিত হওয়ার কথা বলে, অপরিবর্তনীয়তা একাধিক থ্রেডকে একই সময়ে একই উত্স কোডটি বিশ্লেষণ করার অনুমতি দেয় যে ব্যবহারকারী কোনও কী চাপলে এটি পরিবর্তিত হবে worry ব্যবহারকারীর ইনপুট এর প্রতিক্রিয়া হিসাবে, চলমান বিশ্লেষণের কাজগুলি বন্ধ না করেই অপরিবর্তনীয় গাছগুলি আপডেট করা যেতে পারে। সুতরাং আমি কল্পনা করতে পারি যে অপরিবর্তনীয়তার মূল লক্ষ্যটি রোজলিনকে আরও সহজে লেখার (এবং ক্লায়েন্টদের ব্যবহারের পক্ষে সহজতর) করা।
কিওয়ারটি

3
@ লিউকাস ধ্রুবক ডেটা স্ট্রাকচারগুলি অনুলিপি করার চেয়ে বেশি কার্যকর, যখন ডেটা স্ট্রাকচারটি সাধারণত পরিবর্তনের চেয়ে অনেক বড় হয়। আপনার বক্তব্য, যদি আপনার একটি থাকে তবে আমার কাছে হারিয়ে গেছে।
কিওয়ারটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.