2012-04-01 16 views
15

एक बहु-खिलाड़ी प्रोग्रामिंग गेम के लिए, मैं स्कैला के लिए पृष्ठभूमि संकलन सर्वर पर काम कर रहा हूं जो खिलाड़ियों द्वारा सबमिट किए गए एकाधिक, स्वतंत्र स्रोत पेड़ों के संकलन का समर्थन करता है। मैं Global संकलक वस्तु instantiating द्वारा संकलक पुन: लोड के बिना तेजी से, अनुक्रमिक संकलन चल करने में सफल रहास्कैला संकलक पुनर्विक्रेता है?

val compilerGlobal = new Global(settings, reporter) 

और उसके बाद के माध्यम से मैं अब आदर्श सर्वर parallelize चाहते हैं के माध्यम से

val run = new compilerGlobal.Run 
run.compile(sourceFilePathList) 

व्यक्ति संकलन नौकरियों चल (यानी एकाधिक संकलन एक साथ चलते हैं), लेकिन फिर भी संकलक को पुनः लोड किए बिना (मुख्य रूप से lib को पुनः पार्स करने से बचने के लिए) प्रत्येक बार स्क्रैच से। क्या यह संभव है, यानी ऊपर दिखाया गया दूसरा भाग है (सुरक्षित रूप से :-) पुन: प्रवेशकर्ता, या क्या यह वैश्विक स्थिति धारण करता है? यदि नहीं, तो क्या मैं कुछ और कोशिश कर सकता हूं? मैं वर्तमान में स्कैला 2.9.1 का समर्थन करने पर केंद्रित हूं।

+0

यह शुरुआत के लिए प्रतीक तालिका का 'वैश्विक स्थिति' रखता है। – EJP

+2

कंपाइलर उदाहरणों के पूल का उपयोग करें। – retronym

+0

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

उत्तर

4

हां, कंपाइलर शेयर स्थिति चलाता है, इसलिए आपको उन्हें धागे के बीच साझा नहीं करना चाहिए। यह ग्रहण प्लगइन में आने वाले मुद्दों में से एक है। जैसा कि @EJP ने नोट किया, प्रतीक तालिका साझा की जाती है।

यह आपके मामले में इतना महत्वपूर्ण नहीं है, लेकिन आईडीई में आता है: कंपाइलर प्रकार में आलस्य का उपयोग करता है, जिसका अर्थ है Symbol पर कॉलिंग विधियों के दौरान अतिरिक्त गणना (और उत्परिवर्तन) हो सकता है। दृश्यता के मुद्दों के कारण, यह महत्वपूर्ण है कि इन विधियों को पर उसी थ्रेड पर बनाया गया है, जिसने उन्हें बनाया है।

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