Em todos os lugares que estudamos Java, sempre vemos falar muito sobre a portabilidade que a plataforma oferece por causa da JVM. Tenho a impressão de que é sempre ressaltado a portabilidade da JVM como maior, ou como mais vantajoso do que a portabilidade de compiladores como os de C, por exemplo.
Porém, não consigo bem enxergar a grande vantagem de máquinas virtuais em relação a compiladores no quesito portabilidade.
Precisamos ter um compilador diferente para cada SO. Ok... Mas também precisamos ter uma JVM diferente para cada SO, não é? Assim como escrevemos um código fonte Java uma vez só e transformamos em bytecode que é entendido pelas diferentes JVM's, também escrevemos códigos fonte C apenas uma vez que é entendido pelos diferentes compiladores, ou estou entendendo errado?
Entendo que o código fonte Java só é compilado uma vez (para bytecode) e que o código fonte em C precisa ser compilado para cada plataforma que ele for rodar. Mas é apenas aí que uma máquina virtual ganha de um compilador quando falamos de portabilidade? É ruim assim ter que compilar várias vezes um código fonte? Minha cabeça de principiante não consegue ver isso como um problema tão grande... Quando baixo programas que quero usar estou acostumado a ver versões para diferentes tipos de SO's... Não consigo ver isso como um problema.
Ah, quando falei que precisamos escrever o código fonte apenas uma vez... Ouvi dizer em alguns lugares que não é bem assim na prática... Nem para as JVM's, nem para os compiladores. Então de novo, pra mim vira tudo a mesma coisa...
Desculpem se a pergunta é boba, mas realmente queria entender as vantagens de uma JVM de verdade. Obrigado desde já :)