Есть ли реальное преимущество выполнения JIT байт-кода над собственным кодом, помимо возможной реализации независимости платформы?
Очевидно, что языки, которые используют "виртуальные машины" по сравнению с выполнением JIT байт-кода, имеют несколько преимуществ. Но в какой степени это действительно повлияет на обсуждение преимуществ / недостатков нативного кода и выполнения JIT?
Вот список атрибутов, которые я идентифицирую, вопрос в том, в какой степени это относится и к нативному коду - если компилятор его поддерживает ...
Безопасность
Среды выполнения ВМ могут наблюдать за запущенным приложением, например, переполнение буфера.
Итак, первый вопрос: если это делается «средой выполнения», например, библиотекой классов или во время выполнения JIT?
Проверка границ памяти существует также для компиляторов собственного кода. Любые другие / общие ограничения здесь?
Оптимизация
Классическая оптимизация должна быть возможна и в компиляторах нативного кода. См. LLVM, который фактически использует сгенерированный битовый код для запуска оптимизации перед компиляцией в собственный код.
Может быть, что-то вроде динамической оптимизации в JIT, например, определение вещей для оптимизации, связанных с контекстом выполнения. Может быть возможно и для собственного компилятора сгенерировать некоторый код для оптимизации выполнения во время выполнения. Но не знаю, реализовано ли что-то подобное.
Популярные реализации виртуальных машин делают это - вопрос в том, действительно ли это оправдывает реальные преимущества перед нативным кодом.
Threading
Я не вызываю этого, хотя многопоточность в виртуальной машине также зависит от собственной реализации ОС в потоке.
Если мы обнаружим, что нет реального преимущества по сравнению с нативным кодом и что всегда есть недостаток времени выполнения в JIT ... тогда это приводит к следующему вопросу:
Имеет ли смысл разработка операционной системы на основе выполнения JIT (например, Singularity, Cosmos, ...)?
Возможно, я мог бы выделить одно из преимуществ: ОС с таким дизайном не нуждается в MMU. Означает, что нет разделения процессов, которое использует MMU, но есть разделение между объектами / компонентами в программном обеспечении. Но стоит ли это того?
С уважением; -)