Desde o Java 1.6, a JVM pode executar uma infinidade de linguagens de programação em vez de apenas Java. Eu entendo conceitualmente como o Java é executado na Java VM, mas não como outras linguagens também podem ser executadas. Para mim, tudo parece magia negra. Você tem algum artigo para me indicar para que eu possa entender melhor como tudo isso se encaixa?
12
Respostas:
A chave é a linguagem nativa da JVM: o bytecode Java. Qualquer idioma pode ser compilado no bytecode que a JVM entende - tudo o que você precisa é de um compilador que emita o bytecode. A partir de então, não há diferença do ponto de vista da JVM. Tanto que você pode pegar um arquivo de classe Scala, Clojure, Jython etc. compilado e descompilar (usando, por exemplo, JAD ) no código-fonte Java de aparência normal.
Você pode encontrar mais detalhes sobre isso nos seguintes artigos / tópicos:
Não estou ciente de alterações fundamentais nas JVMs Java 5 ou 6 que tornariam possível ou mais fácil a execução de (código compilado de) outras linguagens. No meu entendimento, a JVM 1.4 era mais ou menos tão capaz quanto a JVM 6 (embora possa haver diferenças; eu não sou especialista em JVM). Só que as pessoas começaram a desenvolver outras linguagens e / ou compiladores de bytecodes na primeira metade da década, e os resultados começaram a aparecer (e tornar-se mais conhecidos) por volta de 2006, quando o Java 6 foi publicado.
No entanto, todas essas versões da JVM compartilham algumas limitações: a JVM é digitada estaticamente por natureza e, até o release 7, não suportava linguagens dinâmicas. Isso mudou com a introdução de
invokedynamic
uma nova instrução de bytecode que permite a invocação de método com base na verificação dinâmica de tipo.fonte
Uma máquina virtual, como a JVM, é um programa que aceita como entrada, geralmente arquivos, um conjunto de instruções simples (que geralmente são fáceis de converter em instruções reais da CPU) e as compila e executa como instruções nativas da CPU (geralmente usando um compilador sob demanda, como HotSpot ou JIT).
É essencialmente uma camada de abstração. Geralmente, é muito mais fácil portar implementações de conjuntos de instruções da VM para diferentes arquiteturas de processador, devido a várias semelhanças (como ser baseado em pilha). Também é muito mais fácil portar diferentes linguagens de programação para instruções da VM, pois é mais orientado para linguagens de programação modernas do que as instruções primitivas da CPU. Muitas máquinas virtuais, como a JVM e o CLR (.NET), contêm instruções para chamar métodos virtuais e criar instâncias de objetos.
Então, vamos pegar um idioma, por exemplo. Chame de MyLanguage. Por ser uma linguagem de programação, ela compila até um conjunto de algumas instruções da arquitetura da CPU. Isso significa que, dado um conjunto de instruções da Máquina Virtual compatível e flexível, também é possível compilar o MyLanguage para um conjunto de instruções dessa VM.
Sempre há uma questão de eficiência, pois você pode precisar hackear algumas soluções alternativas nos conjuntos de instruções da VM que você não precisaria executar de forma nativa, mas ainda é possível.
fonte
Uma JVM é uma máquina de computação completa de Turing (exceto memória limitada) e qualquer máquina completa de Turing (física ou virtual) pode executar qualquer linguagem de programação (exceto limitações de memória, desempenho e E / S físicas).
fonte
Por um momento, pense na JVM como um processador com suas próprias instruções, como talvez o x86. O processador pode executar, digamos, o código C que foi compilado em sua linguagem de máquina. Aplicando a mesma analogia à JVM, outros idiomas podem ser executados na JVM, assim como em outros processadores, se esses idiomas forem compilados de acordo com as instruções da máquina da JVM. A JVM pode então executar estas instruções para o idioma X.
fonte