Diferenças entre linguagem compilada e linguagem interpretada


Com a popularização de linguagens como Java e C#, e sua forte adoção no mercado de TI, é comum nos depararmos com debates sobre as diferenças entre linguagens interpretadas e linguagens compiladas. Mas na hora de classificar uma linguagem como interpretada ou compilada, a coisa esquenta e ninguém entra em acordo! Mas afinal, o que é uma linguagem interpretada e o que é uma linguagem compilada?

Antes de mais nada, vamos definir nosso glossário:

O dicionário da língua portuguesa define Compilar:

do Latim compilare
v. tr.
reunir; ajuntar

Enquanto a definição de Interpretar, é:

do Latim interpretare
v. tr.
tornar claro o sentido de; explicar; traduzir; fazer juízo a respeito de.

Pelas definições desses dois verbos, já podemos perceber que seus significados não se opõe, mas se complementam. Então como classificar uma linguagem de programação como sendo de um jeito ou de outro? Bem, a resposta é simples, definindo o contexto ou ponto de vista! E como estamos analisando linguagens de programação, nosso contexto é arquitetura de linguagens de programação.

Na computação, a compilação é o processo que reúne o código fonte e o transforma em algo que faça mais sentido para o computador. Do ponto de vista do código fonte, toda linguagem de programação é compilada.

O produto final do processo de compilação de uma linguagem diz muito sobre seu design. Linguagens como C e C++ são compiladas estaticamente, e seus códigos fontes são transformados diretamente em linguagem de máquina. Enquanto as linguagens mais modernas como Java, C# e Python têm seus códigos fontes transformados em uma linguagem intermediária (específica de cada linguagem), que será interpretada pela máquina virtual da linguagem quando o programa for executado.

Este processo de interpretação da linguagem intermediária durante a execução do programa, consiste na tradução dos comandos da linguagem intermediária para linguagem de máquina. Sendo assim, em tempo de execução, o código intermediário pode ser encarado como um “código fonte” que será compilado dinamicamente pelo interpretador da linguagem em código de máquina.

Obviamente, ter este processo de compilação embutido na execução do programa tem um custo. E esse custo não é barato! Por isso, nos últimos anos muito foi investido para otimizar este processo, resultando em todas as técnicas de Just In Time Compiling e Ahead of Time Compiling que permitem as linguagens interpretadas alcançarem performance excepcionais.

Finalmente, com base nestas definições, podemos dizer que C e C++ são linguagens compiladas. Enquanto Java, C# e Python, mesmo com as técnicas de JIT e AOT, são linguagens interpretadas, afinal, esta é uma definição da arquitetura da linguagem de programação.

, , , , , , , , ,

  1. #1 por Rodrigo Cacilhas - 8 de setembro de 2008 em 17:14

    Bom artigo!

    Bem explicativo e bastante claro. =)

    Para complementar, poderia ter comentado tecnologias intermediárias, como a interpilação, ou a carga de código embarcado.

    A interpilação é uma varição de interpretação/compilação onde o código é todo compilado de uma só vez no início da execução para um objeto executável existente apenas na memória principal, então esse objeto é executado, mas não persiste em disco. Perl faz uso dessa tecnologia.

    Também a linguagem Lua pode ser embarcada em um código C ou C++, que é compilado, mas o código Lua não.

    O código Lua é carregado em tempo de execução em um «estado Lua», como uma compilação para bytecode, mas executada por bibliotecas ligadas no próprio programa.

    São tecnologias intermediárias. =)

    Parabéns pelo artigo!

    []‘s
    Cacilhas, La Batalema

  2. #2 por Rafael Lima - 9 de setembro de 2008 em 13:10

    BOA!

    Mandou bem…

  3. #3 por Henrique Bastos - 10 de setembro de 2008 em 00:38

    @Cacilhas! Muito boa observação! A tendência com relação as diferenças destes dois conceitos é desenvolver técnicas que possibilitem unir ao máximo, o melhor dos dois mundos. Valeu a visita!

    @Rafael E vamos continuar à lá Romário… rumo ao milésimo post! :D

  4. #4 por Tarcio - 2 de junho de 2009 em 14:35

    Ótimo comentário!

    Me ajudou muito..

    Obrigado!

  5. #5 por Elizeu Júnior - 2 de setembro de 2009 em 09:49

    bacana, valew mesmo…

  6. #6 por Anamim - 30 de setembro de 2009 em 18:38

    Artigo muito bom, bastante esclareceredor e bem escrito de forma direta.

    Obrigado pela ajuda.

    Abs.
    Anamim Silva.

  7. #7 por Wilson de Almeida - 1 de janeiro de 2010 em 21:45

    Muito bem explicado!!!

    Abços, wilson

  8. #8 por Katita - 5 de fevereiro de 2010 em 12:51

    Bom artigo!
    Bastante exclarecedor e muito bem complementado pelo #1 por Rodrigo Cacilhas.

    também me ajudou…
    grata!

  9. #9 por Diego - 22 de junho de 2010 em 20:20

    nossa me ajudo muito em ……. Obrigado :)

  10. #10 por KAREN fernandes - 30 de julho de 2010 em 10:31

    muito bom o artigo bem esclarecedor pra mim foi otimo pois tirou todas as minhas duvidas obrigada

  11. #11 por kayaman - 7 de setembro de 2010 em 19:00

    O texto me lembra aquelas definições de dicionário, do tipo: “JAVA is a 4 letter word that starts with J.” Apenas faz referencia a Wikipedia.

  12. #12 por Mariana Coelho - 14 de junho de 2011 em 13:19

    Meu professor nunca me explicou isso dessa maneira.
    Tive que ler umas 3 vezes para entender bem…mas pelo menos entendii

    valeu

  13. #13 por Mauricio - 27 de fevereiro de 2012 em 15:39

    Você sabe se na linguagem C# dá pra criar os Enhancement Points, igual como é feito no SAP, via ABAP?

(não será publicado)