मेरे इरादे से अधिक लंबा है; कृपया मेरे साथ सहन करें।)
अधिकांश भाषाएं "वाक्यविन्यास" नामक चीज़ से बना होती हैं: भाषा में कई अच्छी तरह से परिभाषित कीवर्ड शामिल हैं, और अभिव्यक्तियों की पूरी श्रृंखला जो आप बना सकते हैं उस भाषा में उस वाक्यविन्यास से बनाया गया है।
उदाहरण के लिए, मान लीजिए कि आपके पास एक साधारण चार-फ़ंक्शन अंकगणितीय "भाषा" है जो इनपुट के रूप में केवल एकल अंकों के पूर्णांक लेता है और पूरी तरह से संचालन के क्रम को अनदेखा करता है (मैंने आपको बताया कि यह एक साधारण भाषा थी)। यही कारण है कि भाषा वाक्य रचना से परिभाषित किया जा सकता है:
// The | means "or" and the := represents definition
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator := + | - | * | /
इन तीन नियमों से, आप एकल अंक इनपुट गणित भाव के किसी भी संख्या का निर्माण कर सकते हैं। इसके बाद आप इस वाक्यविन्यास के लिए एक पार्सर लिख सकते हैं जो किसी भी वैध इनपुट को अपने घटक प्रकारों ($expression
, $number
, या $operator
) में विभाजित करता है और परिणाम से संबंधित है। उदाहरण के लिए, अभिव्यक्ति 3 + 4 * 5
तोड़ा जा सकता है इस प्रकार है:
// Parentheses used for ease of explanation; they have no true syntactical meaning
$expression = 3 + 4 * 5
= $expression $operator (4 * 5) // Expand into $exp $op $exp
= $number $operator $expression // Rewrite: $exp -> $num
= $number $operator $expression $operator $expression // Expand again
= $number $operator $number $operator $number // Rewrite again
अब हम हमारी परिभाषित भाषा में एक पूरी तरह से पार्स वाक्य रचना है, मूल अभिव्यक्ति के लिए,। एक बार हमारे पास यह हो जाने के बाद, हम $number $operator $number
के सभी संयोजनों के परिणामों को खोजने के लिए एक पार्सर से गुजर सकते हैं और परिणाम निकाल सकते हैं, जब हमारे पास केवल $number
शेष है।
ध्यान दें कि $expression
संरचनाएं हमारे मूल अभिव्यक्ति के अंतिम विश्लेषण संस्करण में शेष हैं। ऐसा इसलिए है क्योंकि $expression
हमेशा हमारी भाषा में अन्य चीजों के संयोजन में कम किया जा सकता है।
PHP बहुत समान है: भाषा संरचना हमारे $number
या $operator
के बराबर के रूप में पहचानी जाती है। वे को अन्य भाषा संरचनाओं में कम नहीं किया जा सकता; इसके बजाए, वे मूल इकाइयां हैं जिनसे भाषा बनाई गई है। कार्यों और भाषा संरचनाओं के बीच महत्वपूर्ण अंतर यह है: पार्सर सीधे भाषा संरचनाओं से संबंधित है। यह भाषा संरचनाओं में कार्यों को सरल बनाता है।
कारण है कि भाषा निर्माण को ब्रांड्स की आवश्यकता हो सकती है या नहीं हो सकता है और कारणों के कुछ मूल्य वापस आते हैं जबकि अन्य PHP पार्सर कार्यान्वयन के विशिष्ट तकनीकी विवरणों पर पूरी तरह निर्भर नहीं होते हैं। मैं यह कैसे काम करता है पार्सर में अच्छी तरह से वाकिफ नहीं कर रहा हूँ, इसलिए मैं इन सवालों का पता नहीं कर सकते हैं विशेष रूप से, लेकिन एक पल के लिए एक भाषा है कि इस के साथ शुरू होता कल्पना:
$expression := ($expression) | ...
प्रभावी रूप से, इस भाषा के लिए स्वतंत्र है इसे प्राप्त कोई भी अभिव्यक्ति लें और आस-पास के कोष्ठक से छुटकारा पाएं।PHP (और यहां मैं शुद्ध अनुमान लगाने में काम कर रहा हूं) अपनी भाषा संरचनाओं के लिए कुछ समान कार्य कर सकता है: print("Hello")
इसे पार्स किए जाने से पहले print "Hello"
तक घटा दिया जा सकता है, या इसके विपरीत (भाषा परिभाषाएं कोष्ठक जोड़ सकते हैं और साथ ही उनसे छुटकारा पा सकते हैं)। , वे प्रभावी रूप पार्सर में hardcoded रहे हैं जबकि कार्यों भाषा निर्माणों का एक सेट करने के लिए किया जाता है और पार्सर आपको लगता है कि मानचित्रण बदलने के लिए अनुमति देता है:
यही कारण है कि आप echo
या print
की तरह भाषा निर्माणों को फिर से परिभाषित नहीं कर सकते हैं की जड़ है संकलित या रनटाइम पर अपनी भाषा संरचनाओं या अभिव्यक्तियों के सेट को प्रतिस्थापित करने के लिए।
दिन के अंत में, संरचनाओं और अभिव्यक्तियों के बीच आंतरिक अंतर यह है: भाषा संरचनाओं को समझ लिया जाता है और पार्सर द्वारा निपटाया जाता है। बिल्ट-इन फ़ंक्शंस, भाषा द्वारा प्रदान किए जाने पर, पार्सिंग से पहले भाषा संरचनाओं के एक सेट में मैप और सरलीकृत होते हैं।
और जानकारी:
संपादित परिभाषित करने के लिए प्रयोग किया है: अन्य उत्तर में से कुछ के माध्यम से पढ़ना, लोग अच्छा अंक बनाने । उनमें से:
- फ़ंक्शन की तुलना में एक भाषा निर्मित कॉल करने के लिए तेज़ है। यह सच है, अगर केवल मामूली रूप से, क्योंकि PHP दुभाषिया को उस कार्य को पार्सिंग से पहले अपनी भाषा-निर्मित समकक्षों को मैप करने की आवश्यकता नहीं है। एक आधुनिक मशीन पर, हालांकि, अंतर काफी नगण्य है।
- निर्मित एक भाषा त्रुटि-जांच को बाईपास करती है। प्रत्येक बिल्टिन के लिए PHP आंतरिक कार्यान्वयन के आधार पर यह सच हो सकता है या नहीं भी हो सकता है। यह निश्चित रूप से सच है कि अधिक से अधिक नहीं, कार्यों में अधिक उन्नत त्रुटि-जांच और अन्य कार्यक्षमता होगी जो बिल्टिन नहीं करते हैं।
- भाषा संरचनाओं को फ़ंक्शन कॉलबैक के रूप में उपयोग नहीं किया जा सकता है। यह सच है, क्योंकि निर्माण फ़ंक्शन नहीं है। वे अलग-अलग संस्थाएं हैं। जब आप एक बिल्टिन कोड करते हैं, तो आप एक फ़ंक्शन को कोडिंग नहीं कर रहे हैं जो तर्क लेता है - बिल्टिन का सिंटैक्स सीधे पार्सर द्वारा संभाला जाता है, और फ़ंक्शन के बजाए बिल्टिन के रूप में पहचाना जाता है। (यह समझना आसान हो सकता है कि क्या आप प्रथम श्रेणी के कार्यों वाले भाषाओं पर विचार करते हैं: प्रभावी ढंग से, आप ऑब्जेक्ट्स के चारों ओर फ़ंक्शंस पास कर सकते हैं। आप इसे बिल्टिन के साथ नहीं कर सकते हैं।)
वाह! इस महान उत्तर के लिए धन्यवाद! –
ग्रेट उत्तर जो कई भाषाओं पर लागू होने के लिए पर्याप्त रूप से खुला है, न केवल PHP। धन्यवाद! –
निश्चित रूप से बहुत लंबा, लेकिन वाह! निश्चित रूप से इसके लायक है। –