Texto de: Cristina Leandro
Neste artigo exploraremos o conceito da Máquina Virtual do Java e veremos como essa tecnologia permite a execução de um mesmo código em qualquer sistema.
Entendendo o conceito de WORA
WORA é o acrônimo de “Write once, run anywhere” ou “Escreva uma vez, execute em qualquer lugar” em português. Esse slogan, criado pela Sun MicroSystems — empresa fabricante de computadores e desenvolvedora de linguagem — explica exatamente o que estamos falando aqui: você pode escrever um código Java em um sistema e ele funcionará em todos os sistemas habilitados para a linguagem. Esse é um dos motivos pelo qual a linguagem teve e ainda tem tanto sucesso. No momento da escrita desse artigo, Java é citada como a quarta linguagem de programação mais popular segundo o TIOBE index, um indicador de popularidade de linguagens de programação.
Uma linguagem independente de plataforma
Vamos começar do começo. Para entender o que é uma linguagem independente de plataforma é preciso saber primeiramente o que, de fato, é uma plataforma. Uma plataforma, nesse contexto, é um ambiente onde um software pode ser executado. Uma plataforma pode ser um sistema operacional, como Linux ou Windows, um hardware, como um processador Intel com arquitetura x86 ou um processador AMD com arquitetura x64, ou até outro software, como um browser.
Também podemos chamar de plataforma diferentes configurações de sistema operacional e processador, como um sistema operacional Windows que utiliza um processador Intel com arquitetura x86 e um sistema operacional Linux com o processador ARM, normalmente quando falamos de Java, plataforma acaba se referindo a essa combinação.
Código de Máquina
É necessário lembrar também que as máquinas entendem apenas machine code (código de máquina). Esse código é composto apenas por dígitos binários (0s e 1s) que podem eventualmente ser representados também nos formatos octal, decimal e hexadecimal. Como você pode ver na imagem abaixo, esse tipo de código é bem difícil de ser compreendido por humanos:
Felizmente, não precisamos mais escrever código de máquina manualmente, já que as linguagens de programação possuem um compilador ou interpretador que faz isso automaticamente. Porém, em linguagens como C++, o código de máquina gerado pelo computador só funciona na plataforma onde ele foi compilado. Isso quer dizer que um código compilado para um sistema Windows com um processador X não funcionaria em um sistema Windows com um processador Y.
O código de máquina para um processador de 32 bits geralmente não é executado em um processador de 64 bits, mesmo que seja do mesmo fabricante. Os conjuntos de instruções desses tipos de processadores são muito diferentes, o que significa que eles não entendem o código de máquina da mesma forma. Isso quer dizer que se você compilar o código em uma máquina e tentar rodá-la em outra máquina que entende o código máquina de forma diferente, você receberá uma mensagem de erro e será necessário recompilar o código novamente.
Resumidamente, você teria que criar uma versão do seu código-fonte para cada plataforma, o que acaba sendo muito complicado conforme mais e mais plataformas vão surgindo no mercado. Essa é uma das razões pelas quais as linguagens independentes de plataforma são tão predominantes. E é aqui que entra o Java.
Java Virtual Machine
Você deve lembrar que para começar a programar em Java precisou fazer o download de ferramentas como JDK, JRE e JVM. Nesse artigo, focarei mais na JVM, que é um acrônimo para Java Virtual Machine (Máquina Virtual Java) e é a ferramenta responsável pela independência da plataforma da linguagem.
Com a JVM, o código “humano” não é convertido diretamente para um código que o hardware consiga entender, ele será convertido para uma forma intermediária de código chamada bytecode. O bytecode é uma ponte entre o texto que o programador consegue manipular e o código de máquina que o computador consegue executar. O arquivo bytecode que é gerado é interpretado pela JVM (Máquinas Virtuais Java) como vocês podem conferir na imagem abaixo:
Dessa forma, uma vez que o arquivo bytecode é gerado, ele pode ser executado em qualquer máquina que também tenha a JVM. Daí vem o princípio “Escreva uma vez, execute em qualquer lugar”. Em outras palavras, um código escrito em Java em um sistema operacional Windows, rodará em uma máquina com sistema operacional Mac sem precisar ser reescrito, já que quem está interpretando o código não é a máquina com sistema Windows ou Mac, mas sim a Máquina Virtual Java (JVM).
O bytecode acabou ficando popular com o Java, e mais tarde esse mesmo bytecode também passou a ser utilizado por outras “linguagens JVM”, como Kotlin, que também tem essa vantagem de poder ser transmitido em plataformas diferentes.
Conclusão e resumo
Nesse artigo, vimos que Java é independente de plataforma porque usa uma máquina virtual (JVM). O código escrito usando a linguagem de programação Java será, portanto, compilado para um bytecode independente de plataforma que eventualmente será transformado para código de máquina de acordo com a plataforma onde ele for executado.