मैंने हाल ही में स्टैक-आधारित प्रोग्रामिंग भाषा लिखने का कार्य किया है। इससे पहले कि मैं अपनी भाषा डिज़ाइन करना शुरू करूँ, मैंने सोचा कि मौजूदा स्टैक-आधारित भाषाओं के साथ पढ़ना और प्रयोग करना एक अच्छा विचार होगा।
यह मुझे इस पोस्ट के विषय में लाता है। मैं फोर्थ पर विकिपीडिया लेख के माध्यम से पढ़ रहा था , एक स्टैक-आधारित भाषा जो पोस्टफ़िक्स शैली के भाव का उपयोग करती है। लेख में, मैंने निम्नलिखित कथन देखा:
फोर्थ का लचीलापन स्थिर बीएनएफ व्याकरण को अनुचित बनाता है, और इसमें एक अखंड संकलक नहीं होता है। कंपाइलर का विस्तार केवल एक व्याकरण को संशोधित करने और अंतर्निहित कार्यान्वयन को बदलने के बजाय, एक नया शब्द लिखने की आवश्यकता है।
मेरी समझ से, फोर्थ लिंगो में, शब्द "शब्द" मूल रूप से "सबरूटीन" का पर्याय लगता है। इसे देखते हुए, उपरोक्त कथन अजीब लगता है। क्यों फोर्थ में नए कार्यों को बनाने की क्षमता फोर्थ के लिए एक औपचारिक व्याकरण बना देगी? आपको अपने द्वारा परिभाषित प्रत्येक नए उपखंड के लिए व्याकरण को फिर से लिखने की आवश्यकता क्यों होगी? पर्यावरण में एक नया शब्द लिखने से कंपाइलर का विस्तार कैसे होता है ? उपर्युक्त कथन यह कहने में कतराता है कि अजगर के लिए एक औपचारिक व्याकरण अनुचित है क्योंकि आप नए कार्यों को परिभाषित कर सकते हैं।
वास्तव में, मैंने नीचे फोर्थ के एक साधारण उप-समूह के लिए बीएनएफ शैली व्याकरण लिखने का प्रयास करने का निर्णय लिया:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
उपरोक्त व्याकरण फोर्थ के कथनों के एक मान्य उपसमूह को कवर करने के लिए प्रतीत होता है, और फोर्थ भाषा में सभी मान्य कथनों को कवर करने के लिए विस्तारित करने के लिए ऐसा प्रतीत नहीं होता है। इसके अलावा, यदि एक कंपाइलर का पार्सर उपरोक्त व्याकरण को लागू करता है, तो मैं यह देखने में विफल रहता हूं कि कंपाइलर को कभी भी कैसे बढ़ाया जाएगा। संकलक किसी भी नए शब्द को पर्यावरण में जोड़ देगा । सिर्फ माहौल बदला है। यह लगभग ऐसा लगता है जैसे विकिपीडिया के उपरोक्त अंश कंपाइलर के वातावरण के साथ संकलक (जो नहीं बदलता है) को रेखांकित करने वाले अंडरलाइनिंग कोड को स्वीकार कर रहा है (जो परिवर्तन नहीं करता है)।
सारांश में, नए शब्दों (उपशास्त्रियों) को परिभाषित करने के लिए फोर्थ की घृणा लिखित व्याकरण के लिए अनुपयुक्त क्यों है?