Qual a diferença entre linguagem compilada, interpretada e JIT (Just in Time)?

27 de julho de 2022
Ronaldo B.

Quando estamos aprendendo programação, é muito comum ouvir as expressões “Linguagem compilada” e “Linguagem interpretada”. É comum até mesmo presenciar algumas conversas sobre qual dessas opções é a melhor e mais vantajosa.

Mas talvez nos perguntemos: “Qual a diferença entre essas estruturas afinal?” Neste artigo iremos explicar essa diferença e também mostrar as vantagens de cada uma.

Para começar, precisamos lembrar qual é o nosso objetivo ao criar um programa. Nosso objetivo é que o código que desenvolvemos seja executado pelo computador e possamos assim ver um resultado na tela, não importa qual linguagem de programação tenhamos usado.

Para que o programa seja executado pelo computador, ele precisa estar em uma linguagem que a CPU consiga entender. E nós sabemos que o computador não compreende as linguagens de programação. Por exemplo, não podemos dizer que um computador consiga ler PHP, JavaScript, Python ou C++. O computador entende a linguagem de máquina, baseada no sistema binário (0 e 1). Assim, nós precisamos transformar o nosso código em binário para que ele seja executado. Para chegar a esse objetivo, temos diferentes “estratégias” ou arquiteturas. Podemos fazer isso por 1) compilar nosso código ou 2) por interpretá-lo. Iremos falar sobre cada um deles agora.

Código Compilado

A primeira opção que possuímos é compilar o nosso código. O verbo “compilar” pode passar a ideia de converter um objeto em outro. Assim, podemos dizer que o processo de compilação envolve converter o nosso código para linguagem de máquina através de um programa chamado compilador.

O verbo “compilar” também pode significar condensar um vasto objeto em um resultado final. Isso nos ajuda a entender outro processo que o compilador faz. Ele converte todo o nosso código de uma vez. Ou seja, ele como que seleciona o nosso inteiro código, converte-o para binário e guarda o resultado em um único “pacote”, como se fosse um “arquivo zipado”, que é enviado para o nosso cliente final já pronto para ser executado. Um resumo desse processo pode ser visto na imagem abaixo:

Resumo de como funciona um código compilado

O processo de compilação traz muitas vantagens. Primeiramente, o cliente final não tem acesso ao código-fonte de nosso projeto, visto que recebe apenas o código binário para ser executado. Outra vantagem é a performance. Como compilamos o código inteiro, não precisamos ficar repetindo esse processo desnecessariamente. Além disso, já teremos à mão tudo aquilo que é necessário para a execução, o que aumenta muito a velocidade deste processo.

Alguns exemplos de linguagens de programação que são compiladas são o C++ e Objective-C.

Código Interpretado

Um outro tipo de código que possuímos é o código interpretado. Quando pensamos em interpretar, pode ser que pensemos em alguém que trabalhe como intérprete. Isso envolve receber uma informação de uma linguagem fonte e transmiti-la de maneira traduzida para uma linguagem alvo.

Uma linguagem interpretada executa um processo similar. Ela será interpretada por meio de um programa chamado interpretador, que irá então converter nosso código para linguagem de máquina. Contudo, esse processo irá ocorrer aos poucos, pois o interpretador irá realizar a conversão analisando linha por linha, e não o programa inteiro, diferentemente do que ocorre com o compilador.

A imagem abaixo traz um resumo do processo de interpretação:

Resumo de como funciona um código interpretado

Conseguimos perceber que o processo de interpretação será mais lento, pois será executado de maneira repetida, e isso diminui a performance. Sabemos que nosso usuário final provavelmente não irá perceber essa diferença de velocidade, pois isso ocorre por “debaixo dos panos”. Entretanto, sabemos que esse é um fator muito importante em qualquer programa.

Mesmo possuindo a desvantagem da performance, as linguagens interpretadas possuem a vantagem de ser mais simples de “debugar”. Como a interpretação ocorre aos poucos, podemos visualizar com mais facilidade os erros que podem aparecer, e se constatarmos algum problema, poderemos prontamente resolvê-los. Isso é uma vantagem do código interpretado em relação ao compilado, que é mais difícil de debugar, visto que o código é executado todo de uma só vez.

Alguns exemplos de linguagens de programação que são interpretadas são o PHP, JavaScript e Python.

Após essa análise conseguimos analisar os prós e contras de programas compilados e interpretados. Entretanto, ainda existe uma terceira alternativa, que consegue mesclar os dois conceitos e pode nos trazer muitos benefícios.

JIT - A junção dos dois conceitos

A próxima arquitetura que iremos analisar é o JIT, que significa “Just in Time”. Não confunda esse termo com o sistema de produção da Toyota, que popularizou o termo ?. Mesmo sendo um termo diferente, esse conceito da programação possui um objetivo similar ao que foi implementado pela montadora japonesa. Esse objetivo é otimizar a produção.

Quando falamos de JIT na programação, estamos nos referindo a uma técnica que envolve mesclar conceitos de códigos compilados e interpretados. Com o JIT nós continuamos a interpretar os códigos. Entretanto, nós também iremos compilá-los, mas apenas a parte do código que iremos usar no momento da execução. Isso representa um aumento muito grande de performance. Pois iremos usar o processo de compilação, que já é rápido, e ele será executado em partes isoladas do código, apenas na hora certa (“just in time”).

Assim, nós temos à nossa disposição “o melhor dos dois mundos”. Temos a velocidade da compilação junto com a simplicidade de debugar nosso código.

Linguagens que implementaram a técnica do JIT notaram grandes mudanças no desempenho dos seus códigos. Entre esses exemplos estão o JavaScript e o PHP a partir da versão 8.

Conclusão

Neste artigo aprendemos a diferença entre linguagens compiladas e interpretadas. E também aprendemos sobre uma técnica que aproveita o melhor de cada uma dessas arquiteturas, o JIT. Esperamos que essa explicação possa ter nos ajudado a entender um pouco melhor o processo necessário para um programa ser executado. Com esses conceitos em mente também estamos mais preparados para decidir quais linguagens utilizar levando em conta suas arquiteturas e também as circunstâncias e requisitos de cada projeto que formos trabalhar.

Até o próximo artigo ?.

Hcode: Utilizamos cookies para a personalização de anúncios e experiências de navegação dentro de nosso site. Ao continuar navegando, você concorda com as nossas Política de Privacidade.