Definição de Java
O Java é uma linguagem de programação multiplataforma, com uma sintaxe até certo ponto parecida com o C++, porém com bibliotecas diferentes. Os programas em Java podem ser executados em qualquer sistema operacional, desde que o interpretador esteja instalado.
A JVM é um programa que converte o código Java em comandos que o sistema operacional possa executar. Existem máquinas virtuais para vários sistemas operacionais: o problema é que, devido ao processamento executado pela máquina virtual, o programa torna-se mais pesado do que seria caso escrito diretamente para a plataforma. Um exemplo de programa desenvolvido desta forma é o Mercury (um cliente MSN com versões para Linux e Windows, um dos primeiros a oferecer suporte a webcam e por isso bastante famoso). Embora o código fonte do programa seja relativamente simples e bem escrito, ele é bem mais pesado que outros programas similares, por causa da máquina virtual.
Explicando de forma mais elaborada, linguagens de programação "tradicionais", como o C e o C++, utilizam um compilador diferente para cada plataforma ou sistema operacional em que o programa irá rodar. O código fonte em si pode ser escrito de forma a ser facilmente portável, ou seja, rodar em diferentes versões do Unix ou em várias famÃlias de processadores diferentes sem muitas alterações, mas ainda assim será necessário recompilar o código fonte, gerando um binário diferente para cada caso.
Embora o trabalho inicial seja maior, a vantagem desta abordagem é que o desempenho é o melhor possÃvel, já que sempre teremos um programa binário otimizado para a plataforma.
O Java utiliza um conceito diferente. Ao invés de gerar um binário diferente para cada plataforma, é gerado um binário que pode ser executado em qualquer plataforma, dentro de uma máquina virtual. Este binário "universal" é chamado de bytecode.
A idéia é criar aplicativos que possam ser escritos uma vez e a partir daà serem executados em qualquer plataforma, reduzindo os custos de desenvolvimento. Apenas o software da máquina virtual é que precisa ser reescrito para cada plataforma, mas isso é problema dos desenvolvedores da linguagem, não do programador.
Existe ainda a opção de abrir mão da flexibilidade do bytecode em troca de um maior desempenho, passando a compilar os programas com otimizações para uma determinada plataforma. Isso é muito útil quando o programa será executado apenas dentro de computadores de uma certa plataforma, como PCs rodando Linux, por exemplo.
No caso do Java, a máquina virtual que executa os programas é chamada de Java Virtual Machine. Muitas páginas web utilizam applets Java, por isso a maioria das pessoas acaba instalando o suporte a Java. Hoje em dia, além do Java da Sun, temos versões alternativas, como o Blackdown e o Kofee, que possuem conjuntos de recursos variados, mas são a princÃpio compatÃveis com o código gerado para o Java da Sun.
Embora tenha ganhado relevância com o Java, este conceito não é exatamente novo. Linguagens mais antigas como o LISP e o Prolog já utilizam bytecode e máquinas virtuais.