मैं एक असामान्य आवश्यकता है: मेरा आवेदन एक बहुत लंबे स्क्रिप्ट (एक गतिशील रूप से टाइप भाषा में लिखे गए) से स्वचालित रूप से जावा कोड उत्पन्न करता है। लिपि इतनी लंबी है कि मैंने the maximum method size of 65k of the JVM मारा।जावा - कैसे अपने आप जेनरेट कोड में अधिकतम विधि आकार काबू पाने के लिए
लिपि में केवल प्राचीन प्रकारों पर सरल निर्देश शामिल हैं (गणितीय के अलावा अन्य कार्यों के लिए कोई कॉल नहीं)। सभी
- बारी: यह की तरह लग रहे हो सकता है:
... a = b * c + sin(d) ... if a>10 then e = a * 2 else e = a * abs(b) end ...
... जो तब्दील हो जाता है के रूप में:
... double a = b * c + Math.sin(d); ... double e; if(a>10){ e = a * 2; }else{ e = a * Math.abs(b); } ...
मेरा पहला विचार विधि आकार सीमा को पार करने के लिए पीछा कर रहा था खेतों में स्थानीय चर - स्प्लिट कोड हर 100 लाइनों (या उससे अधिक समय अगर एक अगर/बाकी ब्लॉक के मामले में आवश्यक) सितम्बर में arate विधियों।
कुछ की तरह:
class AutoGenerated {
double a,b,c,d,e,....;
void run1(){
...
a = b * c + sin(d);
...
run2();
}
void run2(){
...
if(a>10){
e = a * 2;
}else{
e = a * Math.abs(b);
}
...
run3();
}
...
}
आप किसी अन्य तरीके कि और अधिक कुशल हो जाएगा का पता है? ध्यान दें कि मुझे जितनी जल्दी हो सके चलाने के लिए कोड की आवश्यकता है क्योंकि इसे लंबे लूप में निष्पादित किया जाएगा। मैं, सी के संकलन का सहारा नहीं कर सकते हैं के रूप में अंतर भी एक मुद्दा है ...
मैं भी पुस्तकालयों है कि मुझे मदद कर सकता है की ओर इशारा की सराहना करेंगे।
आप दक्षता के बारे में चिंतित हैं, तो आप को ध्यान देना चाहिए कि आकार में तरीकों से 8 KB डिफ़ॉल्ट रूप से संकलित नहीं कर रहे हैं। –
मैं विचार करता हूं कि आपके लिए इनलाइनिंग क्या कर सकती है। क्या कोड का कोई दोहराना अनुक्रम है जो इनलाइनिंग के बाद एक ही कोड उत्पन्न करेगा? –
@ पीटर लेवरी, 8KB से अधिक क्या होता है? क्या कोड का अर्थ है, बहुत सारी दक्षता की लागत है? संकलक यह तय करता है कि इसे संकलित करना चाहिए या नहीं? * इनलाइनिंग * के बारे में, यह वास्तव में कैसे काम करेगा? क्या मुझे कोड में "पैटर्न" की तलाश करनी चाहिए और उन्हें संभालने के लिए समर्पित तरीके बनाना चाहिए? –