As notas seguintes foram obtidas de várias fontes, pricipalmente de fontes oficiais, como as documentação da Sun e vários livros da especialidade, mas o que mais influenciou o texto, tendo mesmo dado origem às frases usadas nas perguntas, foram as FAQs escritas por Jeff Kesselman, que tal como o autor deste artigo, se fartou um pouco de ver sempre as mesmas perguntas, ideias e concepções erradas sobre Java.
A performance do código interpretado é mais que adequada à maioria das situações, e o código intermédio gerado, o bytecode, é criado com a compilação nativa em mente. Para aquelas onde alguma performance extra é necessária, o código interpretado pode ser compilado para a plataforma onde está a ser executado, tirando partido da compilação nativa e especifica para a arquitectura da máquina em questão, melhorando significativamente a performance.
É também necessário referir que existem dois tipos de JVMs standards, a cliente e a servidor, onde esta última executa código interpretado com maior eficiência e maior performance, com o custo de um arranque mais moroso.
Um exemplo de 1995, retirado do documento The Java™ Language: An Overview, pela Sun Microsystems, coloca a execução de cerca de 300,000 chamadas a métodos, provenientes de código interpretado que foi compilado de forma nativa, ao mesmo nível de chamadas a métodos ou funções de código nativo C e C++
Não, Java não é interpretado. Java é executado pela JVM, como vimos em capítulos anteriores, mas a JVM é livre de escolher a estratégia de execução de código que melhor lhe convir. Desde a segunda geração de máquinas virtuais que o código é compilado através de compiladores JIT, que fazem as mesma coisa que compiladores C, compilam o código do mesmo modo, mas que o fazem apenas na altura de executar a aplicação.
Isto é, o programador cria a sua aplicação, ela é compilada para bytecode, esse bytecode é que vemos ao tentarmos abrir um ficheiro .class. Ao ser executado, esse bytecode vai ser compilado nativamente e toda a execução da aplicação é feita através de código nativo. Naturalmente todo este processo tem algumas desvantagens, como a aplicação ser recompilada a cada execução, já que o código compilado é perdido quando a aplicação termina, mas as desvantagens são insignificantes nos sistemas actuais.
O tempo perdido a compilar é, tipicamente, absorvido pelo tempo de arranque da aplicação.