MSIL और जावा बायटेकोड के बीच अंतर?


82

मैं .Net पर नया हूँ और पहले मूल बातें समझने की कोशिश कर रहा हूँ। MSIL और Java बाइटकोड के बीच अंतर क्या है?


संबंधित प्रश्न: stackoverflow.com/questions/453610/…
फ्रैंक V

2
थोड़ा और सामान्य तुलना इस प्रकार है: stackoverflow.com/questions/682608/…
AR

जवाबों:


75

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

MSIL और जावा बाइटकोड बहुत समान हैं, वास्तव में ग्रासहॉपर नामक एक उपकरण है जो जावा बाइटकोड के लिए MSIL का अनुवाद करता है, मैं ग्रासहॉपर के लिए विकास टीम का हिस्सा था ताकि मैं अपना (फीका) ज्ञान थोड़ा साझा कर सकूं। कृपया ध्यान दें कि मैंने इस पर काम करना बंद कर दिया है। जब .NET फ्रेमवर्क 2.0 बाहर आया तो इनमें से कुछ चीजें अधिक सच नहीं हो सकती हैं (यदि ऐसा है तो कृपया एक टिप्पणी छोड़ दें और मैं इसे सही कर दूंगा)।

  • .NET उन उपयोगकर्ता परिभाषित प्रकारों को अनुमति देता है जिनके पास नियमित संदर्भ शब्दार्थ ( struct) के रूप में लागू किया गया है।
  • .NET अहस्ताक्षरित प्रकारों का समर्थन करता है, यह अनुदेश को थोड़ा समृद्ध बनाता है।
  • जावा में बाइटकोड में विधियों का अपवाद विनिर्देश शामिल है। हालांकि अपवाद विनिर्देश आमतौर पर केवल कंपाइलर द्वारा लागू किया जाता है, यह JVM द्वारा लागू किया जा सकता है यदि कोई क्लास लोडर डिफ़ॉल्ट के अलावा अन्य उपयोग किया जाता है।
  • .NET जेनरिक को IL में व्यक्त किया जाता है जबकि जावा जेनरिक केवल टाइप इरेज़र का उपयोग करते हैं ।
  • .NET विशेषताओं का जावा में कोई समकक्ष नहीं है (क्या यह अभी भी सच है?)।
  • .NET enumsपूर्णांक प्रकारों के आसपास रैपर से अधिक नहीं है, जबकि जावाenums बहुत अधिक पूर्ण रूप से विकसित वर्ग हैं ( टिप्पणी के लिए इंटरनेट मित्र के लिए धन्यवाद )।
  • नेट है outऔर refमानकों।

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


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

@Oak: जावा एनोटेशन केवल डेटा पास करने की अनुमति देता है, जबकि .NET विशेषताएँ पूरी तरह से संचालित कक्षाएं हैं, जिनमें तर्क हो सकते हैं और, सबसे महत्वपूर्ण बात, इंटरफेस को लागू करना।
फ्योडोर सोइकिन

बाइटकोड में भी हर तरह के रिटर्न टाइप के लिए अलग-अलग रिटर्न निर्देश हैं, डननो अगर यह वास्तव में टाइप सेफ्टी में सहायक है।
सेसिल डिशवॉशर

1
यह तथ्य कि .NET में मूल्य प्रकार कभी-कभी स्टैक पर आवंटित किए जा सकते हैं, इस तथ्य की तुलना में तुच्छ महत्व है कि उनके पास मूल्य शब्दार्थ है ; प्रत्येक मान प्रकार के स्टोरेज स्थान है एक उदाहरण। इसके विपरीत, जावा में प्रत्येक भंडारण स्थान या तो एक आदिम या एक उचित वस्तु संदर्भ है; अन्य प्रकार नहीं हैं।
सुपरकैट

1
सोच रहा था कि वे प्रदर्शन की तुलना कैसे करें? क्या MSIL की व्याख्या तेजी से हो रही है, उदाहरण के लिए bytecode?
ल्यूक टी ओ'ब्रायन

23

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 नहीं है, लेकिन अगर आप इसे कोल इंडिया उत्पादन की तुलना ऊपर आप देख सकते हैं कि दो बहुत समान हैं।


2
यह पता चलता है कि मानव पठनीय / लिखने योग्य जावा असेंबली भाषा बनाने के प्रयास किए गए हैं। दो जो मैंने पाया है वे
जस्टिन

2
मैंने एक यहाँ लिखा है जो बहुत बेहतर है। जैस्मीन के विपरीत, यह किसी भी वैध क्लासफाइल को अलग करने और आश्वस्त करने में सक्षम होने के लिए डिज़ाइन किया गया है। github.com/Storyyeller/Krakatau । मुझे लगता है कि यह कहना अधिक सटीक होगा कि Microsoft एक मानक कोडांतरक प्रदान करता है जबकि जावा कोडर्स को अपना बनाना होता है।
एंटीमनी

22

वे अनिवार्य रूप से एक ही काम कर रहे हैं, एमएसआईएल जावा बाइटकोड का माइक्रोसॉफ्ट का संस्करण है।

आंतरिक रूप से मुख्य अंतर हैं:

  1. बाइटकोड को संकलन और व्याख्या दोनों के लिए विकसित किया गया था, जबकि एमएसआईएल को जेआईटी संकलन के लिए स्पष्ट रूप से विकसित किया गया था
  2. MSIL को कई भाषाओं (C # और VB.NET इत्यादि) का समर्थन करने के लिए विकसित किया गया था। Bytecode को सिर्फ जावा के लिए लिखा जा रहा था, जिसके परिणामस्वरूप Bytecode IL की तुलना में जावा से अधिक समान है। किसी भी विशिष्ट .NET भाषा के लिए है
  3. मूल्य और संदर्भ प्रकारों के बीच MSIL में अधिक स्पष्ट परिसीमन है

इस लेख में के जॉन गफ (पोस्टस्क्रिप्ट दस्तावेज़) द्वारा बहुत अधिक जानकारी और एक विस्तृत तुलना पाई जा सकती है।


1. "बीटबॉडी को संकलन और व्याख्या दोनों के लिए विकसित किया गया था, जबकि एमएसआईएल को स्पष्ट रूप से जेआईटी संकलन के लिए विकसित किया गया था" - इस बारे में बात करते हुए कि जावा कोड कैसे बायटेकोड के लिए संकलित हो जाता है और यह कि बायटेकोड की व्याख्या हो जाती है। क्या मैं सही हूँ? क्या MSIL को निष्पादित करने के लिए व्याख्या नहीं मिलती है?
अब्दुल

2

CIL उर्फ ​​MSIL का उद्देश्य मानव-पठनीय है। जावा बाइटकोड नहीं है।

हार्डवेयर के लिए मशीन कोड के रूप में जावा बाइटकोड के बारे में सोचें जो मौजूद नहीं है (लेकिन जो जेवीएम अनुकरण करते हैं)।

CIL विधानसभा भाषा की तरह अधिक है - मशीन कोड से एक कदम, जबकि अभी भी मानव-पठनीय है।


जब तक आपके पास एक हेक्स संपादक है तब तक बायटेकोड वास्तव में बहुत पठनीय है। यह कक्षाओं और विधियों के प्रत्यक्ष प्रतिनिधित्व के लिए एक्सटेंशन के साथ एक बहुत ही सरल स्टैक-आधारित भाषा है। मुझे लगा कि एमएसआईएल निचले स्तर (जैसे रजिस्टर) है?
डैनियल स्पिवक

en.wikibooks.org/wiki/… en.wikibooks.org/wiki/… एक कच्चा CIL है। अन्य असंतुष्ट बाइट कोड है। यदि आप हेक्स को पछाड़ते हैं तो बायटेकोड यथोचित रूप से पठनीय हो सकता है, लेकिन यह एक डिज़ाइन उद्देश्य नहीं है।
स्लिम

"डिस्सैम्बल्ड" वास्तव में इसके लिए गलत शब्द है। "डी-एनकोडेड" हो सकता है। बाइटकोड केवल कॉम्पैक्टनेस के लिए .class फ़ाइलों में अपठनीय है। जावप के मैन पेज के विपरीत, संकलित कक्षा से पठनीय बायटेकोड के उत्पादन में कोई असंबद्धता नहीं है।
डैनियल स्पिवक

2

उतने अंतर नहीं हैं। दोनों आपके द्वारा लिखे गए कोड के मध्यवर्ती प्रारूप हैं। जब निष्पादित किया जाता है, तो वर्चुअल मशीन मध्यवर्ती भाषा को प्रबंधित करेगी, जिसका अर्थ है कि वर्चुअल मशीन चर और कॉल को नियंत्रित करती है। यहां तक ​​कि एक भाषा भी है जिसे मैं अभी याद नहीं करता हूं जो कि .Net और जावा पर उसी तरह चल सकती है।

मूल रूप से, यह उसी चीज़ के लिए सिर्फ एक और प्रारूप है

संपादित करें: भाषा मिली (स्काला के अलावा): यह FAN ( http://www.fandev.org/ ) है, बहुत दिलचस्प लगती है, लेकिन मूल्यांकन करने के लिए अभी तक कोई नहीं


स्केले को क्रमशः JTEM या CLR को लक्षित करने के लिए संकलित किया जा सकता है, जिससे क्रमशः बायोटकोड या MSIL उत्पन्न होता है।
डैनियल स्पिवक

यह जानने के लिए अच्छा है, लेकिन मुझे एक महीने पहले एक और भाषा मिली जब डीज़ोन पढ़ते हुए: यह मिला! मेरी पोस्ट का संपादन देखें
GHAD

1

सहमत, मतभेद एक शुरुआत के रूप में अंतर्ग्रहण करने के लिए पर्याप्त हैं। यदि आप मूल बातें से शुरू होने वाले .Net को सीखना चाहते हैं, तो मैं कॉमन लैंग्वेज इंफ्रास्ट्रक्चर और कॉमन टाइप सिस्टम को देखने की सलाह दूंगा।


1

सर्ज लिडिन ने MSIL: विशेषज्ञ .NET 2.0 आईएल असेंबलर के विवरण पर एक सभ्य पुस्तक लिखी । मैं भी .NET रिफ्लेक्टर और Ildasm (ट्यूटोरियल) का उपयोग करके सरल तरीकों को देखकर MSIL को जल्दी से उठा सकता था ।

MSIL और जावा बाइटकोड के बीच की अवधारणाएं बहुत समान हैं।


1

मुझे लगता है कि एमएसआईएल को जावा बाइटकोड की तुलना नहीं करनी चाहिए, लेकिन "निर्देश जिसमें जावा बाइटकोड शामिल हैं"।

असंतुष्ट जावा बायटेकोड का कोई नाम नहीं है। "जावा बायटेकोड" एक अनौपचारिक उपनाम होना चाहिए, क्योंकि मुझे आधिकारिक दस्तावेज में इसका नाम नहीं मिला। जावा क्लास फाइल डिस्सेम्बलर कहती है

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

"जावा वीएम निर्देश" और "एमएसआईएल" दोनों को .NET बाइटकोड और जावा कोड में इकट्ठा किया जाता है, जो मानव पठनीय नहीं हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.