C # против JAVA. Какая польза от интерпретации байт-кода Java по сравнению с JITing?

Я читал это сравнение между JAVA и C # и меня заинтересовал этот оператор:

ПРИМЕЧАНИЕ. В то время как платформа Java поддерживает интерпретацию байтового кода или байтового кода, который выполняется JIT, а затем выполняется в исходном режиме, платформа .NET поддерживает только собственное выполнение кода C #, поскольку код IL всегда компилируется в исходном коде перед запуском.

Было ли это чисто маркетинговым ходом со стороны Microsoft, чтобы заставить сложить развертывание C # в ОС, отличных от Windows, или Обеспечивает ли это какое-то преимущество, такое как производительность или безопасность?


person Charlie    schedule 18.09.2015    source источник
comment
C # несложно развернуть в других ОС (развернут не C #, а вывод компилятора MSIL), и его легко запустить с моно в других ОС. На самом деле речь идет не о маркетинге, а о производительности: чем ближе вы к металлу, тем быстрее работает программа. В любом случае, MSIL не подвергается JIT-компиляции до времени выполнения, поэтому он должен пройти через интерпретатор по крайней мере один раз, прежде чем его JIT-код станет родным.   -  person Ron Beyer    schedule 18.09.2015
comment
Вопрос в обратном направлении. Вы говорите, что в Java есть функция, а в .NET ее нет. В чем убедительное преимущество .NET, не имеющего этой функции? На этот вопрос невозможно ответить; Отсутствие функции не дает преимуществ, скорее, это экономит затраты. Лучше спросить, что было такого привлекательного в этой функции, что команда разработчиков Java решила потратить время и усилия на ее реализацию?   -  person Eric Lippert    schedule 18.09.2015
comment
Чтобы подкрепить то, что сказал @RonBeyer, важным моментом в цитате является то, что платформа .NET поддерживает только собственное выполнение кода C #, потому что код IL всегда компилируется изначально. C # (как язык) не зависит от этого ограничения.   -  person Michael    schedule 18.09.2015
comment
@Charlie Кстати, вы знали, что это сравнение 14-летней давности?   -  person Michael    schedule 18.09.2015
comment
Вы спрашиваете, почему C # поддерживает только JIT-компиляцию, когда Java также поддерживает интерпретацию, или вы спрашиваете, почему C # вообще беспокоится о JIT-компиляции, когда вместо нее можно использовать AOT-компиляцию?   -  person Theodoros Chatzigiannakis    schedule 18.09.2015
comment
@EricLippert. Вы правы - я действительно не понимал, была ли возможность интерпретировать без JITing особенностью или недостатком. Теперь я думаю, что это особенность, которой, вероятно, трудно воспользоваться, и, вероятно, в большинстве случаев она даже не имеет большого значения.   -  person Charlie    schedule 18.09.2015
comment
@TheodorosChatzigiannakis Мне любопытно, почему сейчас произошел переход от JIT к AOT, но нет, это не то, о чем я изначально спрашивал.   -  person Charlie    schedule 18.09.2015
comment
@RonBeyer Я согласен и оговорился. Изначально меня смущало, относится ли собственная компиляция к материалам, включенным в EXE, помимо MSIL, зависящей от платформы. Я понимаю, что Java обрабатывает это по-другому, но приведенные выше комментарии помогли мне понять, что это не связано с этой концепцией интерпретации без JIT.   -  person Charlie    schedule 18.09.2015
comment
@Mikaveli Я был бы заинтересован в более недавнем сравнении Java и C #, если вы его знаете.   -  person Charlie    schedule 18.09.2015
comment
Это неправда. Микрофреймворк (.Net MF) использует интерпретатор. По крайней мере, на моих гаджетерных устройствах   -  person adrianm    schedule 18.09.2015
comment
@adrianm Я бы сказал, что .NET MF является исключением, говоря об этой теме, это специализированная версия .NET, предназначенная для работы на MCU. Любой тип системы Javascript для MCU будет иметь ту же проблему. Я бы проигнорировал нестандартные реализации для подобных обсуждений.   -  person Ron Beyer    schedule 19.09.2015


Ответы (1)


При подходе точно вовремя байтовый код переводится в машинный код во время первого выполнения. Компиляция непосредственно перед выполнением требует больше времени, поэтому в первый раз метод выполняется медленнее, чем во второй раз. .Net компилирует всю программу только один раз. Таким образом, в первый раз этап выполнения сокращается, потому что нет задержек из-за компиляции. Разница только в том, что код выполняется в первый раз, поэтому чем больше раз код выполняется, тем больше и больше два подхода становятся похожими с точки зрения скорости.

person xcesco    schedule 18.09.2015
comment
Также кажется, что в первый раз для .NET происходит задержка, когда он должен скомпилироваться, что является всей сутью AOT, поэтому я не думаю, что часть вашего ответа верна. - person Charlie; 18.09.2015
comment
Ваш ответ также помог мне обнаружить, что JVM, такая как Hotspot, может позволить коду запускаться быстрее при первом запуске с помощью интерпретатора, который со временем будет работать медленнее, но затем он может переключить оптимизированный скомпилированный код. при повторном запуске см. stackoverflow.com/questions/14907968/ - person Charlie; 18.09.2015