Зачем нам нужен/используем управляемый код (а не собственный)?

Мне не хватает чего-то основного здесь. Какой смысл компилировать исходный язык в байт-код (java) или промежуточный язык (.NET), а затем запускать их внутри JVM или CLR?


При использовании управляемого кода наблюдается снижение производительности (независимо от того, незначительное или значительное), но каковы преимущества? Я знаю, что есть сборка мусора и управление памятью, но даже в этом случае не было бы лучше сразу скомпилировать исходный код в нативный, не нуждаясь в этом промежуточном уровне?

Кроме того (я добавляю это здесь, так как это напрямую связано с вопросом) — по-видимому, универсальные приложения Windows 10 скомпилированы с .NET Native, который компилируется в собственный машинный код. Мне любопытно, почему это не было сделано раньше со всеми программами .NET.


person Aniruddha Varma    schedule 16.10.2015    source источник
comment
Одним из больших преимуществ байт-кода является возможность запускать его в любом случае, когда вы внедрили виртуальную машину. Возможности для этого ограничены в Windows, потому что на самом деле вы ориентируетесь только на несколько архитектур (atom, x86 и т. д.).   -  person Sammy    schedule 16.10.2015
comment
.NET Native НЕ просто компилирует в машинный код, он, по сути, выполняет JIT на ранней стадии, так что его не нужно будет выполнять позже. Это по-прежнему преобразуется в тот же самый машинный код, который был бы во время jit; ваше вопиющее упрощение заставило его звучать так, как будто вы думали, что он волшебным образом стал родным С++.   -  person Krythic    schedule 16.10.2015
comment
@Krythic Понятно. Но это не мой выбор слов, я цитировал упомянутую ссылку (.NET Native).   -  person Aniruddha Varma    schedule 17.10.2015
comment
Крайтик неправильный. Компилятор .NET Native использует тот же набор технологий, что и компилятор Microsoft C++. На самом деле набор технологий генерации кода, используемых для .NET Native, почти полностью отличается от JIT-компиляторов, созданных для наших неродных предложений.   -  person MattWhilden    schedule 20.11.2015


Ответы (5)


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

Рассмотрим случай, когда нет промежуточного языка; вам потребуется разработать и поддерживать компилятор для каждого поддерживаемого языка и для каждой поддерживаемой платформы. Допустим, у вас есть языки L1, L2 и L3 и платформы P1, P2 и P3. Это означает, что вам потребуется разработать и поддерживать 9 различных компиляторов: C1(L1,P1), C2(L1, P2), C3(L1, P3), C4(L2, P1) и т. д.

С другой стороны, наличие промежуточного общего языка I позволяет разрабатывать компиляторы для трех языков C1(L1, I), C2(L2, I) и C3(L3, I) и 3 специфичных для платформы компилятора C4(I, P1), C5(I, P2) и < em>C6(I, P3).

Очевидно, что чем больше у вас поддерживаемых языков и платформ, тем значительнее будет снижение затрат.

Это также дает вам большую гибкость при добавлении поддерживаемых платформ или языков в будущем; любой новый язык L4 потребует разработки только одного компилятора C(L4, I), и вы немедленно поддержите все платформы по цене одной разработки. И наоборот, если у вас есть новая платформа P4, вам нужно будет разработать только C(I, P4) и, бинго, у вас есть L1 , L2 и L3 все работают в P4.

Это в основном беспроигрышная ситуация.

person InBetween    schedule 16.10.2015

Это из MSDN:

Преимущества управляемого кода

Управляемые языки предоставляют обобщенный способ обработки деталей управления памятью и сборки мусора за счет небольших накладных расходов. Этот компромисс освобождает вас от задач, подверженных ошибкам, и позволяет писать более компактные, читабельные и безошибочные программы.

Преимущества неуправляемого кода

Если вы используете неуправляемый язык, такой как C++, вы должны написать дополнительный код для управления памятью и безопасностью, а также очищать объекты после того, как они выполнили свое назначение. Детали обслуживания сложны и не связаны с предполагаемой функцией программы, поэтому разработчики часто пренебрегают этими задачами, игнорируют их или теряют из виду. В результате неуправляемый код зачастую требует больших затрат и времени на тестирование, а также требует большей подготовки и дисциплины программиста.

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

person S.Dav    schedule 16.10.2015
comment
Кажется, вопрос Анируддхи Вармы не касается управляемого/неуправляемого кода. Ему интересно, почему в программе Java/.Net используется промежуточный язык. - person Mango Wong; 16.10.2015

Байт-код и «махинации» с JVM означают, что код всегда интерпретируется одинаково, независимо от платформы, на которой он выполняется. Я помню, как давно читал смутно, что Intel и AMD (а также другие процессоры) выполняют некоторые логические операции по-разному, что приводит к разным результатам на этих процессорах и может привести к некоторым межплатформенным ошибкам. Таким образом, байт-код решает эту проблему, и результат всегда остается постоянным.

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

person The Law    schedule 16.10.2015

Это потому, что компиляция в собственный код сделает вашу программную платформу определенной. Однако при компиляции в качестве промежуточного языка ваша программа является переносимой и может работать на любой платформе, если для нее указана платформа JVM/CLR.

Как Java, так и .Net используют компиляцию Just-in-time, чтобы обеспечить переносимость, но при этом лучшую производительность по сравнению с использованием интерпретатора.

Кроме того, Microsoft уже предоставила Ngen вместе с Visual Studio для компиляции кода .Net в собственный код:
https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx
Основное различие между Ngen и .Net Native заключается в том, что Ngen по-прежнему зависит от .Net Framework, а .Net Native компилирует необходимый код .Net вместе с программой, поэтому установка .Net Framework не требуется.

person Mango Wong    schedule 16.10.2015

В Java, когда генерируется байтовый код, специфичный для определенного типа архитектуры, помогает Java достичь своей способности «компилировать после запуска в любом месте». Кроме того, он занимает очень мало памяти.

person Saif Khan    schedule 16.10.2015