2010-11-29 11 views
9

स्कैला कंपाइलर सीधे जावा बाइट कोड (या .NET CIL) को संकलित करता है। स्कैला की कुछ विशेषताओं को सीधे जावा में फिर से किया जा सकता है (उदाहरण के लिए समझ, कक्षाओं, अज्ञात/आंतरिक फ़ंक्शनसी आदि का अनुवाद करना)। ऐसी विशेषताएं क्या हैं जिनका अनुवाद इस तरह से नहीं किया जा सकता है?जावा में स्कैला की कौन सी विशेषताओं का अनुवाद नहीं किया जा सकता है?

शायद शैक्षिक ब्याज की ज्यादातर है। अधिक उपयोगी रूप से, शायद, स्कैला की मुख्य विशेषताएं या मुहावरे क्या हैं जिनका उपयोग आप जावा में आसानी से नहीं कर सकते हैं?

क्या कोई अन्य तरीका है? चीजें जिन्हें जावा में सीधे किया जा सकता है जिनके पास स्कैला में कोई सीधा समकक्ष नहीं है? जावा में मुहावरे जो अनुवाद नहीं करते हैं?

+0

अच्छे उत्तरों के साथ अच्छा प्रश्न। ऐसा लगता है कि स्कैला को जावा से तुलना करके, लोगों को अंततः यह मिलता है कि _all_ भाषाएं समान रूप से शक्तिशाली हैं लेकिन अलग-अलग अवशेषों की पेशकश करती हैं जिनमें अलग-अलग (डी) फायदे हैं। – Raphael

उत्तर

10

यह प्रश्न, मेरी राय में, हमारे जेनरेट किए गए बाइटकोड को देखकर हमें JVM भाषाओं की तुलना करने के लिए कहकर इस बिंदु को याद करता है।

स्काला जावा-बराबर बाईटकोड को संकलित करता है। यही है, बाइटकोड जावा में लिखे गए कोड द्वारा उत्पन्न किया जा सकता था। दरअसल आप एक इंटरमीडिएट फॉर्म आउटपुट करने के लिए scalac भी प्राप्त कर सकते हैं जो जावा की तरह दिखता है।

सभी आदि लक्षण (स्थिर भाड़ा के माध्यम से), गैर स्थानीय रिटर्न (अपवाद के माध्यम से) जैसी सुविधाओं, आलसी मूल्यों (संदर्भ) के माध्यम से हालांकि संभवतः एक सबसे बदसूरत ढंग से, सभी एक जावा प्रोग्राम द्वारा व्यक्त कर रहे हैं!

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

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

class Foo[M[_], A](m : M[A]) 
trait Bar[+A] 

ये अवधारणा, कि M एक प्रकार पैरामीटर जो अपने आप में मानकों टाइप है या कि Bar covariant है, बस जावा देश में मौजूद नहीं हैं।

+0

मैंने सोचा होगा कि यह अनिवार्य रूप से मामला नहीं है कि सभी जावा बाइट कोड possibilites जावा स्रोत प्रोग्राम से उत्पन्न किया जा सकता है? इस प्रकार ऐसे मामले हो सकते हैं जो स्कालैक उस जावैक कैनोट को उत्पन्न कर सकते हैं, और इसके विपरीत। –

+0

यह सच है लेकिन स्कैला ने विशेष रूप से * नहीं * इस मार्ग को लिया है। लगभग सभी बाइट कि स्काला उत्सर्जित जावा प्रोग्राम से उत्सर्जित हो सकते थे। लेकिन मौलिक बिंदु यह है कि यह * बाइट्स * नहीं है जो स्कैला को परिभाषित करता है और –

+0

आपके लिए क्या स्केल कर सकता है। मैं मतभेदों के बारे में उत्सुक हूं, फिर भी (पृष्ठभूमि: मुझे पता है (बहुत) छोटा जावा, और मैं स्कैला सीख रहा हूं। मुझे अब तक स्कैला के बारे में पता है, लेकिन मुझे आश्चर्य है कि मैं कितना निराशा कर रहा हूं जब जावा पर लौटने के लिए। ऐसा लगता है जब मैंने लिस्प को सीखा - जिसने मैंने सभी भाषाओं में लिखा था, लेकिन लिस्पी में कुछ चीजें सी –

11

लक्षण एक ऐसी चीज हैं जो समकक्ष नहीं है। लक्षण उनमें कोड के साथ इंटरफेस हैं। आप उन सभी वर्गों में कोड कॉपी कर सकते हैं जिनमें एक विशेषता है जिसमें मिश्रित है, लेकिन यह वही बात नहीं है।

भी मेरा मानना ​​है कि स्केला प्रकार प्रणाली अधिक पूरा हो गया है। हालांकि यह अंततः जेवीएम प्रकारों को मैप करेगा (वास्तव में मिटाएगा)। आप स्काला प्रकार प्रणाली में कुछ चीजें व्यक्त कर सकते हैं जो जावा में संभव नहीं हो सकता है (जैसे भिन्नताएं)।

4

मुझे लगता है कि, वहाँ कोई बराबर गतिशील रूप से कुछ लक्षण में मिश्रण के लिए है। स्काला में आप समय में जोड़ सकते हैं आप नई वस्तुओं बना रहे हैं कुछ लक्षण है, जिसमें।

उदाहरण के लिए मिलाया जाता है, हम एक कुत्ता जो भूख और प्यास है और एक कुत्ता जो सिर्फ भूख लगी है बनाएँ।

val hungryThirstyDog = new Dog with Hungry with Thirsty 
val onlyHungryDog = new Dog with Hungry 

मुझे जावा में ऐसा करने के बराबर तरीका नहीं पता है। जावा में, विरासत स्थैतिक रूप से परिभाषित किया गया है।

+0

क्या किसी अन्य तकनीक का उपयोग कर जावा में एक ही डिजाइन समस्या को हल करने का कोई तरीका है? –

+0

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

+0

मैं सभी शर्तों को परिभाषित करने के मार्ग पर नहीं जा रहा हूं। मुझे लगता है कि पाठक व्याख्या कर सकते हैं। जवाब के लिए धन्यवाद। –

4

लागू रूपांतरणों में जावा में सीधा समतुल्य नहीं है।

+0

लेकिन संभावित रूप से स्पष्ट किए जा सकते हैं? तो अभिव्यक्ति में अंतर के बजाय यह एक सुविधा (सुनिश्चित करने के लिए एक उपयोगी) है। मुझे यह जानने में दिलचस्पी है कि किस हद तक स्काला आपको "स्वाभाविक रूप से" (प्राकृतिक "के कुछ मूल्यों के लिए) –

+1

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

+0

हां, अच्छी टिप्पणी। मुझे स्कैला के बारे में भी यह पता चल रहा है । –

4

स्केल की एक विशेषता जिसे मैंने अच्छा उपयोग किया है के माध्यम से प्रकार का संशोधन प्रकट करता है। चूंकि जेवीएम जेनेरिक से सभी प्रकार की जानकारी को स्ट्रिप्स करता है, इसलिए स्कैला आपको इस जानकारी को चर में संरक्षित करने की अनुमति देता है। यह ऐसा कुछ है जो जावा प्रतिबिंब AFAIK संभाल नहीं सकता है, क्योंकि बाइटकोड में प्रकारों के लिए कोई तर्क नहीं है।

मुझे जिस मामले की आवश्यकता थी वह List के प्रकार पर पैटर्न मिलान था। यह है, मेरे पास VertexBuffer ऑब्जेक्ट था जो GPU पर डेटा संग्रहीत करता था, जिसे फ़्लोट या पूर्णांक की सूची से बनाया जा सकता था। अधिक जानकारी के साथ एक ब्लॉग पोस्ट करने के लिए

class VertexBuffer[T](data:List[T])(implicit m:Manifest[T]) { 
    m.toString.match { 
    case "float" => ... 
    case "int" => ... 
    } 
} 

This link लिंक: प्रकट कोड इस तरह लगभग देखा।

अधिक जानकारी के साथ बहुत सारे SO पृष्ठ हैं, जैसे this one

+0

बेशक, आपको कॉलर को जावा में 'कक्षा ' स्पष्ट रूप से पास करने की आवश्यकता हो सकती है। –

+0

या किसी भी पहचानकर्ता की तरह एक पहचानकर्ता। स्कैला क्लीनर है, लेकिन मुझे लगता है कि यह एक बड़ा अंतर नहीं है। – nullspace

3

तीन शब्द: उच्च प्रकार के प्रकार।

0

आपका विषय स्पष्ट नहीं है कि आपका मतलब जावा जावा या जावा भाषा है। यह देखते हुए कि स्कैला JVM पर चलता है, क्यू को कोई समझ नहीं आता है, क्योंकि हम सभी जानते हैं कि स्कैला JVM पर चलता है।

+0

मुझे लगता है कि यह पहले से ही स्पष्ट है, लेकिन स्पष्टता के लिए मेरा मतलब है जावा भाषा –

+0

फिर परिभाषा के अनुसार जावा में किसी भी स्केल निर्माण को व्यक्त करना संभव है, भले ही बोइटरप्लेट और शोर के बहुत सारे हों। –

+1

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

0

स्कैला के पास XML के लिए "मूल" समर्थन है। आप एक्सएमएल बना सकते हैं, तत्व ढूंढ सकते हैं, सीधे स्कैला कोड में मेल खाते हैं।

उदाहरण: http://programming-scala.labs.oreilly.com/ch10.html

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

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