संक्षेप में
प्रोग्रामिंग भाषाएं एक वाक्य रचना से बनी होती हैं जो कार्यक्रम को वर्णों के तार के रूप में दर्शाती हैं, और एक शब्दार्थ जो कार्यक्रम का इच्छित अर्थ है।
औपचारिक भाषाएं अर्थ के बिना वाक्यविन्यास हैं। इसका अर्थ औपचारिक रूप से परिभाषित तारों के सेट की संरचना का अध्ययन करना है, आमतौर पर उन तारों के अर्थ को संलग्न करना।
नियमित अभिव्यक्ति और अन्य औपचारिकताओं (जैसे संदर्भ-मुक्त व्याकरण) का उपयोग औपचारिक भाषाओं को परिभाषित करने के लिए किया जाता है, जिनका उपयोग प्रोग्रामिंग और प्राकृतिक भाषाओं के वाक्य-विन्यास घटक के रूप में किया जाता है, अर्थात संरचित तरीके से वाक्यों का प्रतिनिधित्व करने के लिए। अन्य तंत्रों का उपयोग उस संरचना को प्रोग्रामिंग भाषाओं के शब्दार्थों से संबंधित करने के लिए किया जाता है।
यहां बहुत कुछ सरल है, विशेष रूप से प्राकृतिक भाषा के बारे में।
बहुत अधिक विवरण के साथ
आपके प्रश्न का उत्तर देने के लिए हमें शुरुआत से शुरू करना चाहिए। सामान्य अर्थों में एक भाषा, अनौपचारिक रूप से, सूचना या विचारों को व्यक्त करने का एक साधन है। किसी भाषा में, आमतौर पर वाक्य रचना और शब्दार्थ के बीच अंतर होता है। शब्दार्थ वह है जिसके बारे में आप बात करना / लिखना चाहते हैं। वह जानकारी जो आप बताना चाहते हैं। सिंटेक्स वह साधन है जिसका उपयोग आप इसे व्यक्त करने के लिए करते हैं, अर्थात एक पारंपरिक प्रतिनिधित्व जो लोगों के बीच और अब लोगों और उपकरणों के बीच या उपकरणों (कंप्यूटर) के बीच भी आदान-प्रदान किया जा सकता है।
आमतौर पर, आप dog
कुत्ते के विचार को व्यक्त करने के लिए इस शब्द का उपयोग करेंगे । यह शब्द dog
तीन अक्षरों या कुछ समतुल्य ध्वनि से बना है, और यह किसी प्रकार के जानवर का प्रतिनिधित्व करने के लिए बनाया गया है। प्रमुख विचार यह है कि संचार का प्रतिनिधित्व किस माध्यम से किया जाना है, इसका प्रतिनिधित्व किया जाता है। प्रतिनिधित्व संरचनाओं को आमतौर पर वाक्य रचना कहा जाता है, जबकि जो प्रतिनिधित्व किया जाता है उसे शब्दार्थ कहा जाता है। यह प्राकृतिक भाषा के साथ-साथ प्रोग्रामिंग भाषाओं के लिए भी कमोबेश चला जाता है।
शब्द कम या ज्यादा प्राथमिक अर्थ अवधारणाओं का प्रतिनिधित्व करने के लिए वाक्यात्मक संस्थाएं हैं। लेकिन इन जटिल अवधारणाओं को अधिक जटिल अर्थ देने के लिए विभिन्न तरीकों से एक साथ रखा जाना चाहिए। हम the dog
यह बताने के लिए लिखते
हैं कि हमारा मतलब एक विशिष्ट कुत्ते से है, और the dog bites the cat
अधिक जटिल विचार व्यक्त करने के लिए। लेकिन जिस तरह से शब्दों का आयोजन किया जाता है उसे नियमों द्वारा तय किया जाना चाहिए, ताकि हम बता सकें कि कुत्ते और बिल्ली में से कौन वास्तव में दूसरे को काट रहा है।
इसलिए हमारे पास ऐसे नियम sentence -> subject verb complement
हैं जो वाक्यों का मिलान करने वाले हैं और हमें बताते हैं कि प्रत्येक भाग से जुड़े विचारों को कैसे स्पष्ट किया जाता है। ये नियम वाक्यात्मक नियम हैं, क्योंकि वे हमें बताते हैं कि हमारे संदेश का प्रतिनिधित्व कैसे आयोजित किया जाना है। subject
अपने आप में एक नियम के द्वारा परिभाषित किया जा सकता subject -> article noun
, और इतने पर।
2x+1=23x123
equation -> expression "=" expression
expression -> expression "+" expression
expression -> number
प्रोग्रामिंग भाषाओं की संरचना समान है। प्रोग्रामिंग की जाने वाली समस्याओं को हल करने के लिए व्यक्त की जाने वाली संगणनाओं को व्यक्त करने के लिए प्रोग्रामिंग भाषा विशेष रूप से विशिष्ट है, समस्याओं को हल करने के लिए, प्रमेयों का प्रमाण या जानवरों के बीच मैत्रीपूर्ण संबंध। लेकिन वह मुख्य अंतर है।
वाक्यविन्यास में उपयोग किए जाने वाले प्रतिनिधि आमतौर पर वर्णों के तार, या बोली जाने वाली भाषाओं के लिए ध्वनियों के होते हैं। शब्दार्थ आमतौर पर अमूर्त डोमेन के होते हैं, या संभवतः वास्तविकता के होते हैं, लेकिन फिर भी हमारी विचार प्रक्रियाओं में, या उपकरणों के व्यवहारिक डोमेन में अमूर्त होते हैं। संचार सूचना / विचार को सिंटैक्स में एन्कोड करता है, जो रिसीवर द्वारा प्रसारित और डीकोड किया जाता है। इसके बाद परिणाम को रिसीवर द्वारा किसी भी तरह से व्याख्या की गई।
इसलिए हम जो भाषा देखते हैं वह ज्यादातर वाक्य रचना और उसकी संरचना है। उपर्युक्त उदाहरण केवल सिंटैक्टिक स्ट्रिंग्स और उनके संरचनात्मक संगठन को परिभाषित करने का सबसे आम तरीका है। और भी हैं। किसी दिए गए भाषा के लिए, कुछ तारों को एक संरचना सौंपी जा सकती है, और कहा जाता है कि यह भाषा से संबंधित है, जबकि अन्य नहीं करते हैं।
शब्दों के लिए भी यही सच है। अक्षरों (या ध्वनि) के कुछ क्रम वैध शब्द हैं, जबकि अन्य नहीं हैं।
औपचारिक भाषाएं शब्दार्थ के बिना सिर्फ वाक्यविन्यास हैं। वे एक नियम के एक सेट के साथ परिभाषित करते हैं कि एक वर्णमाला के मूल तत्वों का उपयोग करके अनुक्रमों का निर्माण किया जा सकता है। क्या नियम हैं, कभी-कभी बहुत ही परिवर्तनशील हो सकते हैं। लेकिन औपचारिक भाषाओं का उपयोग भाषाई संचार से परे कई गणितीय उद्देश्यों के लिए किया जाता है, चाहे प्रोग्रामिंग भाषाओं के लिए स्वाभाविक हो। किसी भाषा में तार को परिभाषित करने वाले नियमों के समुच्चय को व्याकरण कहा जाता है। लेकिन भाषाओं को परिभाषित करने के कई अन्य तरीके हैं।
व्यवहार में, एक भाषा को दो स्तरों में संरचित किया जाता है। वर्णों के वर्णमाला से निर्मित शब्दों को लेक्सिकल स्तर परिभाषित करता है। वाक्यविन्यास स्तर वाक्यों, या शब्दों की वर्णमाला से निर्मित कार्यक्रम (या शब्द परिवारों का अधिक सटीक रूप से परिभाषित करता है, ताकि यह एक बारीक वर्णमाला बना रहे)। यह जरूरी कुछ हद तक सरलीकृत है।
अधिकांश भाषा (प्रोग्रामिंग या प्राकृतिक) में शब्दों की संरचना काफी सरल है ताकि उन्हें आमतौर पर उस तरह से परिभाषित किया जाए जिसे आमतौर पर सबसे सरल प्रकार की औपचारिक भाषा माना जाता है: नियमित भाषा। उन्हें नियमित अभिव्यक्तियों (regexp) के साथ परिभाषित किया जा सकता है, और काफी आसानी से क्रमादेशित उपकरणों से पहचाना जाता है जिन्हें परिमित अवस्था ऑटोमेटा कहा जाता है। प्रोग्रामिंग भाषाओं के मामलों में, एक शब्द के उदाहरण एक पहचानकर्ता, एक पूर्णांक, स्ट्रिंग, एक वास्तविक संख्या, एक आरक्षित शब्द जैसे कि , if
या repeat
विराम चिह्न या एक खुला कोष्ठक हैं। शब्द परिवारों के उदाहरण पहचानकर्ता, स्ट्रिंग, पूर्णांक हैं।
वाक्यविन्यास स्तर को आमतौर पर औपचारिक भाषा के कुछ अधिक जटिल प्रकारों द्वारा परिभाषित किया जाता है: संदर्भ-मुक्त भाषाएं, वर्णमाला के रूप में शब्दों का उपयोग करते हुए। हमने जो नियम ऊपर देखे हैं, वे प्राकृतिक भाषा के लिए संदर्भ-मुक्त नियम हैं। प्रोग्रामिंग भाषाओं के मामले में नियम हो सकते हैं:
statement -> assignment
statement -> loop
loop -> "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression
ऐसे नियमों के साथ आप लिख सकते हैं:
while aaa /= bbb do aaa = aaa + bbb / 6
जो एक बयान है।
और जिस तरह से इसका उत्पादन किया गया था, उसे एक पेड़ की संरचना द्वारा दर्शाया जा सकता है जिसे पार्स ट्री या सिंटैक्स ट्री कहा जाता है (यहाँ पूरा नहीं):
statement
|
_______________ loop _______________
/ / \ \
"while" expression "do" statement
__________|_________ |
/ | \ assignment
expression "operator" expression _______|_______
| | | / | \
"identifier" "/=" "identifier" "identifier" "=" expression
| | | |
aaa bbb aaa ... ...
एक नियम के बाईं ओर प्रदर्शित होने वाले नामों को गैर-टर्मिनलों कहा जाता है, जबकि शब्दों को टर्मिनलों भी कहा जाता है, क्योंकि वे भाषा के लिए वर्णमाला में हैं (लेक्सिकल स्तर से ऊपर)। गैर-टर्मिनल अलग-अलग सिंटैक्टिक संरचनाओं का प्रतिनिधित्व करता है, जिसका उपयोग प्रोग्राम बनाने के लिए किया जा सकता है।
इस तरह के नियमों को संदर्भ-मुक्त कहा जाता है, क्योंकि एक गैर-टर्मिनल को मनमाने तरीके से संबंधित नियमों में से किसी का उपयोग करके प्रतिस्थापित किया जा सकता है, स्वतंत्र रूप से उस संदर्भ में जिसमें यह प्रकट होता है। भाषा को परिभाषित करने वाले नियमों के सेट को संदर्भ-मुक्त व्याकरण कहा जाता है।
वास्तव में उस पर प्रतिबंध हैं, जब पहचानकर्ताओं को पहले घोषित किया जाना है, या जब एक अभिव्यक्ति को प्रकार के प्रतिबंधों को पूरा करना होगा। लेकिन इस तरह के प्रतिबंध को वाक्य-रचना के बजाय शब्दार्थ माना जा सकता है। वास्तव में कुछ पेशेवर उन्हें स्थैतिक शब्दार्थ कहते हैं
।
किसी भी वाक्य, किसी भी कार्यक्रम को देखते हुए, इस वाक्य के लिए पार्स ट्री द्वारा दी गई संरचना का विश्लेषण करके उस वाक्य का अर्थ निकाला जाता है। इसलिए, एल्गोरिदम को विकसित करना बहुत महत्वपूर्ण है, जिसे पार्सर कहा जाता है, जो कि प्रोग्राम के अनुसार, पेड़ की संरचना को ठीक कर सकता है, जब प्रोग्राम दिया जाता है।
पार्सर लेक्सिकल एनालाइज़र से पहले होता है जो शब्दों को पहचानता है, और उस परिवार को निर्धारित करता है जिससे वे संबंधित हैं। फिर शब्दों, या शाब्दिक तत्वों का क्रम, पार्सर को दिया जाता है जो अंतर्निहित वृक्ष संरचना को पुनः प्राप्त करता है। इस संरचना से कंपाइलर यह निर्धारित कर सकता है कि कोड कैसे उत्पन्न किया जाए, जो कि कंपाइलर की तरफ प्रोग्राम प्रोसेसिंग का उसका सिमेंटिक हिस्सा है।
एक कंपाइलर का पार्सर वास्तव में पार्स-ट्री के अनुरूप एक डेटा संरचना का निर्माण कर सकता है और इसे संकलन प्रक्रिया के बाद के चरणों में पास कर सकता है, लेकिन इसके लिए नहीं है। प्रोग्राम टेक्स्ट में निहित सिंटैक्स-ट्री का पता लगाने के लिए एक कम्प्यूटेशनल रणनीति विकसित करने के लिए पार्सिंग एल्गोरिथ्म राशि चल रही है। यह सिंटैक्स / पार्स ट्री संकलन प्रक्रिया (चरणों की संख्या) के आधार पर प्रक्रिया में खोजा जा सकता है या नहीं भी हो सकता है। हालांकि यह आवश्यक है कि पार्स-ट्री के अंत में कम से कम एक नीचे-ऊपर अन्वेषण हो, चाहे गणना संरचना में निहित या छोड़ दिया गया हो।
इसका कारण, सहज रूप से, यह है कि सिंटैक्टिक ट्री संरचना से संबंधित शब्दार्थ को परिभाषित करने के लिए एक मानक औपचारिक तरीका है जिसे होमोफोरिज़्म कहा जाता है। बड़े शब्द से मत डरो। विचार का अर्थ केवल यह है कि संपूर्ण का अर्थ भागों के अर्थ से निर्मित है, ऑपरेटर के आधार पर जो उन्हें जोड़ता है
उदाहरण के लिए, वाक्य the dog bites the cat
का नियम के साथ विश्लेषण किया जा सकता है sentence -> subject verb complement
। यह जानते हुए कि 3 subtrees का अर्थ subject
, verb
और complement
नियम है कि composes उन्हें हमें बताता है कि विषय कार्रवाई कर रही है, और बिल्ली एक है जो काट लिया है यह है कि,।
यह केवल एक सहज व्याख्या है, लेकिन इसे औपचारिक रूप दिया जा सकता है। शब्दार्थ का निर्माण घटकों से ऊपर की ओर किया जाता है। लेकिन इससे बहुत जटिलता छिप जाती है।
एक संकलक के आंतरिक काम को कई चरणों में विघटित किया जा सकता है। मध्यवर्ती संकलनों का उपयोग करके वास्तविक संकलक चरणों द्वारा काम कर सकता है। यह कुछ चरणों को भी मिला सकता है। यह हाथ में भाषा के संकलन की जटिलता और उपयोग की जाने वाली तकनीक पर निर्भर करता है।