(Antes de tudo, devo deixar claro que compiladores e máquinas virtuais ( aka ) são um campo completamente desconhecido para mim)
Pelo que entendi, toda vez que um aplicativo Java / C # / ... é executado, uma VM é chamada e converte o código intermediário (bytecode, CIL, etc) nas instruções da máquina.
Mas por que essa operação não pode ser executada apenas uma vez - no momento da instalação?
Respostas:
No caso de Java, a JVM pode fazer otimizações que cruzam os limites da biblioteca. Por exemplo, você pode incorporar um método de uma biblioteca em seu próprio código de cliente. Este tipo de otimização não pôde ser feito em tempo de compilação, porque a biblioteca pode mudar antes da execução. É perfeitamente possível que seu libfoo-1.0 seja substituído pelo libfoo-1.1 sem uma recompilação. Se isso acontecer, as linhas de biblioteca cruzadas feitas em tempo de compilação se tornarão totalmente inválidas.
Ao fazer a otimização apenas em tempo de execução, não há preocupação de que a biblioteca que está sendo alterada sob você invalide as otimizações.
fonte
Porque isso os impede de usar muitos recursos. Por exemplo, como o JIT pode gerar novas instanciações genéricas de DLLs carregadas em tempo de execução? Essas DLLs não existem no momento da instalação.
fonte
Pode e costuma ser, pelo menos com aplicativos .NET. Consulte Gerador de imagens nativas
fonte
Para reformular a pergunta de acordo com o esclarecimento:
Eu vejo os seguintes problemas:
Onde os resultados seriam armazenados? Você não pode assumir que o arquivo que contém o bytecode é gravável; você não deseja inchar a máquina de um desenvolvedor despejando um novo .exe no armazenamento permanente toda vez que ele executa um teste; e se você armazenar o arquivo em armazenamento temporário, ele será perdido na próxima vez que você reiniciar, para não ganhar muito.
Você está trocando uma inicialização um pouco lenta todas as vezes por uma inicialização muito lenta na primeira vez. Não vai deixar uma ótima impressão com o cliente.
Você terá problemas significativos com o carregamento dinâmico de classes.
fonte