Definição de Bytecode
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 sà 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 binário otimizado para a plataforma.
Mas, várias linguagens mais recentes como o Java utilizam 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 executados em qualquer plataforma, reduzindo os custos de desenvolvimento. Apenas o software da máquina virtual é que precisa ser reescrita 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.
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.