फोर्थ का लचीलापन इसके लिए एक व्याकरण को अनुपयुक्त क्यों बनाता है?


10

मैंने हाल ही में स्टैक-आधारित प्रोग्रामिंग भाषा लिखने का कार्य किया है। इससे पहले कि मैं अपनी भाषा डिज़ाइन करना शुरू करूँ, मैंने सोचा कि मौजूदा स्टैक-आधारित भाषाओं के साथ पढ़ना और प्रयोग करना एक अच्छा विचार होगा।

यह मुझे इस पोस्ट के विषय में लाता है। मैं फोर्थ पर विकिपीडिया लेख के माध्यम से पढ़ रहा था , एक स्टैक-आधारित भाषा जो पोस्टफ़िक्स शैली के भाव का उपयोग करती है। लेख में, मैंने निम्नलिखित कथन देखा:

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

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

वास्तव में, मैंने नीचे फोर्थ के एक साधारण उप-समूह के लिए बीएनएफ शैली व्याकरण लिखने का प्रयास करने का निर्णय लिया:

program        ::= stmt+
stmt           ::= func | expr
func           ::= ':' expr+ ';'
expr           ::= INTEGER | word
word           ::= ('+' | '-' | '*' | '/' )

उपरोक्त व्याकरण फोर्थ के कथनों के एक मान्य उपसमूह को कवर करने के लिए प्रतीत होता है, और फोर्थ भाषा में सभी मान्य कथनों को कवर करने के लिए विस्तारित करने के लिए ऐसा प्रतीत नहीं होता है। इसके अलावा, यदि एक कंपाइलर का पार्सर उपरोक्त व्याकरण को लागू करता है, तो मैं यह देखने में विफल रहता हूं कि कंपाइलर को कभी भी कैसे बढ़ाया जाएगा। संकलक किसी भी नए शब्द को पर्यावरण में जोड़ देगा । सिर्फ माहौल बदला है। यह लगभग ऐसा लगता है जैसे विकिपीडिया के उपरोक्त अंश कंपाइलर के वातावरण के साथ संकलक (जो नहीं बदलता है) को रेखांकित करने वाले अंडरलाइनिंग कोड को स्वीकार कर रहा है (जो परिवर्तन नहीं करता है)।

सारांश में, नए शब्दों (उपशास्त्रियों) को परिभाषित करने के लिए फोर्थ की घृणा लिखित व्याकरण के लिए अनुपयुक्त क्यों है?


1
"अनुचित" इस संदर्भ में एक मजबूत शब्द है। एक बेहतर शब्द शायद "अनावश्यक" होगा।
रॉबर्ट हार्वे

1
ओह, ठीक है @ रोबर्टहेयर। हालाँकि, अगर ऐसा होता, तो मेरे द्वारा उद्धृत अंश अधिकांश भाषाओं पर लागू होता। तकनीकी रूप से एक व्याकरण की आवश्यकता कभी नहीं होती है , लेकिन एक के लिए अच्छा है - खासकर जब हाथ से लिखने वाले।
क्रिश्चियन डीन

लेकिन अधिकांश भाषाओं में, पार्सर एक साधारण रनटाइम लाइब्रेरी नहीं है जिसे उपयोगकर्ता कोड द्वारा बदला जा सकता है, इस प्रकार यह प्रभावित होता है कि अगली पंक्ति कैसे पार्स की जाती है।
जोर्ज डब्ल्यू मित्तग

जवाबों:


10

एक "सामान्य" शब्द बहुत ज्यादा एक सबरूटीन है।

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

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


2
क्या आपको यकीन है कि फोर्थ की यह संपत्ति वास्तव में व्याकरण और न केवल शब्दार्थ को बदल देती है?
डॉक्टर ब्राउन

@DocBrown: ज्यादातर लोग जो फोर्थ का इस्तेमाल करते हैं, वे इसे काफी पसंद करते हैं, इसलिए वे आमतौर पर हाथ में काम के लिए केवल सबसे कम जरूरी बदलाव करते हैं। कोई व्यक्ति जो महत्वाकांक्षी (और पागल) पर्याप्त था, वाक्यविन्यास को पूरी तरह से बदल सकता था अगर वे चाहते थे - जैसे कि पोस्टफ़िक्स के बजाय infix संकेतन का उपयोग करना, यदि वे बुरी तरह से करना चाहते थे।
जेरी कॉफिन

@DocBrown आप किस तरह के व्याकरण को संभवतः लिख सकते हैं जो मुझे फोर्थ में सी दुभाषिया लिखने की अनुमति देगा, और फिर अचानक कार्यक्रम के बीच में सी पर स्विच कर सकता है?
user253751

@ मिनीबिस: ठीक है, मेरा सवाल है - क्या फोर्थ वास्तव में कुछ इस तरह की अनुमति देता है? उस लिंक किए गए लेख से, यह मेरे लिए स्वाभाविक रूप से स्पष्ट नहीं है।
डॉक ब्राउन

@DocBrown हाँ यह करता है। आप अपने कोड को संकलन समय पर चला सकते हैं, इसका मतलब है कि यदि आप चाहते हैं कि आप कंपाइलर को पूरी तरह से संभाल सकें। मूल रूप से आप अपने C कंपाइलर / दुभाषिया को Forth संकलक / दुभाषिया के बीच में चला सकते हैं। (चाहे आप अंततः फोर्थ में वापस लौटना चाहते हैं या नहीं आप पर निर्भर है)
user253751

3

फोर्थ में, आप संकलन समय पर कोड चला सकते हैं।

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

अधिक सामान्यतः, आप उन शब्दों को परिभाषित कर सकते हैं जो स्रोत कोड से तर्क पढ़ते हैं। परंपरागत रूप से आप शब्दों को उसी तरह से पढ़ेंगे जिस तरह से कंपाइलर करता है, लेकिन इसकी आवश्यकता नहीं है।

उदाहरण के लिए, ."शब्द (जो एक स्ट्रिंग को प्रिंट करता है) अगले स्थान तक नहीं पढ़ता है, यह अगले तक पढ़ता है "। यदि आप : PRINTHELLO ." Hello ; : func2 world!" ;किसी विशेष मामले के बिना कोड को पार्स करने का प्रयास करते हैं .", तो आप पाएंगे कि यह सही ढंग से पार्स नहीं किया गया है।

आप निश्चित रूप ."से अपने व्याकरण के लिए एक विशेष मामला जोड़ सकते हैं , लेकिन व्याकरण अभी भी गलत होगा यदि प्रोग्रामर अपने स्वयं के शब्द को परिभाषित करता है जैसे ."- उदाहरण के लिए यहां एक : MY_PRINT POSTPONE ." ; IMMEDIATE:। यह शब्द इसके बराबर है ."; मैं लिख सकता हूं MY_PRINT Hello ; world! "और आपके व्याकरण को इसे पार्स करने में सक्षम होना चाहिए। उसके साथ अच्छा भाग्य।

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