Qual é a diferença entre linguagem compilada e interpretada?

118

Depois de ler algum material sobre esse assunto, ainda não tenho certeza de qual é a diferença entre uma linguagem compilada e uma linguagem interpretada. Disseram-me que essa é uma das diferenças entre Java e JavaScript. Alguém poderia me ajudar a entender isso?

SIr Codealot
fonte

Respostas:

165

Qual é a diferença entre linguagem compilada e interpretada?

A diferença não está no idioma; está na implementação .

Tendo tirado isso do meu sistema, aqui vai uma resposta:

  • Em uma implementação compilada, o programa original é traduzido em instruções de máquina nativas, que são executadas diretamente pelo hardware.

  • Em uma implementação interpretada, o programa original é traduzido em outra coisa. Outro programa, chamado "o intérprete", examina "outra coisa" e executa todas as ações necessárias. Dependendo da linguagem e de sua implementação, há uma variedade de formas de "outra coisa". Do mais popular ao menos popular, "outra coisa" pode ser

    • Instruções binárias para uma máquina virtual, muitas vezes chamada de bytecode , como é feito em Lua, Python, Ruby, Smalltalk e muitos outros sistemas (a abordagem foi popularizada na década de 1970 pelo UCSD P-system e UCSD Pascal)

    • Uma representação em forma de árvore do programa original, como uma árvore de sintaxe abstrata, como é feito para muitos protótipos ou intérpretes educacionais

    • Uma representação tokenizada do programa de origem, semelhante ao Tcl

    • Os personagens do programa fonte, como foi feito no MINT e TRAC

Uma coisa que complica o problema é que é possível traduzir (compilar) o bytecode em instruções de máquina nativas . Assim, uma implementação bem-sucedida pode eventualmente adquirir um compilador. Se o compilador for executado dinamicamente, nos bastidores, ele costuma ser chamado de compilador just-in-time ou compilador JIT. Os JITs foram desenvolvidos para Java, JavaScript, Lua e, ouso dizer, muitas outras linguagens. Nesse ponto, você pode ter uma implementação híbrida na qual algum código é interpretado e outro código é compilado.

Norman Ramsey
fonte
7
Senhor, tenho as seguintes perguntas 1. Em que idioma está escrito "outra coisa"? 2. E no contexto do JavaScript, essa "outra coisa" varia de navegador para navegador? 3. Digamos, meu script está sendo executado no Google Chrome e no Internet Explorer, ele é interpretado da mesma forma em ambos os navegadores?
JavaHopper
@Norman, essa foi uma explicação incrível. No entanto, aqui estão algumas confusões que ainda tenho. Em uma implementação compilada, o programa original é convertido em instruções de máquina nativas. Por quê? Achei que C, por exemplo, após a compilação produziria o código assembly, que de qualquer maneira precisa ser montado por um assembler nativo no código de máquina da máquina subjacente. Então, como isso difere de uma VM (python ou JVM etc.) fazendo o mesmo no caso de uma linguagem interpretada?
qre0ct
58

Java e JavaScript são um exemplo bastante ruim para demonstrar essa diferença , porque ambos são linguagens interpretadas . Java (interpretado) e C (ou C ++) (compilado) podem ter sido um exemplo melhor.

Por que o texto riscado? Como esta resposta corretamente aponta, interpretado / compilado é sobre uma implementação concreta de uma linguagem, não sobre a linguagem em si . Embora declarações como "C é uma linguagem compilada" sejam geralmente verdadeiras, não há nada que impeça alguém de escrever um interpretador de linguagem C. Na verdade, intérpretes para C existem .

Basicamente, o código compilado pode ser executado diretamente pela CPU do computador. Ou seja, o código executável é especificado na linguagem "nativa" da CPU ( linguagem assembly ).

O código das linguagens interpretadas, entretanto, deve ser traduzido em tempo de execução de qualquer formato para as instruções da máquina da CPU. Esta tradução é feita por um intérprete.

Outra maneira de colocar isso é que as linguagens interpretadas são o código que é traduzido em instruções de máquina passo a passo enquanto o programa está sendo executado, enquanto as linguagens compiladas têm o código traduzido antes da execução do programa.

stakx - não contribui mais
fonte
8
Java é interpretado? Da wikipedia: "Os aplicativos Java são normalmente compilados em bytecode (arquivo de classe) que pode ser executado em qualquer Java Virtual Machine (JVM), independentemente da arquitetura do computador."
Personman
6
@Personman que ainda é tecnicamente "interpretado" como o JVM está executando o código, não o próprio sistema operacional. É realmente uma diferença semântica mais, como se poderia dizer que a complexidade dos sistemas operacionais modernos faz a diferença basicamente irrelevante para a maioria das situações. Você está falando sobre a diferença entre o sistema operacional executando o aplicativo e o sistema operacional executando um aplicativo que está executando o código.
GrayWizardx
5
Suponho que você queira dizer que os próprios arquivos de classe são interpretados pelo Java VM. Isso é razoável, mas o código-fonte Java realmente é compilado em bytecode Java VM. Você pode construir uma Java Machine física que não exija que a VM a interprete no código de máquina de outra arquitetura. Portanto, parece mais correto dizer que o Java é compilado. Ainda assim, este é um bom exemplo de como a distinção é confusa e meio arbitrária. Afinal, C compilado é interpretado pela CPU, certo?
Personman
13
Java é um péssimo exemplo de linguagem compilada ou interpretada porque é essencialmente as duas coisas. Se eu fosse fazer uma comparação, escolheria C e Lisp para evitar confusão.
Bill the Lizard
7
@stakx - na verdade, os bytecodes Java são normalmente compilados para código nativo por um compilador JIT também. A única maneira de obter o comportamento do intérprete puro é desligar explicitamente o compilador JIT quando o JVM for iniciado.
Stephen C
15

Aqui está a diferença básica entre a linguagem do compilador e a linguagem do intérprete.

Linguagem do compilador

  • Pega o programa inteiro como uma única entrada e o converte em código-objeto que é armazenado no arquivo.
  • O código do objeto intermediário é gerado
  • por exemplo: C, C ++
  • Os programas compilados são executados mais rapidamente porque a compilação é feita antes da execução.
  • O requisito de memória é mais devido à criação do código do objeto.
  • Os erros são exibidos depois que todo o programa é compilado
  • Código fonte --- Compilador --- Código da máquina --- Saída

Idioma do intérprete:

  • Aceita uma única instrução como entrada única e executa as instruções.
  • O código do objeto intermediário NÃO é gerado
  • por exemplo: Perl, Python, Matlab
  • Os programas interpretados são executados mais lentamente porque a compilação e a execução ocorrem simultaneamente.
  • O requisito de memória é menor.
  • Os erros são exibidos para cada instrução.
  • Código Fonte --- Intérprete --- Saída
PGOEL
fonte
5

Um compilador, em geral, lê código de computador de linguagem de nível superior e o converte em código-p ou código de máquina nativo. Um interpretador é executado diretamente a partir do código-p ou de um código interpretado como Basic ou Lisp. Normalmente, o código compilado é executado muito mais rápido, é mais compacto e já encontrou todos os erros de sintaxe e muitos dos erros de referência ilegal. O código interpretado só encontra esses erros depois que o aplicativo tenta interpretar o código afetado. O código interpretado geralmente é bom para aplicativos simples que serão usados ​​apenas uma vez ou no máximo algumas vezes, ou talvez até mesmo para prototipagem. O código compilado é melhor para aplicativos sérios. Um compilador primeiro pega todo o programa, verifica se há erros, compila-o e então o executa. Enquanto um intérprete faz isso linha por linha, ele pega uma linha, verifica se há erros,

Se precisar de mais informações, procure no Google "diferença entre compilador e interpretador".

Salil
fonte
3
Umm, não tenho certeza de onde você tirou isso além das duas primeiras declarações. Isso era tecnicamente verdade há várias gerações, com muitas linguagens interpretadas, mas dependendo da plataforma e da atenção aos detalhes, é possível ter código interpretado com desempenho próximo ou tão bom quanto código compilado para certas atividades.
GrayWizardx
Tendo em mente que linguagens como Java, C # e JavaScript, que estão quase inundando todo o mundo da programação hoje, será injusto dizer que "código compilado é melhor para aplicativos sérios".
Sisir
2

É uma distinção muito obscura e, de fato, geralmente não é uma propriedade de uma linguagem em si, mas sim do programa que você está usando para executar o código nessa linguagem.

No entanto, a maioria das linguagens é usada principalmente de uma forma ou de outra e, sim, Java é essencialmente sempre compilado, enquanto javascript é essencialmente sempre interpretado.

Compilar o código-fonte é executar nele um programa que gere um arquivo binário executável que, ao ser executado, tem o comportamento definido pela fonte. Por exemplo, javac compila arquivos .java legíveis por humanos em arquivos .class legíveis por máquina.

Para interpretar o código-fonte é executado um programa que produz o comportamento definido de imediato, sem gerar um arquivo intermediário. Por exemplo, quando seu navegador carrega stackoverflow.com, ele interpreta um monte de javascript (que você pode ver ao visualizar o código-fonte da página) e produz muitos dos efeitos interessantes que essas páginas têm - por exemplo, upvoting ou o pequeno notificador barras na parte superior.

Personman
fonte
Enquanto Java primeiro traduz para bytecode e somente durante a execução da JVM o converte para código de máquina; é correto dizer que foi compilado e não interpretado?
Sisir
1
Eu acho que você pode dizer que o bytecode Java é interpretado, claro, mas ninguém escreve bytecode Java. O próprio Java geralmente é compilado em bytecode.
Personman
2

A linguagem interpretada é executada em tempo de execução de acordo com as instruções como no shell script e a linguagem compilada é aquela que é compilada (alterada para a linguagem Assembly, que a CPU pode entender) e então executada como em c ++.

Praveen Kishor
fonte
0

Como já foi dito, compilado e interpretado são específicos para uma implementação de uma linguagem de programação; eles não são inerentes ao idioma. Por exemplo, existem interpretadores C.

No entanto, podemos (e na prática fazemos) classificar as linguagens de programação com base em sua implementação mais comum (às vezes canônica). Por exemplo, dizemos que C é compilado.

Primeiro, devemos definir intérpretes e compiladores sem ambigüidade:

Um intérprete de linguagem X é um programa (ou uma máquina, ou algum tipo de mecanismo de um modo geral), que executa qualquer programa p escrito em linguagem X de tal forma que ele executa os efeitos e avalia os resultados como prescrito pela especificação de X .

Um compilador de X para Y é um programa (ou uma máquina, ou apenas algum tipo de mecanismo em geral) que traduz qualquer programa p de alguma linguagem X em um programa semanticamente equivalente p ' em alguma linguagem Y de tal forma que interpretar p ' com um intérprete para Y irá produzir os mesmos resultados e têm os mesmos efeitos que a interpretação de p com um intérprete para X .

Observe que, do ponto de vista do programador, as CPUs são intérpretes de máquina para sua respectiva linguagem de máquina nativa.

Agora, podemos fazer uma classificação provisória das linguagens de programação em 3 categorias, dependendo de sua implementação mais comum:

  • Linguagens Hard Compiled: Quando os programas são compilados inteiramente para linguagem de máquina. O único intérprete usado é uma CPU. Exemplo: Normalmente, para rodar um programa em C, o código fonte é compilado em linguagem de máquina, que é então executado por uma CPU.
  • Linguagens interpretadas: quando não há compilação de nenhuma parte do programa original para linguagem de máquina. Em outras palavras, nenhum novo código de máquina é gerado; apenas o código de máquina existente é executado. Um interpretador diferente da CPU também deve ser usado (normalmente um programa) .Exemplo: Na implementação canônica do Python, o código-fonte é compilado primeiro para o bytecode Python e então esse bytecode é executado pelo CPython, um programa interpretador para o bytecode Python .
  • Linguagens compiladas de software: Quando um interpretador diferente da CPU é usado, mas também partes do programa original podem ser compiladas para linguagem de máquina. Este é o caso de Java, onde o código-fonte é compilado para bytecode primeiro e, em seguida, o bytecode pode ser interpretado pelo interpretador Java e / ou compilado posteriormente pelo compilador JIT.

Às vezes, as linguagens compiladas soft e hard são referenciadas como simplesmente compiladas, portanto, C #, Java, C, C ++ são chamados de compilados.

Dentro dessa categorização, o JavaScript costumava ser uma linguagem interpretada, mas isso foi há muitos anos. Hoje em dia, ele é compilado por JIT para linguagem de máquina nativa na maioria das principais implementações de JavaScript, então eu diria que ele cai em linguagens compiladas de software.

MrIo
fonte