2015-01-20 9 views
12

Juicer कक्षा में निम्न विधि पर विचार करें:,प्रयास के लायक स्मॉलटॉक बाइटकोड अनुकूलन हैं?

25 self      ; 1 
26 pushTemp: 0    ; 2 
27 send: gather: 
28 popIntoTemp: 1   ; 3 * 
29 self      ; 4 * 
30 pushTemp: 1    ; 5 * 
31 send: extractJuiceFrom: 
32 storeIntoTemp: 2   ; 6 <- 
33 send: withoutSeeds 
34 returnTop 

अगला पर विचार 28:

Juicer >> juiceOf: aString 
    | fruit juice | 
    fruit := self gather: aString. 
    juice := self extractJuiceFrom: fruit. 
    ^juice withoutSeeds 

यह अब निम्नलिखित bytecodes

25 self      ; 1 
26 pushTemp: 0    ; 2 
27 send: gather: 
28 popIntoTemp: 1   ; 3 
29 self      ; 4 
30 pushTemp: 1    ; 5 
31 send: extractJuiceFrom: 
32 popIntoTemp: 2   ; 6 <- 
33 pushTemp: 2    ; 7 <- 
34 send: withoutSeeds 
35 returnTop 

उत्पन्न करता है ध्यान दें कि 32 और 33 को रद्द 2 9 और 30. gather के परिणाम से नीचे self डालें। एक ही ढेर विन्यास पहले संदेश भेजने से पहले self धकेलने के द्वारा प्राप्त किया जा सकता था किया गया है:

25 self      ; 1 <- 
26 self      ; 2 
27 pushTemp: 0    ; 3 
28 send: gather: 
29 popIntoTemp: 1   ; 4 <- 
30 pushTemp: 1    ; 5 <- 
31 send: extractJuiceFrom: 
32 storeIntoTemp: 2   ; 6 
33 send: withoutSeeds 
34 returnTop 

अब 29 और 30

25 self      ; 1 
26 self      ; 2 
27 pushTemp: 0    ; 3 
28 send: gather: 
29 storeIntoTemp: 1   ; 4 <- 
30 send: extractJuiceFrom: 
31 storeIntoTemp: 2   ; 5 
32 send: withoutSeeds 
33 returnTop 

रद्द temporaries 1 और 2 में लिखा जाता है न कि उन्हें पढ़ने।

25 self      ; 1 
26 self      ; 2 
27 pushTemp: 0    ; 3 
28 send: gather: 
29 send: extractJuiceFrom: 
30 send: withoutSeeds 
31 returnTop 

इस अंतिम संस्करण है, जो 4 से 7 ढेर आपरेशन बचाता है, कम अर्थपूर्ण और स्पष्ट स्रोत से मेल खाती है:

Juicer >> juiceOf: aString 
    ^(self extractJuiceFrom: (self gather: aString)) withoutSeeds 

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

मेरा सवाल यह है कि क्या ये सुधार भ्रम हैं या नहीं। कंक्रीटली, फ़ारो/स्क्वाक से अनुपस्थित बाइटकोड अनुकूलन हैं क्योंकि उन्हें कम प्रासंगिकता के लिए जाना जाता है, या उन्हें फायदेमंद माना जाता है लेकिन अभी तक उन्हें संबोधित नहीं किया गया है?

संपादित

एक रजिस्टर + ढेर वास्तुकला का उपयोग करने का एक दिलचस्प लाभ [cf. A Smalltalk Virtual Machine Architectural Model एलन विर्फ़्स-ब्रॉक और पैट कैडिल द्वारा] यह है कि रजिस्टरों द्वारा प्रदान की गई अतिरिक्त जगह ऑप्टिमाइज़ेशन के लिए बाइटकोड्स में हेरफेर करना आसान बनाता है। बेशक, भले ही इन प्रकार के अनुकूलन विधि इनलाइनिंग या पॉलिमॉर्फिक इनलाइन कैश के रूप में प्रासंगिक नहीं हैं, जैसा कि नीचे दिए गए उत्तर में बताया गया है, उन्हें विशेष रूप से जब जेआईटी कंपाइलर द्वारा लागू अन्य लोगों के साथ संयुक्त किया जाना चाहिए, तो उन्हें अवहेलना नहीं किया जाना चाहिए। विश्लेषण करने के लिए एक और दिलचस्प विषय यह है कि विनाशकारी ऑप्टिमाइज़ेशन (यानी, जिसे डीबगर का समर्थन करने के लिए डी-ऑप्टिमाइज़ेशन की आवश्यकता होती है) वास्तव में आवश्यक है या पर्याप्त प्रदर्शन लाभ गैर-विनाशकारी तकनीकों द्वारा प्राप्त किया जा सकता है।

उत्तर

4

जब आप इस तरह के अनुकूलन के साथ खेलना शुरू करते हैं तो मुख्य परेशानी डीबगर इंटरफ़ेस है।

ऐतिहासिक और अभी भी वर्तमान में स्क्वाक में, डीबगर बाइटकोड स्तर को अनुकरण कर रहा है और बाइटकोड को संबंधित स्मॉलटाक निर्देश में मैप करने की आवश्यकता है।

तो मुझे लगता है कि जटिलता को न्यायसंगत बनाने के लिए लाभ बहुत कम था, या डीबगिंग सुविधा की भी बदतर गिरावट।

फारो उच्च स्तर (सार सिंटेक्स ट्री) पर काम करने के लिए डीबगर को बदलना चाहता है, लेकिन मुझे नहीं पता कि वे बाइटकोड पर कैसे समाप्त होंगे, जो सभी वीएम जानता है।

आईएमओ, इस प्रकार का अनुकूलन जेआईटी कंपाइलर में बेहतर ढंग से कार्यान्वित किया जा सकता है जो बाइटकोड को मशीन देशी कोड में बदल देता है।

संपादित

सबसे बड़ी लाभ के लिए खुद को भेजता है को नष्ट करने में कर रहे हैं (इनलाइन करने से), क्योंकि वे अधिक महंगी (x10) ढेर संचालन से कर रहे हैं - वहाँ 10 गुना अधिक प्रति सेकंड निष्पादित bytecodes से जब भेजता हैं आप 1 छोटे बेंचमार्क (सीओजी वीएम) का परीक्षण करते हैं।

दिलचस्प बात यह है कि इस तरह के अनुकूलन स्मॉलटॉक छवि में हो सकते हैं, लेकिन सिस्टा प्रयास में वीएम द्वारा पता लगाए गए हॉटस्पॉट पर ही। उदाहरण के लिए देखें https://clementbera.wordpress.com/2014/01/22/the-sista-chronicles-iii-an-intermediate-representation-for-optimizations/

तो, एसआईएसटीए के प्रकाश में, जवाब बल्कि दिलचस्प है, अभी तक संबोधित नहीं है, बल्कि सक्रिय रूप से अध्ययन किया गया है (और प्रगति पर काम करता है)!

विधि को डीबग करने के लिए डी-ऑप्टिमाइज़ करने के लिए सभी मशीनरी अभी भी मुश्किल बिंदुओं में से एक है क्योंकि मैं इसे समझता हूं।

+0

मैं इस बात से सहमत हूं कि लाभ अनुकूलन को लागू करने के लिए आवश्यक जटिलता को उचित नहीं ठहरा सकता है। ध्यान दें कि डिबगिंग करते समय भी आप स्टोर्स को temps में रख सकते हैं और व्याख्या करते समय उन्हें छोड़ सकते हैं। आप जिटर के बारे में भी एक अच्छा मुद्दा बनाते हैं। हालांकि, जिटर अन्य अनुकूलन स्वीकार करता है और उन सभी को एक ही स्थान पर लागू करने में थोड़ा असुविधाजनक हो सकता है। जवाब देने के लिए बहुत धन्यवाद। –

+1

@LeandroCaniglia लाभ तब भी दिलचस्प होता है जब स्टैक ऑप्स की तुलना में अधिक महंगे होते हैं - मेरे संपादन –

+1

@LeandroCaniglia को डिबगिंग के बारे में देखें, कल्पना करें कि मैं अनुकूलित विधि निष्पादित करता हूं, लेकिन एक अनचाहे अपवाद हुआ क्योंकि #extractJuiceFrom: भेज रहा है # फल पर दबाएं और प्रेस समझा नहीं जाता है। Temps फल और रस के मूल्य को प्रदर्शित करने के लिए यह स्पष्ट नहीं है, और क्या होता है यदि मैं किसी अन्य वस्तु के साथ temps असाइन करता हूं, आदि ... –

2

मुझे लगता है कि एक व्यापक प्रश्न उत्तर देने योग्य है: प्रयास के लायक बाइटकोड हैं? बाइटकोड को कोड की कॉम्पैक्ट और पोर्टेबल प्रस्तुति के रूप में सोचा गया था जो लक्ष्य मशीन को बंद कर देता है। इस प्रकार, वे व्याख्या करना आसान है, लेकिन निष्पादित करने में धीमा है।

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

यदि आप जावास्क्रिप्ट (जिसे आज के सबसे आधुनिक कंपाइलर्स माना जा सकता है) और जावा (हॉटस्पॉट, ग्रेइल) के सबसे कुशल वीएम कार्यान्वयन को देखते हैं, तो आप देखेंगे कि वे सभी एक टायर संकलन योजना का उपयोग करते हैं। प्रारंभिक रूप से एएसटी से तरीकों का अर्थ लिया जाता है, और जब वे गर्म स्थान बन जाते हैं तो केवल उत्तेजित होते हैं।

संकलन के सबसे कठिन स्तरों पर कोई बाइटकोड नहीं है। एक कंपाइलर में मुख्य घटक इसका मध्यवर्ती प्रतिनिधित्व है, और बाइटकोड आवश्यक गुणों को पूरा नहीं करते हैं। सबसे अनुकूल आईआर बहुत अधिक दानेदार हैं: वे एसएसए फॉर्म में हैं, और रजिस्टरों और मेमोरी के विशिष्ट प्रतिनिधित्व की अनुमति देते हैं। यह बहुत बेहतर कोड विश्लेषण और अनुकूलन के लिए अनुमति देता है।

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

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

बाइटकोड से संबंधित कोग वीएम के साथ कुछ अच्छे प्रयोग भी हैं। लेकिन जो मैं समझता हूं उससे वे बाइटकोड को ऑप्टिमाइज़ करने के लिए किसी अन्य आईआर में बदल देते हैं, फिर वे बाइटकोड में वापस परिवर्तित होते हैं। मुझे यकीन नहीं है कि अंतिम जेआईटी आर्किटेक्चर का पुन: उपयोग करने के अलावा अंतिम रूपांतरण में तकनीकी लाभ है, या यदि वास्तव में बाइटकोड स्तर पर कोई अनुकूलन है।

+0

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

+0

कंपाइलर और जिटर व्यवसाय में स्वयं होने के नाते, मैं केवल इसकी पुष्टि कर सकता हूं। जिटर को वास्तव में बाइटकोड का विश्लेषण करना है और बेहतर कोड उत्पन्न करने के लिए बाइटकोड एनकोइंग (लूप, सामान्य सबएक्सप्रेस, निरंतर प्रचार, इत्यादि) द्वारा खोई गई बहुत सारी जानकारी का पुनर्निर्माण करना है। – blabla999

+0

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

संबंधित मुद्दे