Boa noite pessoal,
Estou querendo aqui comparar o processo de compilação das tecnologias tradicionais com o Java. Tomaremos o exemplo do C++ com o Java. Vou detalhar um pouco, pois no final entenderão a minha dúvida.
Sabemos que um arquivo gerado pelo Java num determinado computador pode ser executado em qualquer sistema operacional.
Bom, somente para fins de definição, entendo que plataforma é uma arquitetura de computador, de uma certa maneira, uma CPU. E para rodarmos um programa num determinado computador (que possui a sua plataforma), necessitamos de um sistema operacional instalado nele. Ocorre que os sistemas operacionais são concebidos para determinadas arquiteturas de computadores (plataformas) e são incompatíveis com todas as demais. Por isso, os próprios sistemas operacionais são utilizados para identificar as plataformas.
Até aqui, tudo bem. Eu confundia muito isso, muito esses termos, mas agora entendo perfeitamente e logo também compreendo o que escrevi acima, que o mesmo arquivo gerado pelo seu compilador Java pode ser executado em qualquer sistema operacional e, por conseguinte, em qualquer arquitetura de computador.
Beleza, resolvida essa questão. Vamos para as dúvidas, que eu acredito já ter a resposta, mas gostaria também da opinião de vocês.
Eu escrevi um programa num ambiente Windows em C++. Compilei e executei. Sabemos que a compilação do C++, pega o seu código fonte e gera o código binário para aquela plataforma específica, logo somente executará no Windows. Não há dúvidas nisso!
Já se eu escrever o mesmo programa em Java, o compilador gera um código intermediário que a JVM específica para aquela plataforma (no site da Oracle, você tem que baixar a JVM específica para o seu sistema operacional), irá gerar o código binário, logo irá ser executado também o programa.
Nesse caso entendo que a JVM vai compilar pra você o seu código intermediário. A verdadeira compilação ocorre aqui, pois é neste momento que o código binário é gerado.
Logo, peguei o meu programa feito em Java (HelloWorld.class) no Windows e levei para o Linux e executei:
java HelloWorld
Ele vai funcionar perfeitamente e beleza, compreendemos a interdependência da plataforma, pois a JVM faz a compilação do .class feito no Windows para o código binário para o Linux executar.
Agora a dúvida 01: o programa feito em C++ (HelloWorld.cpp) no Windows, levei para o Linux, eu não poderia compilá-lo com o compilador específico para o Linux e executá-lo?
Dúvida 02: Já que eu tenho várias JVMs específicas para as plataformas distintas (diz-se aí sistemas operacionais diferentes), qual seria a diferença em ter compiladores diferentes para as linguagens tradicionais (C++, Pascal, etc) para que os mesmos rodem nos sistemas operacionais diferentes? Não daria no mesmo?
A minha resposta para as minhas próprias dúvidas são: (corrijam-me por favor)
É que a independência da plataforma está no código fonte e mais específico na API da Linguagem de programação (C++, Pascal, Java etc). Por exemplo, no C++ temos:
include <windows.h>
Ou seja, é uma biblioteca (API) que é específico do Windows, e com isso, nós programadores devemos tomar cuidados especiais quando estivermos desenvolvendo códigos que pretendemos depois reutilizar em outros sistemas. E, logicamente, a implementação do código será diferente para cada sistema operacional.
Logo, o “windows.h” contém declarações para todas as funções da API do sistema operacional Windows, que contém as funcionalidades do ambiente Windows que diferem do outro sistema operacional, Linux por exemplo.
O que eu percebo, que a grande vantagem não está na JVM e sim na API do Java! Corrijam-me por favor se estou errado.
Pois, mesmo tendo um compilador específico para o C++ em Linux e compilo o HelloWorld.cpp feito no Windows, ele jamais funcionaria. Já no Java sim! Entendemos que a compilado no Java e feita pela JVM, só não percebemos isso claramente lá na hora. Parece que tudo já foi compilado, o que não é verdade!
Portanto, o processo de compilação é o mesmo (corrijam-me mais uma vez se estou errado), pois é como se eu levasse o meu HelloWorld.class feito no Windows e a JVM o compilasse para o Linux, e como sabemos ele funcionaria, pois a API do Java sim, não contém bibliotecas exclusivas para este ou aquele sistema operacional, como no C++, a API do Java é independente.
Ex: import javax.swing.JOptionPane, não importa se é para Linux ou Windows.
Pois pensamos bem: se fosse assim, não precisaríamos na hora de baixar o kit JDK no site da Oracle, identificar qual a plataforma. Faríamos o download e pronto!
Gostaria por gentileza imensamente da opinião de vocês neste assunto. E se eu estou equivocado com o meu pensamento.
Agora, o que vou escrever aqui, poderia até ser assunto para outro tópico, mas aproveitando, entendo que o JVM não é um emulador.
Por exemplo, eu pego o jogo clássico do Enduro para o Atari e executo no Android por exemplo. Ocorre aqui o processo de emulação e não uma compilação propriamente dita, até porquê cairíamos no mesmo problema do C++ ora comentado acima, ou seja, imaginem: teríamos que reprogramar todos os jogos para as plataformas atuais. Loucura!
Muito obrigado.
Abraços.
Carlos