मेरी प्रोजेक्ट में एक वीएम है जो डोमेन-विशिष्ट-भाषा से संकलित बाइट-कोड निष्पादित करता है। मैं उन तरीकों को देख रहा हूं कि मैं बाइट-कोड के निष्पादन समय को बेहतर बना सकता हूं। पहले चरण के रूप में मैं यह देखना चाहता हूं कि मशीन कोड संकलन में प्रवेश करने से पहले बाइट-कोड दुभाषिया को सुधारने का कोई तरीका है या नहीं।इष्टतम वर्चुअल मशीन/बाइट-कोड दुभाषिया लूप
दुभाषिया के मुख्य पाश इस तरह दिखता है:
while(true)
{
uint8_t cmd = *code++;
switch(cmd)
{
case op_1: ...; break;
...
}
}
प्रश्न: वहाँ कोडांतरक का सहारा के बिना इस पाश लागू करने के लिए एक तेजी से रास्ता नहीं है?
एक विकल्प जो मैं देखता हूं वह जीसीसी विशिष्ट है जो लेबल पते के साथ गतिशील गोटो का उपयोग करने के लिए विशिष्ट है। प्रत्येक मामले के अंत में break
की बजाय मैं सीधे अगले निर्देश पर कूद सकता था। मैंने आशा की थी कि ऑप्टिमाइज़र मेरे लिए ऐसा करेगा, लेकिन डिस्सेप्लर को देखकर यह स्पष्ट रूप से नहीं करता है: अधिकांश op_codes के अंत में लगातार दोहराया जाता है।
यदि प्रासंगिक वीएम एक साधारण रजिस्टर आधारित मशीन है जिसमें फ्लोटिंग पॉइंट और पूर्णांक रजिस्ट्रार (प्रत्येक में से 8) हैं। कोई ढेर नहीं है, केवल एक वैश्विक ढेर (वह भाषा जटिल नहीं है)।
यह बेहद असंभव है कि स्विच की बजाय फ़ंक्शन कॉल करना तेज होगा (फ़ंक्शन कॉल का एक महत्वपूर्ण ओवरहेड होगा)। स्विच किसी भी तरह से कूद-टेबल पर शिकायत कर रहा है (जीसीसी कम से कम करता है)। –
कूल, जीसीसी के बारे में नहीं पता था, लेकिन वैसे भी, कोई भी इनलाइन के रूप में कार्यों को परिभाषित कर सकता है, और किसी भी तर्क को पारित करने के बजाय उन्हें वैश्विक चर बनाते हैं और इसी तरह, फ़ंक्शन कॉल ओवरहेड को बहुत छोटा बनाते हैं। बेशक, जब इस स्तर की बात आती है तो शायद पूरी चीज को असेंबलर में कोड करना आसान हो जाता है। (यदि कोई जानता है कि यह कैसे करें।) – Cray
आप प्रेषण तालिका के माध्यम से किए गए कॉल इनलाइन नहीं कर सकते हैं। यहां सबसे नज़दीकी विकल्प जीसीसी लेबल पते का उपयोग करना है, जो मूल रूप से आपको एक जंप टेबल में अपने इनलाइन फ़ंक्शंस बनाने देता है। –