Различия между MSIL и Java байт-кодом?

Я новичок в .Net и сначала пытаюсь понять основы. В чем разница между MSIL и Java-байт-кодом?

74 голоса | спросил user18055 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 22:13:34 +0400 2008, 22:13:34

7 ответов


0

Прежде всего позвольте мне сказать, что я не думаю, что тонкие различия между байт-кодом Java и MSIL - это то, что должно беспокоить начинающего разработчика .NET. Они оба служат одной и той же цели определения абстрактной целевой машины, которая является слоем над физической машиной, используемой в конце.

MSIL и Java-байт-код очень похожи, на самом деле есть инструмент под названием Grasshopper , который переводит MSIL в байт-код Java, я был частью команды разработчиков для Grasshopper, поэтому я могу поделиться некоторыми своими (блеклыми) знаниями. Обратите внимание, что я прекратил работать над этим, когда вышел .NET Framework 2.0, поэтому некоторые из этих вещей могут больше не соответствовать действительности (если так, пожалуйста, оставьте комментарий, и я исправлю его).

  • .NET допускает пользовательские типы, которые имеют семантику значений в сравнении с обычной ссылочной семантикой (struct ).
  • .NET поддерживает неподписанные типы, что делает набор команд немного более насыщенным.
  • Java включает спецификацию исключений методов в байт-код. Хотя спецификация исключений обычно применяется только компилятором, она может применяться JVM, если используется загрузчик классов, отличный от загрузчика по умолчанию.
  • Обобщения .NET выражены в IL, в то время как в обобщениях Java используется только стирание типов .
  • .NET-атрибуты не имеют эквивалента в Java (это все еще верно?).
  • .NET enums не намного больше, чем обертки для целочисленных типов, в то время как Java enums это в значительной степени полноценные классы (спасибо Интернет-другу за комментирование).
  • .NET имеет out и ref параметры.

Существуют и другие языковые различия, но большинство из них не выражены на уровне байтового кода, например, если память обслуживает не-static Внутренние классы (которых нет в .NET) не являются функцией байт-кода, компилятор генерирует дополнительный аргумент для конструктора внутреннего класса и передает внешний объект. То же самое верно для лямбда-выражений .NET.

ответил Motti 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 23:27:22 +0400 2008, 23:27:22
0

По сути, они делают то же самое, MSIL - это версия байт-кода Java от Microsoft.

Основные различия внутри:

  1. Байт-код был разработан как для компиляции, так и для интерпретации, а MSIL был разработан специально для JIT-компиляции
  2. MSIL был разработан для поддержки нескольких языков (C # и VB.NET и т. д.) по сравнению с написанием байт-кода только для Java, в результате чего байт-код более синтаксически похож на Java, чем на IL для любого конкретного языка .NET
  3. MSIL имеет более четкое разграничение между значениями и ссылочными типами

Много дополнительной информации и подробное сравнение можно найти в эта статья К. Джона Гофа (постскриптумный документ)

ответил Guy Starbuck 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 22:29:14 +0400 2008, 22:29:14
0

CIL (собственное имя для MSIL) и байт-код Java больше похожи, чем отличаются. Хотя есть некоторые важные различия:

1) CIL был разработан с самого начала, чтобы служить целью для нескольких языков. Таким образом, он поддерживает гораздо более богатую систему типов, включая подписанные и неподписанные типы, типы значений, указатели, свойства, делегаты, события, обобщения, объектную систему с одним корнем и многое другое. CIL поддерживает функции, которые не требуются для исходных языков CLR (C # и VB.NET), такие как глобальные функции и оптимизация хвостовых вызовов , Для сравнения, байт-код Java был задуман как цель для языка Java и отражает многие ограничения, найденные в самой Java. Было бы намного сложнее написать C или Scheme с использованием байт-кода Java.

2) CIL был разработан для легкой интеграции в нативные библиотеки и неуправляемый код

3) Байт-код Java был разработан для интерпретации или компиляции, в то время как CIL был спроектирован только с использованием JIT-компиляции. Тем не менее, первоначальная реализация Mono использовала интерпретатор вместо JIT.

4) CIL был спроектирован ( и указан ) для чтения и восприятия человеком. доступная для записи форма на ассемблере, которая отображается непосредственно в форму байт-кода. Я считаю, что байт-код Java (как следует из названия) должен был быть только машиночитаемым. Конечно, байт-код Java относительно легко декомпилируется обратно в исходную Java и, как показано ниже, он также может быть «разобран».

Я должен отметить, что JVM (большинство из них) более высоко оптимизирована, чем CLR (любой из них). Таким образом, необработанная производительность может быть причиной предпочтения ориентации на байт-код Java. Это деталь реализации, хотя.

Некоторые люди говорят, что байт-код Java был разработан, чтобы быть мультиплатформенным, в то время как CIL был разработан только для Windows. Это не вариант. В .NET Framework есть некоторые "Windows" измы, но в CIL их нет.

Как пример пункта 4) выше, я написал игрушечный компилятор Java для CIL некоторое время назад. Если вы кормите этот компилятор следующей программой Java:

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 в любом текстовом редакторе.

Вы также можете скомпилировать приведенную выше Java-программу с помощью компилятора 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 не компилируется (насколько мне известно), но если вы сравните его с выводом CIL выше, вы увидите, что два очень похожи.

ответил Justin 6 FebruaryEurope/MoscowbMon, 06 Feb 2012 07:15:52 +0400000000amMon, 06 Feb 2012 07:15:52 +040012 2012, 07:15:52
0

Отличий не так много. Оба являются промежуточными форматами кода, который вы написали. При выполнении Виртуальные машины будут выполнять промежуточный язык, которым управляют, что означает, что Виртуальная машина управляет переменными и вызовами. Есть даже язык, который я сейчас не помню, который может работать в .Net и Java одинаково.

По сути, это просто другой формат для той же вещи

Изменить. Найден язык (кроме Scala). Это FAN /a>), выглядит очень интересно, но пока нет времени оценивать

ответил GHad 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 22:17:52 +0400 2008, 22:17:52
0

Согласен, различия достаточно малы, чтобы воспринимать как новичка. Если вы хотите изучать .Net, начиная с основ, я бы рекомендовал взглянуть на Common Language Infrastructure и Common Type System.

ответил Internet Friend 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 22:22:27 +0400 2008, 22:22:27
0

Серж Лидин написал хорошую книгу о деталях MSIL: Expert .NET 2.0 IL Assembler . Я также смог быстро получить MSIL, посмотрев на простые методы с помощью .NET Reflector и Ildasm (учебное пособие) .

Концепции между MSIL и Java-байт-кодом очень похожи.

ответил Jeffrey LeCours 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 22:23:36 +0400 2008, 22:23:36
0

Я думаю, что MSIL следует сравнивать не с байт-кодом Java, а с «инструкцией, которая содержит байт-коды Java».

Имя дизассемблированного Java-байт-кода отсутствует. «Java Bytecode» должен быть неофициальным псевдонимом, так как я не могу найти его название в официальном документе. скажем, дизассемблер файлов классов Java р>

  

Распечатывает дизассемблированный код, то есть инструкции, которые содержат байтовые коды Java, для каждого из методов в классе. Они описаны в Спецификации виртуальной машины Java.

«Инструкции Java VM» и «MSIL» собраны в байт-код .NET и код Java, которые не читаются человеком.

ответил Dennis C 30 72008vEurope/Moscow11bEurope/MoscowSun, 30 Nov 2008 14:26:35 +0300 2008, 14:26:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132