Java é uma linguagem de programação compilada ou interpretada?

169

No passado, eu usei o C ++ como uma linguagem de programação. Eu sei que o código escrito em C ++ passa por um processo de compilação até que se torne código de objeto "código de máquina".

Gostaria de saber como o Java funciona nesse sentido. Como o usuário escreve o código Java executado pelo computador?

Nome em Exibição
fonte
14
C ++ pode ser interpretado. Existem alguns intérpretes em C por aí.
Tom Hawtin - tackline

Respostas:

220

As implementações Java geralmente usam um processo de compilação em duas etapas. O código-fonte Java é compilado no bytecode pelo compilador Java. O bytecode é executado por uma Java Virtual Machine (JVM). As JVMs modernas usam uma técnica chamada compilação Just-in-Time (JIT) para compilar o bytecode para instruções nativas entendidas pela CPU do hardware em tempo real no tempo de execução.

Algumas implementações da JVM podem optar por interpretar o bytecode em vez de o JIT compilá-lo no código da máquina e executá-lo diretamente. Embora isso ainda seja considerado um "intérprete", é bem diferente dos intérpretes que lêem e executam o código-fonte de alto nível (ou seja, neste caso, o código-fonte Java não é interpretado diretamente, o bytecode, saída do compilador Java).

É tecnicamente possível compilar o Java com código nativo antecipadamente e executar o binário resultante. Também é possível interpretar o código Java diretamente.

Para resumir, dependendo do ambiente de execução, o bytecode pode ser:

  • compilado com antecedência e executado como código nativo (semelhante à maioria dos compiladores C ++)
  • compilado na hora certa e executado
  • interpretado
  • executado diretamente por um processador suportado (bytecode é o conjunto de instruções nativo de algumas CPUs)
Mehrdad Afshari
fonte
20
Na verdade, algumas JVMs do HotSpot começam interpretando bytecodes e as compilam no código nativo depois de descobrirem o que vale a pena compilar e reuniram algumas estatísticas sobre como o código está sendo executado; por exemplo, para descobrir o caminho mais comum seguido em cada ramo condicional.
Stephen C
1
Daí o termo 'Hotspot' :) Faz isso com o que está sendo executado frequentemente, para obter uma otimização.
Noon Silk
4
Você pode desligar o intérprete no HotSpot com -Xcomp. Vale a pena experimentar um aplicativo para ver como é uma má ideia.
Tom Hawtin - tackline
1
Há uma declaração "A versão atual do Sun HotSpot JVM usa uma técnica chamada compilação Just-in-time (JIT) para compilar o bytecode com as instruções nativas compreendidas pela CPU em tempo real". Fiquei com a impressão de que a JVM é um intérprete, mas sugere que ele compile ainda mais o código de bytes. Estou confuso. Também está escrito que ele faz isso em tempo real em tempo de execução. Alguém pode explicar isso também?
Anand
Como Java é uma linguagem interpretada como ela afetará o desempenho ou a qualquer execução de aplicativos java
NAND
93

insira a descrição da imagem aqui

O código escrito em Java é:

  • Primeiro compilado no bytecode por um programa chamado javac, como mostrado na seção esquerda da imagem acima;
  • Em seguida, como mostrado na seção direita da imagem acima, outro programa chamado java inicia o Java Runtime Environment e pode compilar e / ou interpretar o bytecode usando o Java Interpreter / JIT Compiler.

Quando o java interpreta o bytecode e quando o compila? O código do aplicativo é inicialmente interpretado, mas a JVM monitora quais seqüências de bytecode são frequentemente executadas e as converte em código de máquina para execução direta no hardware. Para o bytecode, que é executado apenas algumas vezes, isso economiza o tempo de compilação e reduz a latência inicial; para bytecode frequentemente executado, a compilação JIT é usada para executar em alta velocidade, após uma fase inicial de interpretação lenta. Além disso, como um programa passa a maior parte do tempo executando uma minoria de seu código, o tempo de compilação reduzido é significativo. Finalmente, durante a interpretação inicial do código, as estatísticas de execução podem ser coletadas antes da compilação, o que ajuda a executar uma melhor otimização.

Nome em Exibição
fonte
É devido ao bytecode em cache que o Java usa muita memória?
Pedro Gordo
3
@sedulam: Muita memória é uma afirmação confusa. O gerenciamento de memória do Java é bastante direto - As três gerações são o que a JVM usa para criação e manutenção de seus objetos. Esta outra resposta SO pode ser útil para você.
displayName
Com a explicação acima, teoricamente, o código compilado em C ++ sempre deve ser mais rápido que o código java logicamente semelhante, pois sempre haverá uma parte do arquivo .class que o JIT decide não transformar em código de máquina. Em outras palavras, o java nunca pode alcançar a velocidade de execução bare metal que C ++ demonstrou. Esta suposição está correta?
DevdattaK
@ DevdattaK: Eu não conheço muito o C ++, mas meu palpite é que, para programas menores e especializados, o Java pode fornecer o resultado mais rapidamente, porque não perderia tempo compilando partes do código onde não há muita velocidade disponível.
displayName
1
@DevdattaK sua suposição é discutido neste wiki en.m.wikipedia.org/wiki/Java_performance?wprov=sfla1 Em suma, nem sempre é verdade.
Sundar Rajan
57

Os termos "linguagem interpretada" ou "linguagem compilada" não fazem sentido, porque qualquer linguagem de programação pode ser interpretada e / ou compilada.

Quanto às implementações existentes de Java, a maioria envolve uma etapa de compilação para o bytecode , portanto, envolve a compilação. O tempo de execução também pode carregar o bytecode dinamicamente, portanto, sempre é necessária alguma forma de interpretador de bytecode. Esse intérprete pode, por sua vez, usar a compilação para código nativo internamente.

Atualmente, a compilação just-in-time parcial é usada para muitos idiomas que antes eram considerados "interpretados", por exemplo, JavaScript.

starblue
fonte
5
Além disso, o V8 JavaScript Execution Engine do Google não faz apenas compilação parcial just-in-time. Ele sempre compila com o código nativo; na verdade, o V8 nem sequer tem um intérprete. Ele possui apenas o compilador (semelhante ao Maxine, mas diferentemente do Maxine V8 possui apenas um compilador). Todos os três exemplos (GCJ, Maxine e V8) comprovam seu argumento ainda mais fortemente: não existe linguagem interpretada ou compilada. Um idioma não é interpretado ou compilado. Uma linguagem é apenas (na verdade, é uma citação de Shriram Krishnamurthi).
Jörg W Mittag
3
Por que você está falando sobre javascript em uma pergunta java?
precisa saber é o seguinte
1
@KorayTugay Apenas como exemplo. Certamente não quero sugerir que Java e Javascript tenham algo em comum além das quatro primeiras letras do nome.
starblue
Pelo menos uma diferença na linguagem interpretada e compilada não significaria que um binário de linguagem compilada não pode ter seu fluxo de execução alterado a qualquer momento, enquanto uma linguagem interpretada é muito obediente a algumas das funções atuais das funções? Bibliotecas em C é uma opção, enquanto em outros idiomas você não pode ter um objeto de matriz sem uma extensão binária C que possa ser atualizada ou ter um código completamente diferente em outra plataforma. A linguagem de script será capaz de rodar tanto enquanto a linguagem compilada seria necessário um binário diferente para ser executado
Eaton Emmerich
53

O Java é compilado no bytecode, que entra na Java VM, que o interpreta.

Seda do meio-dia
fonte
33
... mas não estritamente preciso.
Stephen C
2
A JVM pode optar por não "interpretar" o bytecode. Ele pode compilá-lo e executá-lo diretamente.
Mehrdad Afshari
1
Tecnicamente, o JIT não está executando diretamente. É apenas lembrar como foi executado.
Cletus
Mehrdad: Acordado, eu não descrevem as operações possivelmente JIT aqui, como eu considero que até a JVM, e eu estava mantendo a minha resposta simples de qualquer maneira :)
Noon Silk
7
cletus: Após o JIT, ele será executado diretamente. O JIT está lendo um pedaço de bytecode (por exemplo, um método completo ) e compilando o código da máquina e pulando para ele.
Mehrdad Afshari
12

Java é uma linguagem de programação compilada, mas, em vez de compilar diretamente para código de máquina executável, compila para um formato binário intermediário chamado código de byte da JVM. O código de bytes é então compilado e / ou interpretado para executar o programa.

Sam Harwell
fonte
11

Tipo de ambos. Primeiro, o Java compilado (alguns preferem dizer "traduzido") para o bytecode, que então é compilado ou interpretado dependendo do humor do JIT.

maykeye
fonte
32
Isso é um software avançado, ter humores desenvolvidos :)
Thorarin
5
O JIT é realmente um software muito sofisticado, que pode fazer otimizações com base em informações de tempo de execução (como um profiler), que um compilador antecipado não pode fazer (porque não possui informações sobre o comportamento em tempo de execução do programa com antecedência). Mas provavelmente não tem realmente humores ... :-)
Jesper
5

Java faz compilação e interpretação,

Em Java, os programas não são compilados em arquivos executáveis ; eles são compilados no bytecode (como discutido anteriormente), que a JVM (Java Virtual Machine) interpreta / executa em tempo de execução. O código-fonte Java é compilado no bytecode quando usamos o compilador javac. O bytecode é salvo no disco com a extensão de arquivo .class .

Quando o programa deve ser executado, o bytecode é convertido, o bytecode pode ser convertido, usando o compilador just-in-time (JIT). O resultado é um código de máquina que é então alimentado na memória e executado.

Javac é o compilador Java que compila o código Java no Bytecode. A JVM é uma Java Virtual Machine que executa / interpreta / converte o Bytecode em código de máquina nativo. Em Java, embora seja considerada uma linguagem interpretada, ela pode usar a compilação JIT (Just-in-Time) quando o bytecode estiver na JVM. O compilador JIT lê os bytecodes em muitas seções (ou na íntegra, raramente) e os compila dinamicamente no código da máquina, para que o programa possa executar mais rapidamente e, depois, armazenado em cache e reutilizado posteriormente sem precisar ser recompilado. Portanto, a compilação JIT combina a velocidade do código compilado com a flexibilidade da interpretação.

Uma linguagem interpretada é um tipo de linguagem de programação para a qual a maioria de suas implementações executa instruções direta e livremente, sem antes compilar um programa em instruções de linguagem de máquina. O intérprete executa o programa diretamente, traduzindo cada instrução em uma sequência de uma ou mais sub-rotinas já compiladas em código de máquina.

Uma linguagem compilada é uma linguagem de programação cujas implementações são tipicamente compiladores (tradutores que geram código de máquina a partir do código-fonte) e não intérpretes (executores passo a passo do código-fonte, onde não ocorre tradução pré-tempo de execução)

Nas implementações modernas da linguagem de programação, como em Java, é cada vez mais popular uma plataforma fornecer as duas opções.

prime
fonte
Deve ser "o bytecode pode ser convertido" em vez de " é convertido". As especificações Java definem bytecode. Se esse bytecode é executado (a) diretamente no hardware , (b) por meio de um intérprete, (c) compilado previamente ou (d) parcialmente compilado em tempo real no tempo de execução, todos são deixados como detalhes de implementação. Observe que todas as quatro opções foram realmente usadas por várias implementações Java do mundo real.
Basil Bourque 04/04
Obrigado por apontar isso. Então, o que acontece se o bytecode não for convertido em código de máquina? Posso pensar em um cenário em que o bytecode é o conjunto de instruções nativo para alguns processadores e, em seguida, não há necessidade de conversão. Ou eu estou esquecendo de alguma coisa.
Primeiro-
Clique no link que forneci para a tecnologia Jazelle DBX (Direct Bytecode eXecution) , em que um subconjunto do bytecode da JVM é as instruções nativas da máquina da CPU (meio que sorta). Sem isso, você obtém o código de máquina gerado a partir do bytecode (a) do intérprete (em tempo real), (b) do compilador antecipadamente ou (c) em tempo real com um compilador just-in-time ( interpretado inicialmente e, às vezes, compilado e armazenado em cache durante a execução).
Basil Bourque
-2

Java é uma linguagem compilada em bytes que tem como alvo uma plataforma chamada Java Virtual Machine, que é baseada em pilha e tem algumas implementações muito rápidas em muitas plataformas.

hobbs
fonte
1
O que significa "compilado por bytes"?
Jesper
2
@ Jesper: "Byte-compiled" geralmente significa "compilado em bytecode". "Bytecode" é um termo geral que abrange qualquer tipo de código intermediário não textual (geralmente não executável em máquina).
Greg Hewgill 27/08/2009
-3

Citações de: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

Os desenvolvedores de aplicativos podem desenvolver o código do aplicativo em qualquer um dos vários sistemas operacionais disponíveis no mercado hoje. A linguagem Java é independente neste estágio do SO. O brilhante código-fonte escrito pelo desenvolvedor de aplicativos Java agora é compilado no código Java Byte, que na terminologia Java é chamado de compilação no lado do cliente. Essa compilação para o código Java Byte é o que permite que os desenvolvedores Java 'escrevam uma vez'. O código Java Byte pode ser executado em qualquer sistema operacional e servidor compatível, tornando o código fonte independente do sistema operacional / servidor. Após a criação do código Byte Java, a interação entre o aplicativo Java e o OS / Server subjacente é mais íntima. A jornada continua - A estrutura de aplicativos corporativos executa esses códigos Java Byte em um ambiente de tempo de execução conhecido como Java Virtual Machine (JVM) ou Java Runtime Environment (JRE). A JVM tem laços estreitos com o SO e o hardware subjacentes porque aproveita os recursos oferecidos pelo SO e pelo Servidor. O código Java Byte agora é compilado em um código executável da linguagem de máquina que é específico da plataforma. Isso é chamado de compilação no servidor.

Então, eu diria que Java é definitivamente uma linguagem compilada.

Teo
fonte