प्रोग्राम योग्य होने के लिए, क्या यह अनिवार्य है कि यह एक संदर्भ मुक्त व्याकरण पर आधारित हो


23

व्यावहारिक रूप से, एक भाषा के लिए जिसे अंततः सिस्टम स्तर के निर्देशों में संकलित / रूपांतरित किया जा सकता है, क्या यह आवश्यक है कि यह एक संदर्भ मुक्त व्याकरण हो?

ex: क्या सभी प्रोग्रामिंग / स्क्रिप्टिंग भाषाएँ संदर्भ मुक्त व्याकरण हैं? जावा सीएफजी पर आधारित है, लेकिन क्या वास्तव में यह मामला है कि सभी प्रोग्रामिंग भाषा सीएफजी पर आधारित हैं?

यह अनिवार्य नहीं लगता है, लेकिन मेरी समझ में अंतराल हैं।

प्रश्न के लिए कुछ संदर्भ: मैं जावा भाषा विनिर्देश को देख रहा था, जो व्याकरण के नियम भी प्रदान करता है । इसने मुझे इस प्रश्न के बारे में सोचा।


1
आम तौर पर मुझे लगता है कि यह सिर्फ इतना है कि आप चाहते हैं कि संकलन की समस्या कम्प्यूटेशनल हो, और सीएफजी को पार्स करना अच्छा और आसान है। हालाँकि, मैंने कुछ दावे सुने हैं, उदाहरण के लिए, मान्य पर्ल कार्यक्रमों को पहचानना वास्तव में एक गैर-संगणनीय समस्या है।
जेन एच। कोरोहेन

2
वास्तव में आप सभी की जरूरत है एक ट्यूरिंग-डिसिडेबल सिंटैक्स (जो सभी सीएफजी हैं)। आप एक प्रोग्रामिंग भाषा भी बना सकते हैं, जिसका सिंटैक्स ट्यूरिंग-डिसिडेबल नहीं है, लेकिन जब आप एक टाइपो बनाते हैं तो कंपाइलर कभी भी बंद नहीं कर सकता है, जबकि यह तय करने की कोशिश कर रहा है कि क्या यह वैध सिंटैक्स है। यह वास्तव में उपयोगी नहीं है
शाफ़्ट सनकी

@ratchet, क्या आप मान रहे हैं कि वाक्यविन्यास पुनरावृत्ति करने योग्य होना चाहिए?
डेविड हैरिस

4
@JanneKorhonen: विशेष रूप से, पर्ल को सांख्यिकीय रूप से पार्स नहीं किया जा सकता है, अर्थात, इसे निष्पादित किए बिना भी पार्स नहीं किया जा सकता है; चूंकि कहा जाता है कि निष्पादन गैर-समाप्ति योग्य हो सकता है, इसलिए पर्ल को सांख्यिकीय रूप से पार्स करना, इससे हाल्टिंग समस्या का समाधान होगा।
जॉन पूर्डी

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

जवाबों:


20

दो बार नहीं।

सबसे पहले, अधिकांश एचपीएल संदर्भ मुक्त नहीं हैं। जबकि उनके पास आमतौर पर एक सीएफजी के आधार पर वाक्यविन्यास होता है, उनके पास वह भी होता है जिसे लोग स्थैतिक शब्दार्थ कहते हैं (जिसे वाक्य विन्यास में अक्सर शामिल भी किया जाता है)। इसमें वे नाम और प्रकार शामिल हो सकते हैं, जिन्हें एक सही कार्यक्रम के लिए देखना है। उदाहरण के लिए,

class A {
  String a = "a";
  int b = a + d;
}

एक वाक्यात्मक रूप से सही जावा प्रोग्राम है, लेकिन इसे संकलित dनहीं किया जाएगा क्योंकि यह परिभाषित नहीं है और aइसमें फिटिंग का प्रकार नहीं है।

दूसरे, आप उन भाषाओं को पार्स कर सकते हैं जो संदर्भ-मुक्त नहीं हैं (जैसा कि स्पष्ट रूप से संकलक के अस्तित्व से सिद्ध होता है)। यह केवल यह है कि सीएफजी को कुशलता से पार्स किया जा सकता है, जबकि सीएसजी सामान्य रूप से नहीं कर सकते हैं। हालाँकि, आप कुछ गैर-संदर्भ-मुक्त सुविधाओं को जोड़ सकते हैं, जबकि शेष कुशल हैं।

कंपाइलर अक्सर चरणों में चलते हैं: पहले टोकन (नियमित), फिर संदर्भ-मुक्त पार्सिंग, फिर नाम और प्रकार का विश्लेषण (संदर्भ-संवेदनशील, कभी-कभी कठिन भी)। आप उस व्यवहार का अवलोकन कर सकते हैं जिस तरह के त्रुटि संदेश आपको मिलते हैं।


3
भूलना मत public class Program { public static void main(String[] args) { ... } }... जावा आपको आसान नहीं होने देगा। :-)
रॉय टिंकर

तकनीकी रूप से, class A { ... }पूरी तरह से पर्याप्त है क्योंकि javacसामान संकलित करता है जिसे आप वास्तव में निष्पादित नहीं कर सकते हैं (प्रवेश बिंदु की कमी के लिए), भी। लेकिन हाँ।
राफेल

20

6
मुझे ऐसा लग रहा है कि यह एक पर्ल जोक की पंचलाइन होनी चाहिए :)
सुरेश वेंकट

5
सुरेश: मैंने पहले ही वह चुटकुला बना लिया है, हालांकि यह बहुत अच्छा मजाक नहीं निकला, SIGBOVIK 2011 में "अनएक्सपेक्टेबल प्रोग्रामिंग लैंग्वेजेस" पर ( sigbovik.org/2011/proceedings.pdf - पृष्ठ 79- 82)।
रोब सिमंस

1
ध्यान दें: पर्ल दुभाषिया अभी तक गैर-नियतात्मक नहीं है, अगर यह किसी के लिए आराम है :)
रॉय टिंकर

15

मुझे विश्वास नहीं होता कि पायथन का व्याकरण संदर्भ मुक्त है। कोड के एक ही ब्लॉक में लाइनों की समान मात्रा में इंडेंटेशन की आवश्यकता है कि संदर्भ मुक्त व्याकरण अच्छी तरह से संभालते हैं।

अधिक सटीक रूप से, फॉर्म के पायथन ब्लॉक की भाषा से एक समरूपता प्रतीत होती है

अगर हालत:
     पंक्ति 1
     लाइन 2
     पंक्ति 3
अन्य:
     line4

0n10n10n


4
कड़ाई से आप सही हैं, लेकिन प्रोग्रामिंग भाषाओं के संदर्भ में हम संदर्भ-मुक्त भाषा बनाने की कोशिश करते हैं, जिसके परिणामस्वरूप एक पूर्व-प्रक्रिया के रूप में टोकन कहा जाता है । मुझे लगता है कि इससे पहले इंडेंटेशन की जाँच की जाती है।
डिएगो डे एस्ट्राडा

7
हाँ, पायथन लेसर (टोकन) में इंडेंटेशन डेप्थ का ढेर है; टोकन स्ट्रीम में प्रत्येक ब्लॉक की शुरुआत में एक इंडेंट सिंबल और अंत में एक DEDENT सिंबल होता है जिसे एक संदर्भ मुक्त तरीके से पार्स किया जा सकता है (इंडेंट और डेडेंट सी में ब्रेसिज़ की तरह कार्य करता है)। C के पास "यह नहीं बताया जा सकता है कि क्या घोषणा या अभिव्यक्ति" समस्या है: एक सूचक foo * bar;के fooरूप में barया कई fooबार गुणा करने की घोषणा है bar?
मैक्स

8
ठीक है, यकीन है, लेकिन फिर आप लेक्सर में एक ही जटिलता छिपा रहे हैं, बजाय इसके कि वे अक्सर एक सीमित राज्य ट्रांसड्यूसर बनाते हैं।
डेविड एप्पस्टीन

1
@ डेविडवीपस्टीन: निष्पक्ष होना, किसी भी तरह से जटिलता महान नहीं है।
जॉन पूर्डी

1
लेसर में INDENT / DEDENT को संभालने के अलावा, पायथन में एक बहुत ही सरल LL (1) व्याकरण है।
rmmh

13

बोडो मेंथे और मार्टिन बॉहम बताते हैं कि प्रत्येक सी ++ कंपाइलर जरूरी रूप से ट्यूरिंग पूर्ण है, अर्थात यह संकलन के समय किसी भी आंशिक पुनरावर्ती कार्य की गणना कर सकता है । तो यह सिर्फ संदर्भ-संवेदनशील की तुलना में बहुत खराब है।

http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf


हां, लेकिन संकलक कभी भी संदर्भ-मुक्त व्याकरण नहीं हैं। आपको व्याकरण की ही चर्चा करनी चाहिए, संकलक की नहीं।
जेफ बर्गेज

@ जेफ़: मेरे उत्तर में "संकलन समय" का अर्थ है "यह जांचना कि क्या एक दिया गया C + स्रोत कोड सही है"। कागज में निर्माण के एक मामूली संशोधन से, यह इस प्रकार है कि आप सभी सही भाषा को सभी सही C ++ कार्यक्रमों के सेट तक कम कर सकते हैं।
मार्कस ब्लेसर 19

7

मुझे लगता है कि चर का उपयोग करने से पहले घोषणा और ओओपी भाषाओं के समारोह बहुरूपता प्रोग्रामिंग भाषा विनिर्देशों के अन्य उदाहरण हैं जिन्हें संदर्भ मुक्त व्याकरण द्वारा नियंत्रित नहीं किया जा सकता है:

int myfun(int a) { ... }
int myfun(int a, int b) { ... }
int myfun(int a, int b, int c, ...) { ... }
...
int I_m_I_cfg = myfun(1,2);
...

मैंने थोड़ी Google खोज की और मुझे यह लेख मिला: " बौलियन ग्रामर फॉर ए सिंपल बुलियन लैंग्वेज " ए.ओखोटिन (2004) द्वारा; उनके अनुसार, वास्तविक समस्या एक प्रोग्रामिंग भाषा को खोजने के लिए है जो पूरी तरह से एक औपचारिक व्याकरण द्वारा वर्णित है:

एक खिलौना प्रक्रियात्मक प्रोग्रामिंग भाषा को परिभाषित किया गया है, और इस भाषा में अच्छी तरह से गठित कार्यक्रमों के सेट के लिए एक बूलियन व्याकरण का निर्माण किया गया है। यह स्पष्ट रूप से एक औपचारिक व्याकरण द्वारा पूरी तरह से प्रोग्रामिंग भाषा का पहला विनिर्देश है।

लेख का परिचय अनुभाग छोटा है लेकिन बहुत स्पष्ट है।


6

मेरा मानना ​​है कि सी का व्याकरण केवल तकनीकी रूप से संदर्भ-मुक्त है क्योंकि पार्सर्स हमेशा डफ के उपकरण का समर्थन करने के लिए गैर-संदर्भ-मुक्त तकनीकों का उपयोग करते हैं

इंडेंटेशन आधारित भाषाएं स्वाभाविक रूप से संदर्भ-मुक्त नहीं हैं, जैसे कि डेविड ने कहा, लेकिन वे एक पैरामीटर इंडेंटेशन टोकन के सापेक्ष संदर्भ-मुक्त हो जाते हैं।

हास्केल आपको infix और infixl के साथ ऑपरेटर पूर्वता को बदलने की सुविधा देता है। पर्ल के सख्त प्रागमा मॉड्यूल को लेक्सिकल सेटिंग्स $ ^ एच और% ^ एच का उपयोग करके लागू किया गया है, जो इसे संदर्भ-मुक्त नहीं बनाता है, शायद अन्य सेटिंग्स भी।

TeX जैसी मैक्रो एक्सपैंडर भाषाएं हैं जिनमें afaik पार्सिंग को क्रियान्वित किए बिना कोई मतलब नहीं है।

संभवतः दो संदर्भ-मुक्त व्याकरण भी हैं, जिनका प्रतिच्छेदन संदर्भ-मुक्त नहीं है, लेकिन फिर भी एक ट्यूरिंग मशीन का वर्णन करता है।

जावा और असेंबलर शायद स्वाभाविक रूप से संदर्भ-मुक्त दोनों हैं।


2
क्या (a)-bसी-संदर्भ को संवेदनशील बनाने की अस्पष्टता नहीं है ? ( aएक चर या एक टंकण हो सकता है - कुछ अन्य भाषाएं इस कारण से एक शून्य से नीचे की अभिव्यक्ति की अनुमति नहीं देती हैं)
रैंडम 832

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

4

नहीं, और कई व्यावहारिक भाषाएं संदर्भ-मुक्त नहीं हैं। उदाहरण के लिए C ++ व्याकरण नहीं है, क्योंकि कुछ संदर्भों में व्याकरण संकल्प टाइपिंग जानकारी पर निर्भर करता है जो संदर्भ-मुक्त नहीं है।


4

पहले मुझे एक प्रोग्रामिंग लैंग्वेज और भाषा के सिंटैक्स के बीच अंतर करने दें।

कई भाषाओं के वाक्य विन्यास (कम से कम आधारित) एक संदर्भ मुक्त व्याकरण (सीएफजी) हैं क्योंकि ये अच्छी तरह से अध्ययन किए गए हैं और ऐसे एल्गोरिदम हैं जो कुशलतापूर्वक एक सीएफजी को पार्स कर सकते हैं और सीएफजी द्वारा हल नहीं किए जा सकने वाले किनारे मामले को विशेष रूप से नियंत्रित किया जा सकता है।

हालाँकि, कई भाषाएँ वास्तव में संदर्भ-मुक्त नहीं हैं (जब घोषणा-पूर्व-उपयोग प्रतीकों का उपयोग किया जाता है, उदाहरण के लिए जावा, सी (++), डी)।

मजेदार तथ्य: डी में एक ट्यूरिंग-कम्पाइल-टाइम-फंक्शन मूल्यांकन और टेम्प्लेट का विस्तार है, जो भाषा को गैर-ट्यूरिंग-डिकिडेबल बनाता है। हालाँकि वाक्य रचना को CFG बनाने के लिए भाषा के निर्माता को बड़ी लंबाई का सामना करना पड़ा।


नाम- और प्रकार का विश्लेषण आमतौर पर स्वाभाविक रूप से गैर-संदर्भ मुक्त कार्यों को बेहतर बनाता है।
राफेल

C ++ में टेम्प्लेट मेटा-प्रोग्रामिंग ट्यूरिंग पूर्ण है।
जेफ बर्ड्स 15

3

जहाँ तक "क्या सभी प्रोग्रामिंग / स्क्रिप्टिंग भाषाएँ संदर्भ मुक्त व्याकरण हैं?" भाग का संबंध है, उत्तर एक निश्चित संख्या है।

पुन: "एक भाषा के लिए मुख्य प्रश्न जिसे अंततः सिस्टम स्तर के निर्देशों में संकलित / रूपांतरित किया जा सकता है," मुझे नहीं पता कि सीएफजी होने के लिए यह आवश्यक क्यों है। हालाँकि, आगे आने वाले बेहतर स्पष्टीकरण हो सकते हैं।


1
क्रिश, क्या आप गैर-संदर्भ मुक्त व्याकरण आधारित प्रोग्रामिंग भाषाओं के कुछ उदाहरण दे सकते हैं। मेरा मतलब है, पूर्व-प्रसंस्करण पोस्ट करें जो समस्याएं पैदा कर सकता है जो गणना योग्य नहीं हो सकती है, अंतिम व्याकरण जिसके खिलाफ कार्यक्रम मान्य है।
संदीपकुंकुरुरु 14

3

एक प्रोग्रामिंग भाषा को कुछ प्रकार के व्याकरण की औपचारिकता पर आधारित होने की आवश्यकता है, जिनमें से CFG एक उदाहरण है। जबकि सीएफजी सबसे आम हैं (और असमानताओं पर संकलक पाठ्यक्रमों में सिखाई जाने वाली सामान्य चीज हैं), अन्य औपचारिकताएं हैं जैसे कि पार्सिंग अभिव्यक्ति व्याकरण, जिसे आप यहां (पीडीएफ) या विकिपीडिया पर अधिक काटने के आकार के बारे में अधिक पढ़ सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.