मैं .Net पर नया हूँ और पहले मूल बातें समझने की कोशिश कर रहा हूँ। MSIL और Java बाइटकोड के बीच अंतर क्या है?
मैं .Net पर नया हूँ और पहले मूल बातें समझने की कोशिश कर रहा हूँ। MSIL और Java बाइटकोड के बीच अंतर क्या है?
जवाबों:
पहले मुझे यह कहने दें कि मुझे नहीं लगता कि जावा बाइटकोड और एमएसआईएल के बीच का सूक्ष्म अंतर कुछ ऐसा है जो एक एनओवीटी नेट डेवलपर को परेशान करना चाहिए। वे दोनों एक सार लक्ष्य मशीन को परिभाषित करने के एक ही उद्देश्य की सेवा करते हैं जो अंत में उपयोग की जा रही भौतिक मशीन के ऊपर एक परत है।
MSIL और जावा बाइटकोड बहुत समान हैं, वास्तव में ग्रासहॉपर नामक एक उपकरण है जो जावा बाइटकोड के लिए MSIL का अनुवाद करता है, मैं ग्रासहॉपर के लिए विकास टीम का हिस्सा था ताकि मैं अपना (फीका) ज्ञान थोड़ा साझा कर सकूं। कृपया ध्यान दें कि मैंने इस पर काम करना बंद कर दिया है। जब .NET फ्रेमवर्क 2.0 बाहर आया तो इनमें से कुछ चीजें अधिक सच नहीं हो सकती हैं (यदि ऐसा है तो कृपया एक टिप्पणी छोड़ दें और मैं इसे सही कर दूंगा)।
struct
) के रूप में लागू किया गया है।enums
पूर्णांक प्रकारों के आसपास रैपर से अधिक नहीं है, जबकि जावाenums
बहुत अधिक पूर्ण रूप से विकसित वर्ग हैं ( टिप्पणी के लिए इंटरनेट मित्र के लिए धन्यवाद )।out
और ref
मानकों।अन्य भाषा के अंतर हैं, लेकिन उनमें से अधिकांश बाइट कोड स्तर पर व्यक्त नहीं किए जाते हैं, उदाहरण के लिए यदि मेमोरी जावा के गैर- static
आंतरिक वर्गों (जो कि .NET में मौजूद नहीं है) में कार्य करता है, तो एक बायोटेक सुविधा नहीं है, संकलक एक अतिरिक्त तर्क उत्पन्न करता है। आंतरिक वर्ग के निर्माता और बाहरी वस्तु को पास करते हैं। .NET लैम्ब्डा अभिव्यक्तियों के लिए भी यही सच है।
CIL (MSIL के लिए उचित नाम) और जावा बाइटकोड अलग-अलग होने से अधिक समान हैं। हालांकि कुछ महत्वपूर्ण अंतर हैं:
1) CIL को शुरुआत से ही कई भाषाओं के लिए एक लक्ष्य के रूप में तैयार किया गया था। जैसे, यह एक बहुत समृद्ध प्रकार की प्रणाली का समर्थन करता है जिसमें हस्ताक्षरित और अहस्ताक्षरित प्रकार, मूल्य प्रकार, संकेत, गुण, प्रतिनिधि, घटनाएँ, जेनरिक, एक रूट के साथ एक ऑब्जेक्ट-सिस्टम, और बहुत कुछ शामिल हैं। CIL प्रारंभिक CLR भाषाओं (C # और VB.NET) जैसे वैश्विक कार्यों और टेल-कॉल ऑप्टिमाइज़ेशन के लिए आवश्यक सुविधाओं का समर्थन नहीं करता है । तुलना में, जावा बाइटकोड को जावा भाषा के लिए एक लक्ष्य के रूप में डिज़ाइन किया गया था और यह जावा में पाए जाने वाले कई अवरोधों को दर्शाता है। जावा बाइटकोड का उपयोग करके सी या स्कीम लिखना बहुत कठिन होगा।
2) CIL को मूल पुस्तकालयों और अप्रबंधित कोड में आसानी से एकीकृत करने के लिए डिज़ाइन किया गया था
3) जावा बायटेकोड की व्याख्या या संकलित करने के लिए की गई थी, जबकि CIL को केवल JIT संकलन मानकर डिजाइन किया गया था। उस ने कहा, मोनो के प्रारंभिक कार्यान्वयन ने एक जेआईटी के बजाय एक दुभाषिया का उपयोग किया।
4) CIL को एक मानव पठनीय और लिखने योग्य विधानसभा भाषा के रूप में डिज़ाइन किया गया था ( और निर्दिष्ट किया गया था ) जो सीधे बायोटेक फॉर्म में मैप करता है। मेरा मानना है कि जावा बाइटकोड था (जैसा कि नाम का अर्थ है) केवल मशीन पठनीय होने का मतलब था। बेशक, जावा बाइटकोड को मूल जावा में अपेक्षाकृत आसानी से विघटित किया जाता है और, जैसा कि नीचे दिखाया गया है, यह "असंतुष्ट" भी हो सकता है।
मुझे ध्यान देना चाहिए कि जेवीएम (उनमें से ज्यादातर) सीएलआर (उनमें से किसी भी) की तुलना में अधिक अनुकूलित है। तो, जावा बाइटकोड को लक्षित करने के लिए कच्चा प्रदर्शन एक कारण हो सकता है। हालांकि यह एक कार्यान्वयन विवरण है।
कुछ लोगों का कहना है कि जावा बाइटकोड को बहु-मंच के रूप में डिज़ाइन किया गया था जबकि सीआईएल को केवल विंडोज के लिए डिज़ाइन किया गया था। यह मामला नहीं है। .NET फ्रेमवर्क में कुछ "विंडोज" आइएमएस हैं लेकिन CIL में कोई नहीं हैं।
बिंदु संख्या 4 के उदाहरण के रूप में) ऊपर, मैंने कुछ समय पहले सीआईएल कंपाइलर को एक खिलौना जावा लिखा था। यदि आप इस कंपाइलर को निम्नलिखित जावा प्रोग्राम खिलाते हैं:
class Factorial{
public static void main(String[] a){
System.out.println(new Fac().ComputeFac(10));
}
}
class Fac {
public int ComputeFac(int num){
int num_aux ;
if (num < 1)
num_aux = 1 ;
else
num_aux = num * (this.ComputeFac(num-1)) ;
return num_aux ;
}
}
मेरा कंपाइलर निम्नलिखित CIL को थूक देगा:
.assembly extern mscorlib { }
.assembly 'Factorial' { .ver 0:0:0:0 }
.class private auto ansi beforefieldinit Factorial extends [mscorlib]System.Object
{
.method public static default void main (string[] a) cil managed
{
.entrypoint
.maxstack 16
newobj instance void class Fac::'.ctor'()
ldc.i4 3
callvirt instance int32 class Fac::ComputeFac (int32)
call void class [mscorlib]System.Console::WriteLine(int32)
ret
}
}
.class private Fac extends [mscorlib]System.Object
{
.method public instance default void '.ctor' () cil managed
{
ldarg.0
call instance void object::'.ctor'()
ret
}
.method public int32 ComputeFac(int32 num) cil managed
{
.locals init ( int32 num_aux )
ldarg num
ldc.i4 1
clt
brfalse L1
ldc.i4 1
stloc num_aux
br L2
L1:
ldarg num
ldarg.0
ldarg num
ldc.i4 1
sub
callvirt instance int32 class Fac::ComputeFac (int32)
mul
stloc num_aux
L2:
ldloc num_aux
ret
}
}
यह एक मान्य CIL प्रोग्राम है जिसे CIL असेंबलर में खिलाया जा सकता है जैसे ilasm.exe
कि एक निष्पादन योग्य बनाना। जैसा कि आप देख सकते हैं, CIL पूरी तरह से मानव पठनीय और लिखने योग्य भाषा है। आप किसी भी टेक्स्ट एडिटर में आसानी से मान्य CIL प्रोग्राम बना सकते हैं।
आप javac
कंपाइलर के साथ ऊपर दिए गए जावा प्रोग्राम को भी संकलित कर सकते हैं और फिर परिणामी क्लास फाइल्स javap
को निम्नलिखित प्राप्त करने के लिए "डिस्सेम्बलर" के माध्यम से चला सकते हैं :
class Factorial extends java.lang.Object{
Factorial();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: new #3; //class Fac
6: dup
7: invokespecial #4; //Method Fac."<init>":()V
10: bipush 10
12: invokevirtual #5; //Method Fac.ComputeFac:(I)I
15: invokevirtual #6; //Method java/io/PrintStream.println:(I)V
18: return
}
class Fac extends java.lang.Object{
Fac();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public int ComputeFac(int);
Code:
0: iload_1
1: iconst_1
2: if_icmpge 10
5: iconst_1
6: istore_2
7: goto 20
10: iload_1
11: aload_0
12: iload_1
13: iconst_1
14: isub
15: invokevirtual #2; //Method ComputeFac:(I)I
18: imul
19: istore_2
20: iload_2
21: ireturn
}
javap
निर्गम (मेरी जानकारी के लिए) compilable नहीं है, लेकिन अगर आप इसे कोल इंडिया उत्पादन की तुलना ऊपर आप देख सकते हैं कि दो बहुत समान हैं।
वे अनिवार्य रूप से एक ही काम कर रहे हैं, एमएसआईएल जावा बाइटकोड का माइक्रोसॉफ्ट का संस्करण है।
आंतरिक रूप से मुख्य अंतर हैं:
इस लेख में के जॉन गफ (पोस्टस्क्रिप्ट दस्तावेज़) द्वारा बहुत अधिक जानकारी और एक विस्तृत तुलना पाई जा सकती है।
CIL उर्फ MSIL का उद्देश्य मानव-पठनीय है। जावा बाइटकोड नहीं है।
हार्डवेयर के लिए मशीन कोड के रूप में जावा बाइटकोड के बारे में सोचें जो मौजूद नहीं है (लेकिन जो जेवीएम अनुकरण करते हैं)।
CIL विधानसभा भाषा की तरह अधिक है - मशीन कोड से एक कदम, जबकि अभी भी मानव-पठनीय है।
उतने अंतर नहीं हैं। दोनों आपके द्वारा लिखे गए कोड के मध्यवर्ती प्रारूप हैं। जब निष्पादित किया जाता है, तो वर्चुअल मशीन मध्यवर्ती भाषा को प्रबंधित करेगी, जिसका अर्थ है कि वर्चुअल मशीन चर और कॉल को नियंत्रित करती है। यहां तक कि एक भाषा भी है जिसे मैं अभी याद नहीं करता हूं जो कि .Net और जावा पर उसी तरह चल सकती है।
मूल रूप से, यह उसी चीज़ के लिए सिर्फ एक और प्रारूप है
संपादित करें: भाषा मिली (स्काला के अलावा): यह FAN ( http://www.fandev.org/ ) है, बहुत दिलचस्प लगती है, लेकिन मूल्यांकन करने के लिए अभी तक कोई नहीं
सहमत, मतभेद एक शुरुआत के रूप में अंतर्ग्रहण करने के लिए पर्याप्त हैं। यदि आप मूल बातें से शुरू होने वाले .Net को सीखना चाहते हैं, तो मैं कॉमन लैंग्वेज इंफ्रास्ट्रक्चर और कॉमन टाइप सिस्टम को देखने की सलाह दूंगा।
सर्ज लिडिन ने MSIL: विशेषज्ञ .NET 2.0 आईएल असेंबलर के विवरण पर एक सभ्य पुस्तक लिखी । मैं भी .NET रिफ्लेक्टर और Ildasm (ट्यूटोरियल) का उपयोग करके सरल तरीकों को देखकर MSIL को जल्दी से उठा सकता था ।
MSIL और जावा बाइटकोड के बीच की अवधारणाएं बहुत समान हैं।
मुझे लगता है कि एमएसआईएल को जावा बाइटकोड की तुलना नहीं करनी चाहिए, लेकिन "निर्देश जिसमें जावा बाइटकोड शामिल हैं"।
असंतुष्ट जावा बायटेकोड का कोई नाम नहीं है। "जावा बायटेकोड" एक अनौपचारिक उपनाम होना चाहिए, क्योंकि मुझे आधिकारिक दस्तावेज में इसका नाम नहीं मिला। जावा क्लास फाइल डिस्सेम्बलर कहती है
कक्षा में प्रत्येक विधि के लिए, प्रिंट किए गए कोड, यानी, जावा बाइटकोड सहित निर्देशों को प्रिंट करता है। ये जावा वर्चुअल मशीन स्पेसिफिकेशन में प्रलेखित हैं।
"जावा वीएम निर्देश" और "एमएसआईएल" दोनों को .NET बाइटकोड और जावा कोड में इकट्ठा किया जाता है, जो मानव पठनीय नहीं हैं।