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