>> Ага. Для этого придуман JIT, чтобы хомячки не пользовались "ручником" GCC и make.
> JIT - та же компиляция, только при запуске и каждый раз заново.
> Нафига?Потому что JIT'ится не весь код, а только та часть, которая затребована для выполнения в конкретный момент времени. Это сокращает накладные расходы процессорного времени на полную перекомпиляцию обновившегося ПО, а в случае с Java изначально предполагалось, что ПО будет обновляться достаточно часто (апплеты с сервера загружаются же ж). А теперь так оно и вышло, только вместо апплетов продвигается модульность приложений на уровне отдельных JAR (сначала EJB с EAR, WAR на сервере, потом OSGi и там, и там и т.д.) и непрерывная интеграция-развёртывание ПО в энтерпрайзной инфраструктуре.
C++ приложения просто не угонятся за непрерывным обновлением: только что перекомпилировали Firefox 7.0, как уже пришло обновление до Firefox 7.0.1 — использовать не успеваем, время тратим только на обновления и т.д., в таком же духе. :))
> Один раз скомпилировать и положить в репозиторий нельзя?
Посмотрите на .NET. Там это реализовано, но накой — сами не знают.
Ещё идиотский каскадный стек фреймворков: 2.0/3.0/3.5/4.0, каждый из которых тянет собственные дополнения (некоторые не устанавливаются). Такая система окончательно запутывает пользователя вопросом "Накой столько фреймворков .NET на Windows? Почему нельзя обойтись одним, последней версии?"
> Почти во всех дистрибутивах так делается.
На FreeBSD при обновлении ПО необходимо выполнить полную перекомпиляцию обновлённой программы, а в некоторых случаях и всего ПО от неё зависящего. Для Java такое делать не нужно.
> Если очень хочется отложенной компиляции, можно выполнять ее один раз перед _первым запуском_ на автомате, а в дальнейшем стартовать уже скомпиленное - почему так не делается в JVM?
Разработчики JVM так решили. Кстати, есть AOT JVM, которые выполняют компиляцию байткода в нативный код процессора непосредственно на этапе его загрузки. Такие JVM обычно установлены в мобильных телефонах. ;)
> А если делается, почему потребление памяти традиционно зашкаливает, если оно не должно отличаться от нативных аналогов?
В телефонах ни разу не получал OutOfMemoryError на запущенных приложениях. Может мне просто везло?
На десктопе тоже надо специально ухитриться написать приложение на Java, которое "зашкалит" потребление памяти и не даст другим приложениям спокойно работать.
>> Как раз-таки байткод доступен, подписан, верифицирован и распространяется в качестве приложения
> Подписать можно что угодно, не только байткод. Дебиановские пакеты вон подписываются, и ничего
Подучите теоретическую часть про PKI.