एक गतिशील भाषा का विकास करना


11

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

संक्षेप में, क्या मुझे पता है कि संकलक काम करते हैं, लेकिन एक दुभाषिया बनाने के लिए पलायन करना चाहते हैं, इस पर विचार करने के लिए मुझे कोई संसाधन चाहिए? गतिशील भाषाओं के लिए कुछ VMs हैं, लेकिन मुझे अपना रोल करने में कोई समस्या नहीं है। यह सब सिर्फ मेरे निजी अनुभव के लिए है।

मैं संकलक से दुभाषिया तक जाने के तरीके के बारे में जानकारी मांग रहा हूं। अगर मैंने पहले ही भाषा X के लिए एक कंपाइलर बना लिया है, लेकिन अब एक दुभाषिया को क्या लिखना है, क्या करने की आवश्यकता है और क्या कोई संसाधन हैं जो इस प्रक्रिया पर चलते हैं?

मुझे ऐसे व्यापक या सारगर्भित संसाधन नहीं चाहिए जो कंपाइलर्स या वर्चुअल मशीनों पर काम करते हों। मेरे पास इस विषय पर बहुत सारी पाठ्य पुस्तकें हैं। मेरे द्वारा पाए गए सभी संसाधन या तो मान लेते हैं कि आपके पास 0 अनुभव है और इस तरह आप लेक्सिकल या वाक्यगत विश्लेषण के साथ शुरू करते हैं या वे बेहद सार हैं। मेरे पास एक काम करने वाला कंपाइलर है, लेकिन मैं अब इसे एक दुभाषिया में बदलना चाहता हूं और भाषा में गतिशील विशेषताएं जोड़ना चाहता हूं।

मुझे इस प्रक्रिया पर संसाधन नहीं मिले, यह बहुत सीमित हो सकता है, या एक दुभाषिया के "बैक एंड" पर संसाधन भी सैद्धांतिक नहीं होने के कारण जो मैंने यहां पोस्ट किया है।


1
इस तरह के बहुत सारे संसाधन हैं। ध्यान दें कि संकलक और दुभाषिया के बीच की रेखा आपके विचार से अधिक धुंधली है; C # 4.0 कंपाइलर डायनेमिक प्रोग्रामिंग का समर्थन करता है, जैसा कि कई अन्य कंपाइलर करते हैं।
रॉबर्ट हार्वे

@RobertHarvey हाँ, जो मैं पूछ रहा हूं वह संसाधनों के लिए मेरा स्वयं का रन टाइम / इंटरप्रेटर / वर्चुअल मशीन बनाने के लिए है। .Net दुभाषिया मेरे लिए आधार बनाने के लिए बहुत जटिल है!
ऑस्टिन हेनली


1
और इस एसओ सवाल की जाँच करें , अन्य सवालों के संदर्भ में टिप्पणियों की एक जोड़ी है जो काफी दिलचस्प हैं ...
यनिस्ति

जवाबों:


4

पहले दुभाषियों को लागू करने के बारे में जानें। मैं PLAI (प्रोग्रामिंग लैंग्वेज: एप्लिकेशन और इंटरप्रिटेशन) की सलाह देता हूं । यह वाक्यविन्यास पर लंबे समय तक रहने के बिना जल्दी से व्याख्या के मांस तक पहुंच जाता है।

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

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


5

यदि आप एक गतिशील भाषा के लिए दुभाषिया को लागू करने की मूल बातें सीखना चाहते हैं, तो मैं बहुत ही पहली गतिशील, व्याख्या की गई प्रोग्रामिंग भाषा की उत्पत्ति से बेहतर जगह की कल्पना नहीं कर सकता: लिस्प।

अपने मूल 1960 के पेपर में , जॉन मैकार्थी ने एक लिस्प के लिए आवश्यक 5 आदिम कार्यों को परिभाषित किया। बेशक, मैकार्थी ने केवल एक शैक्षिक अभ्यास के रूप में लिस्प पर अपने पेपर का इरादा किया था; यह एक स्नातक छात्र था जिसने evalविधानसभा में प्रत्यारोपित किया और पहला लिस्प दुभाषिया बनाया। पॉल ग्राहम सात आदिम पहचानता है : उद्धरण, परमाणु, eq, विपक्ष, कार, सीडीआर, और कॉन्ड।

बात यह है, आप वास्तव में किसी भी भाषा में लिस्प को लागू कर सकते हैं; एक बार जब आप लागू करते हैं eval, तो REPL सेट करना आसान होता है, और आपके पास एक इंटरैक्टिव दुभाषिया होता है। लिसप को सी, जावा, रूबी, पायथन और कई अन्य भाषाओं में लागू करने के लिए लोग काफी ऊब गए हैं या उत्सुक हैं। और हमेशा उद्देश्य पर नहीं; ग्रीनस्पून के दसवें नियम को याद रखना महत्वपूर्ण है :

किसी भी पर्याप्त रूप से जटिल सी या फोरट्रान कार्यक्रम में एक तदर्थ होता है, अनौपचारिक रूप से निर्दिष्ट, बग-ग्रस्त, सामान्य लिस्प के आधे भाग का धीमा कार्यान्वयन।

मैं यह नहीं कह रहा हूं कि आपका अंतिम लक्ष्य एक लिस्प कार्यान्वयन होना चाहिए; लेकिन एक गतिशील भाषा को लागू करने के लिए सीखने के दौरान समलैंगिकता के अपने फायदे हैं; जब आप किसी ऐसी भाषा पर सीख सकते हैं, जिसमें मुहावरेदार वाक्यविन्यास एक लैक्सर / पार्सर का उपयोग करने वाली भाषा के एएसटी के समान है, तो सिंटैक्स मुद्दों से कैसे निपटें?

किसी भी तरह ... बस एक सुझाव। लेकिन यह अच्छा कारण है कि सी के बाद से अधिकांश महान प्रोग्रामिंग भाषाओं में कम से कम लिस्प-प्रकृति है।


1
काश मैं दो उत्तर स्वीकार कर पाता। धन्यवाद, मुझे लगता है कि मैं वास्तव में एक लिस्प दुभाषिया को लागू करूंगा। यह पार्स करना आसान है, इसमें टन के प्रलेखन और मौजूदा कोड हैं, और मुझे काम करने के लिए एक नींव देना चाहिए। दुर्भाग्य से मैंने एक अंडरग्रेजुएट क्लास ली, जिसमें स्कीम का इस्तेमाल किया और इसने मेरे बाल खींचे;)
ऑस्टिन हेनली

1
मैं अब अपनी भाषा को लिस्प की अपनी बोली में संकलित करने के लिए ललचा रहा हूँ!
ऑस्टिन हेनले


0

मैंने इसे सार्वजनिक डोमेन में (C # की ~ 600 पंक्तियाँ) डाल दिया है, जो उद्धरण / सूची / लागू / eval / परीक्षण / आदि का समर्थन करता है, और एक लिस्प-जैसे सिंटैक्स और / या सिमेंटिक बिल्ड को आसानी से अनुकूलित करने की अनुमति देता है:

https://repl.it/CdjV/3

उदाहरण के लिए:

        var factorial = (Lambda)language.
            Evaluate
            (@"
                ( => ( n ) (
                        ? ( != n 0 )
                        ( * n ( this ( - n 1 ) ) )
                        1
                    )
                )
            ");

        var sw = new System.Diagnostics.Stopwatch();
        var n = 12;
        var r = 0;
        int k;
        sw.Start();
        for (k = 0; k < 10000; k++)
        {
            r = (int)factorial.Invoke(null, n);
        }
        sw.Stop();
        Console.WriteLine("{0}! = {1}", n, r);
        Console.WriteLine();
        Console.WriteLine("in {0} ms (for {1} times)", sw.ElapsedMilliseconds, k.ToString("0,0"));

'HTH,


0

यदि आप थोड़ी सी स्कीम (जैसे SICP पढ़ चुके हैं ) या लिस्प को जानते हैं, तो मुझे लगता है कि क्वीनेक की लिस्प इन शीट्स बुक की सलाह देते हैं । यह लिस्प-जैसे दुभाषियों और संकलक के कई वेरिएंट (बाइटकोड या सी सहित) बताते हैं।

इसके अलावा, स्कॉट की प्रोग्रामिंग लैंग्वेज प्रैग्मेटिक्स , नवीनतम ड्रैगन बुक , जीसी हैंडबुक , पियर्स की टाइप्स और प्रोग्रामिंग भाषाओं को पढ़ें

मैं संकलक से दुभाषिया तक जाने के तरीके के बारे में जानकारी मांग रहा हूं।

फिर, आंशिक मूल्यांकन (और फुतमुरा अनुमान) और निरंतरता-गुजर शैली प्रासंगिक हो सकती है।

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