एक कंपाइलर लिखने से सरल और वीएम आपके दुभाषिया को पंजीकृत और ट्राम्पोलिन करना है। चूंकि आपके पास एक दुभाषिया है और संकलक नहीं है (मुझे लगता है), आपको पूंछ कॉल के लिए उचित समर्थन प्राप्त करने के लिए केवल कुछ सरल परिवर्तनों की आवश्यकता है।
आपको पहले निरंतरता-गुजरने वाली शैली में सब कुछ लिखना होगा, जो सी/सी ++ में सोचने और करने के लिए अजीब हो सकता है। दान फ्राइडमैन के ParentheC ट्यूटोरियल एक रूप है कि मशीन अनुवाद है सी
के अंत में में एक उच्च स्तरीय बदलने, पुनरावर्ती कार्यक्रम के माध्यम से आप कदम, आप अनिवार्य रूप से एक सरल वीएम लागू करेंगे के बजाय जहां नियमित रूप से समारोह का उपयोग कर eval, applyProc, आदि, आप तर्क वैश्विक चर की स्थापना से गुजरती हैं और फिर अगले तर्क करने के लिए एक goto
कर (या एक उच्च-स्तरीय पाश और कार्यक्रम काउंटर का उपयोग करें) करने के लिए कहता है ...
return applyProc(rator, rand)
हो जाता है
reg_rator = rator
reg_rand = rand
reg_pc = applyProc
return
यही है कि, आपके सभी फ़ंक्शंस जो सामान्य रूप से एक-दूसरे को दोबारा कॉल करते हैं उन्हें एक छद्म-असेंबली में कम कर दिया जाता है जिसमें वे केवल कोड के ब्लॉक होते हैं जो पुनरावृत्ति नहीं करते हैं। एक उच्च-स्तरीय पाश कार्यक्रम को नियंत्रित करता है:
for(;;) {
switch(reg_pc) {
case EVAL:
eval();
break;
case APPLY_PROC:
applyProc();
break;
...
}
}
संपादित करें: मैं अपने शौक योजना दुभाषिया, जावास्क्रिप्ट में लिखा के लिए एक ही प्रक्रिया के माध्यम से चला गया। मैंने कई अज्ञात प्रक्रियाओं का लाभ उठाया, लेकिन यह एक ठोस संदर्भ के रूप में मदद कर सकता है। FoxScheme's commit history 2011-03-13 से शुरू (30707a0432563ce1632a) ऊपर 2011-03-15 के माध्यम से (5dd3b521dac582507086) को देखो।
संपादित करें^2: गैर-पूंछ पुनरावृत्ति अभी भी स्मृति का उपभोग करेगी, भले ही यह ढेर में न हो।
मुझे लगता है कि एक बहुत ही समान सवाल पूछा गया है: http://stackoverflow.com/questions/5986058/how-does-one-implement-a-stackless-interpreted-language – csl
मैंने पाया कि पीटर नॉरविग का मूल JScheme इसे लागू करता है एक साधारण trampoline के साथ अच्छी तरह से। Http://norvig.com/jscheme/Scheme.java – csl