Como a Java Virtual Machine executa o código escrito em outros idiomas?

12

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?

Pomario
fonte
2
Do mesmo modo que o processador Intel / AMD / Solaris (??) pode executar "qualquer idioma" (embora você não execute idiomas de verdade, mas apenas seguindo o fluxo aqui) que pode ser compilado em seu código de montagem nativo.
Apoorv Khurasia
13
O problema é que a JVM não executa Java. Ele executa uma linguagem de baixo nível distinta (embora relacionada e intencionalmente fácil para os compiladores Java).
Isso é verdade. Mas a JVM começou a executar outros idiomas a partir da versão 6; você não podia (ou ninguém o fez) executar python ou Groovy na versão 1.4.2. Por que? O que mudou?
Pomario 7/06
@delnan Ou melhor, "modelo de execução de mais baixo nível, que o programa javac sabe como construir a partir do código Java".
Apoorv Khurasia
9
O @Pomario Jython já existe há algum tempo. E esta página parece sugerir que os scripts Jython possam ser executados na 1.4.2.
Apoorv Khurasia

Respostas:

23

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 invokedynamicuma nova instrução de bytecode que permite a invocação de método com base na verificação dinâmica de tipo.

Péter Török
fonte
8
Não é exatamente verdade que a JVM não "suportou" linguagens dinâmicas. Eles apenas tiveram que usar soluções alternativas que apresentavam sérias desvantagens.
Michael Borgwardt
3
@ MichaelBorgwardt, podemos concordar que a JVM pré v7 tolerava linguagens dinâmicas (até certo ponto)? :-)
Péter Török
1
Essa é uma boa maneira de colocá-lo :)
Michael Borgwardt
3

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.

Yam Marcovic
fonte
3

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).

hotpaw2
fonte
Erm .... por que precisamos de compiladores então? ;-)
Péter Török
Compiladores e intérpretes, eles próprios, podem rodar em máquinas de Turing (talvez devagar). Talvez algumas etapas de pré-compilação / tradução possam melhorar o desempenho da execução de um determinado programa em um determinado idioma?
precisa
1
Meu argumento foi que sua afirmação "qualquer máquina completa de Turing (física ou virtual) pode executar qualquer linguagem de programação" significa literalmente que a CPU x86 do meu laptop pode executar diretamente esse bom arquivo de origem Java no qual estou trabalhando agora. Ou código de máquina para processadores PowerPC. Sem compiladores - as CPUs não contêm compiladores, certo? :-)
Péter Török
Sua "máquina" é mais do que apenas a CPU.
precisa
1
@ PéterTörök Entendo o seu ponto. Ele não elaborou VMs como nós. Mas acho que a resposta dele ainda responde brevemente à pergunta do OP. A JVM pode "executar" outras linguagens de programação porque pode "executar" qualquer linguagem de programação, porque está completa com Turing. Talvez não seja elaborado, mas ainda é um ponto conciso e válido. :)
Yam Marcovic
2

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.

cobie
fonte
sua analogia é uma agradável
cobi