можно ли преобразовать MSIL в собственный код Java? - PullRequest
4 голосов
/ 05 августа 2010

Dotnet CLR преобразует код языка в MSIL. В то время как Java Code будет преобразован в Native Code, который не зависит от платформы. Можем ли мы преобразовать этот MSIL в нативный код? Таким образом, Dotnet автоматически станет независимым от платформы.

Ответы [ 3 ]

13 голосов
/ 05 августа 2010

Будьте осторожны с вашей терминологией:

  • CLR не преобразует «код языка» в MSIL - он конвертирует MSIL в собственный код на лету.
  • Java-кодне конвертируется в «собственный код, независимый от платформы»;это оксюморонИсходный код Java преобразуется в независимый от платформы байт-код Java.JVM преобразует байт-код в собственный код так же, как CLR с MSIL (ну, в некоторой степени)

Обратите внимание, что и MSIL, и байт-код могут интерпретироваться ;HotSpot иногда интерпретирует, иногда JIT-компиляцию, а часто JIT-компиляцию несколько раз .CLR .NET для настольных компьютеров всегда JIT компилируется в данный момент один раз.

Стоит также понимать, что байт-код является независимым только от платформы, поскольку JVM доступна для интересующей вас платформы.То же самое верно для MSIL.Вы можете скомпилировать программу на C # в Windows и затем запустить ее в Linux под Mono , если есть сборка Mono для вашей платформы и , если , она не использует библиотеки, которые недоступно в Mono.

Теперь, что касается преобразования MSIL в байт-код Java ... обратное более осуществимо, поскольку MSIL , как правило, более мощный, чем байт-код Java.Например, пользовательские типы значений и обобщенные значения в MSIL не могут быть легко преобразованы в байт-код.Вам, вероятно, понадобится что-то ближе к CLR , написанному на Java .Я смею сказать, что есть некоторые умные возможности, но есть фундаментальные трудности там.Даже обратное вряд ли будет простым - особенно если Java 7 вводит динамический вызов для байт-кода (тогда как динамическая типизация в .NET выполняется DLR просто как библиотека).

1 голос
/ 05 августа 2010

Этот ответ может быть немного оффтоп, но стоит упомянуть.Байт-код MSIL to Java может быть сложным, как это описано другими, отвечающими на вопрос.Но вы можете обрабатывать преобразование из одного фреймворка в другой на уровне исходного кода.

Если у вас есть библиотека Java, которую вы хотели бы использовать в приложении .NET - используйте IKVM .Он компилирует код Java в сборки .NET, используя IKVMC, байт-код Java для транслятора .NET IL.Проверьте условия лицензирования, прежде чем приступить к использованию этого!

Также мне любопытно узнать, возможно ли обратное, то есть исходный код .NET для Java?

0 голосов
/ 05 августа 2010

Я могу ответить на ваш вопрос только частично.

Да, MSIL можно преобразовать в собственный код с помощью ngen.exe .В этом случае, однако, вы теряете способность эффективно работать на разных целевых архитектурах, например, 32-битной или 64-битной.Кроме того, вам нужно создать несколько версий, по одной для каждой целевой платформы.

Кроме этого, я предлагаю использовать ответ Курта.

...