जब लोग कहते हैं कि "X कोई रचना नहीं करता है", तो उनका क्या मतलब होता है "रचना" का अर्थ वास्तव में "एक साथ रखा जाता है", और क्या और कैसे आप उन्हें एक साथ रखते हैं, यह बहुत अलग हो सकता है, जो वास्तव में "X" पर निर्भर करता है।
इसके अलावा, जब वे कहते हैं "रचना नहीं करता है", तो उनका मतलब कुछ अलग चीजें हो सकती हैं:
- आप एक साथ दो एक्स को एक साथ नहीं रख सकते हैं, अवधि।
- आप दो Xs एक साथ रख सकते हैं, लेकिन परिणाम एक X (IOW: X संरचना के तहत बंद नहीं है ) हो सकता है।
- आप दो एक्स को एक साथ रख सकते हैं, लेकिन परिणामस्वरूप एक्स उस तरह से काम नहीं कर सकता है जिस तरह से आप इसकी उम्मीद करते हैं।
# 1 के लिए एक उदाहरण स्कैनर / लेकर्स के साथ पार्सर्स है। आप वाक्यांश "स्कैनर / लेक्सर्स की रचना नहीं करते" सुन सकते हैं। यह वास्तव में सच नहीं है। उनका मतलब है "पार्सर जो एक अलग लेक्सिंग चरण का उपयोग करते हैं वे रचना नहीं करते हैं"।
आप पार्सर्स की रचना क्यों करना चाहेंगे? ठीक है, कल्पना कीजिए कि आप एक IDE विक्रेता हैं जैसे JetBrains, Eclipse Foundation, Microsoft, या Embarcadero, और आप एक वेब फ्रेमवर्क के लिए IDE बनाना चाहते हैं। विशिष्ट वेब विकास में, हम अक्सर भाषाओं का मिश्रण करते हैं। आपके पास <script>
ECMAScript वाले तत्वों के साथ HTML फाइलें हैं और<style>
सीएसएस युक्त तत्व। आपके पास HTML, कुछ प्रोग्रामिंग भाषा और कुछ टेम्पलेट भाषा मेटासिनटैक्स युक्त टेम्पलेट फाइलें हैं। आप "पायथन", "टेम्पलेट में एम्बेडेड पायथन", "सीएसएस", "HTML के भीतर सीएसएस", "ECMASCript", "HTML के भीतर ECMAScript", "HTML", "HTML" के लिए अलग-अलग वाक्यविन्यास हाइपर लिखना नहीं चाहते। एक टेम्पलेट ", और इतने पर और आगे। आप पायथन के लिए एक सिंटैक्स हाइलाइटर लिखना चाहते हैं, एक HTML के लिए, एक टेम्प्लेट लैंग्वेज के लिए, और फिर तीनों को एक टेम्पलेट फाइल के लिए सिंटैक्स हाइलाइटर में लिखें।
हालांकि, एक लेक्सर पूरी फाइल को टोकन की एक धारा में डाल देता है, जो केवल उस एक भाषा के लिए समझ में आता है। दूसरी भाषा के लिए पार्सर टोकन के साथ काम नहीं कर सकता है जो लेक्सर इसे पास करता है। उदाहरण के लिए, पायथन पार्सर आमतौर पर इस तरह से लिखे जाते हैं कि लेक्सर इंडेंटेशन पर नज़र रखता है और वेतन और इंजेक्शनों INDENT
का भुगतान करता हैDEDENT
टोकन को टोकन स्ट्रीम में करता है, इस प्रकार पार्सर को संदर्भ-मुक्त होने की अनुमति देता है, हालांकि पायथन का सिंटैक्स वास्तव में नहीं है। HTML लेक्सर हालांकि व्हाट्सएप को पूरी तरह से नजरअंदाज कर देगा, क्योंकि इसका HTML में कोई अर्थ नहीं है।
एक स्केनरलेस पार्सर, हालांकि, जो केवल पात्रों को पढ़ता है, एक अलग पार्सर के लिए चरित्र धारा को पारित कर सकता है, जो तब इसे वापस सौंप सकता है, इस प्रकार उन्हें रचना करना बहुत आसान हो जाता है।
# 2 के लिए एक उदाहरण उनमें एसक्यूएल प्रश्नों के साथ तार है। आपके पास दो तार हो सकते हैं, जिनमें से प्रत्येक में एक वाक्यात्मक रूप से सही एसक्यूएल क्वेरी है, लेकिन यदि आप दो तारों को मिलाते हैं, तो परिणाम एक वाक्यात्मक सही एसक्यूएल क्वेरी नहीं हो सकता है। इसलिए हमारे पास क्वेरी अल्जेब्रा जैसी है ARel
, जो रचना करते हैं।
ताले # 3 का एक उदाहरण हैं। यदि आपके पास ताले के साथ दो कार्यक्रम हैं, और आप उन्हें एक ही कार्यक्रम में जोड़ते हैं, तो भी आपके पास ताले के साथ एक कार्यक्रम है, लेकिन भले ही दो मूल कार्यक्रम पूरी तरह से सही हों, गतिरोध और दौड़ से मुक्त, परिणामी कार्यक्रम में यह जरूरी नहीं है संपत्ति। तालों का सही उपयोग पूरे कार्यक्रम की एक वैश्विक संपत्ति है, और एक ऐसी संपत्ति जो कार्यक्रमों की रचना करते समय संरक्षित नहीं होती है। यह अलग है, उदाहरण के लिए, लेनदेन, जो रचना करते हैं। एक प्रोग्राम जो लेनदेन का सही ढंग से उपयोग करता है, उसे इस तरह के एक अन्य कार्यक्रम के साथ तैयार किया जा सकता है और एक संयुक्त कार्यक्रम निकलेगा जो सही तरीके से लेनदेन का उपयोग करता है।