मैं अपने बड़े एप्लिकेशन में एम्बेड करने के उद्देश्य से अपनी स्वयं की प्रयोगात्मक स्क्रिप्टिंग भाषा तैयार कर रहा हूं।किसी व्याख्या की गई भाषा में चर को संग्रहीत करने के लिए डेटा संरचना
लगभग हर चीज जिसे मैं करना चाहता था, आसानी से प्रोग्राम किया गया था, लेकिन स्मृति में चर भंडारण का "सरल" कार्य यहां सबसे कठिन हिस्सा दिखाई दिया। मुझे नहीं पता कि उन सभी प्रकार की जांच, वैश्विक चर और विशेष झंडे को अनुमति देने के लिए उन्हें कैसे स्टोर किया जाए। एक नमूना कोड पर पहले देखो:
a = 1
b = 2
someFunction()
print(a) --> This should read the global variable and print `1`
a = 3 --> Now `a` should become a local variable of this function
and the global `a` remain unchanged
x = 4 --> `x` should always be local of this function
end
मैं चर उनके level
एस के "इलाके" कहते हैं तो नेस्टेड ब्लॉकों में चर एक उच्च स्तर की है। उपरोक्त कोड में, a
और b
स्तर 1 चर हैं। कुछ फ़ंक्शन के स्थानीय चर के स्तर 2 होंगे। फ़ंक्शन की पहली पंक्ति को वैश्विक चर a
(स्तर 1) पढ़ना चाहिए, लेकिन दूसरी पंक्ति को एक चर फिर से बनाना चाहिए जिसे a
कहा जाता है लेकिन स्तर 2 के साथ उस बिंदु से वैश्विक a
छायांकन करता है। तीसरी पंक्ति को स्तर 2 के साथ परिवर्तनीय x
बनाना चाहिए। इन सभी को स्मृति में कैसे संग्रहीत और ट्रैक करना है?
variables
{
level=1 //global variables
{
a => 1,
b => 2
},
level=2 //function variables
{
a => 3,
x => 4
}
}
लेकिन उस चर लुक-अप वास्तव में धीमी गति से कर देगा के बाद से एक खोज करने के लिए है: स्तर की सरणी में variable=>value
का भंडारण नक्शे:
क्या मैं अब तक की कोशिश की:
विधि 1 किसी दिए गए चर के लिए सभी स्तर।
विधि 2: एक मानचित्र की कुंजी के रूप में (चर, स्तर) जोड़े भंडारण:
variables
{
(a, 1) => 1, //global
(b, 1) => 2, //global
(a, 2) => 3, //function
(x, 2) => 3 //function
}
यह पहले की तरह से हम सभी संभव के साथ जोड़ी (चर, स्तर) की कोशिश करने के लिए है एक ही समस्या है किसी दिए गए चर के लिए स्तर।
इष्टतम स्मृति उपयोग और सबसे तेज़ पहुंच समय के लिए मुझे किस विधि का उपयोग करना चाहिए?
अतिरिक्त नोट्स:
मैं कैसे चर ढेर और अन्य "असली" भाषाओं पर ढेर पर प्रबंधित कर रहे हैं के बारे में पता है, लेकिन मैं यह मुश्किल एक व्याख्या की भाषा पर यह करने के लिए लगता है। "यह नहीं होना चाहिए कि लुआ और पायथन ऐसा कैसे करते हैं," मैं हमेशा सोचता हूं। यदि मैं गलत हूं तो मुझे सही करों। मैं चर और नक्शे में आंतरिक सी ++ संरचनाओं को बदलने की कोशिश कर रहा हूं।
और आखिरकार, मैं एक चर का प्रतिनिधित्व करता हूं। क्या आपको लगता है कि यह बड़ा है और अधिक मेमोरी-कुशल प्रतिनिधित्व हो सकते हैं? (मैं भी "स्तर" एक सदस्य के रूप में यहाँ डाल करने की कोशिश की है, लेकिन यह बहुत अन्य रूप में एक ही समस्या थी।)
struct Member
{
uchar type; //0=num, 1=str, 2=function, 3=array, etc
uchar flags; //0x80 = read-only, 0x40 = write-only, etc
union {
long double value_num;
char* value_str;
int value_func;
//etc
};
};
मैं एक ऐसे मानचित्र का उपयोग करूंगा जो प्रत्येक परिवर्तनीय नाम को परिवर्तनीय उदाहरणों के ढेर में मैप करेगा। जब आप एक स्तर पर एक नया चर बनाते हैं तो आप इसे दबाते हैं स्टैक पर चर और स्टैक पर शीर्ष सबसे अधिक तत्व इस नाम के साथ वर्तमान में दृश्यमान चर आवृत्ति रखता है। स्तर को छोड़ते समय आपको स्टैक से चर को पॉप करने के लिए प्रत्येक स्तर के लिए आवंटित चर के एक सूची को भी बनाए रखना होगा। उम्मीद है कि समझ में, मैंने कभी भी एक भाषा खुद को डिजाइन नहीं की है। – Nobody
आप आसानी से सरणी के एक ढेर और डी ब्रुज़िन इंडेक्स के कुछ रूपों का उपयोग कर सकते हैं। एक आदिम "compi सभी नामों को हल करके व्याख्यान "व्याख्या करने से पहले कदम। –