2012-11-14 6 views
13

मुझे आश्चर्य है कि स्कैला बाइट कोड कैसे उत्पन्न कर रहा है, क्या यह एएसएम जैसे कुछ पुस्तकालयों का उपयोग करता है? या बस प्रदर्शन के लिए .class फ़ाइलों में बाइनरी लिखें?स्कैला बाइट कोड उत्पन्न कैसे कर रहा है? एएसएम जैसे कुछ पुस्तकालयों का उपयोग करना, या सीधे बाइनरी लिखना?

उत्तर

28

2.10 स्काला संकलक के साथ शुरू एएसएम 4 का उपयोग करता है बाईटकोड फेंकना, -target समर्थन: JVM-1.5, -target: JVM-1.6, और -target:

बाईटकोड emitter (GenASM, स्रोत नीचे लिंक) एक नियंत्रण फ़्लो ग्राफ़ (CFG) का दौरा एक पिछले चरण द्वारा बनाया के माध्यम से classfiles, और सीधे classfiles फेंकना स्ट्रीमिंग एएसएम API का उपयोग करता:

https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala

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

https://github.com/magarciaEPFL/scala/blob/GenBCodeOpt/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala

+0

स्कैला 2.10 से पहले क्या? – Freewind

+1

2.10 "GenJVM" का उपयोग करने से पहले था। इसे अब तक EOL'd किया गया है। जेनजेवीएम ने इन-हाउस विकसित एक बाइटकोड-मैनिपुलेशन लाइब्रेरी का उपयोग किया (उदाहरण के लिए जेडीके 6 स्टैक मैप फ्रेम के साथ नहीं रखा गया था) –

+0

मैंने इस सवाल को तारांकित किया, लेकिन केवल आपके उत्तर के कारण। महान जानकारी! – Andy

2

लगता है कि वे कुछ मध्यवर्ती कोड जेनरेट कर रहे हैं, और फिर इसे मैन्युअल रूप से जावा बाईटकोड या .net MSIL में परिवर्तित करने

यहाँ संकलक का अच्छा अवलोकन: https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases

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