programação
Back

Tipos de execução

O objetivo principal aqui não é detalhar totalmente o conceito de cada execução nem trazer os mais aprofundados conceitos de cada um, mas sim dar um norte aos que são totalmente iniciantes nesse mundo e quer uma explicação prática sobre o que são os tipos de execução que tanto ouvem por aí nas comunidades afora de diversas linguagens de programação existentes.

Dito isto, uma breve explicação sobre como funcionam as linguagens de programação, em um post anterior publiquei sobre a diferença entre as linguagens de baixo e alto nível que você pode conferir aqui, pois bem, cada qual tem suas particularidades, e dentre elas seus respectivos tipos de execução e também paradigma de programação (assunto para outro post que já está em rascunho), hoje especificamente vamos nos ater somente aos tipos de execução, que são eles, as linguagens: compiladas; interpretadas e híbridas.

Compiladas

Compilar no dicionário, tem por definição: "Condensar alguma coisa (documentos, textos, poesias etc.) numa única obra: compilar artigos."

"Fazer a conversão de um programa, criado numa linguagem simbólica de nível elevado, para a linguagem de máquina."

Ou seja, uma linguagem compilada terá o seu código fonte "transformado" para a linguagem de máquina de um determinado processador, digamos que você escreva um hello world em C.

#include <stdio.h>
int main(){
printf("Hello world!");
return 0;
}

Esse código por si só, não passa de um arquivo de texto, para executarmos e ele efetivamente exibir na tela o que foi pedido, precisamos traduzir (compilar) de maneira que as instruções possam ser interpretadas pelo computador, ou qualquer outra máquina para qual esteja programando. A linguagem compilada irá gerar um arquivo binário executável, os famosos ".exe" do windows.

Nesta estratégia, os softwares que realizam a tradução e a execução atuam em fases separadas do processo. O software que realiza a tradução, chamado compilador, traduz todo o código fonte de uma vez e produz um arquivo em linguagem de máquina, chamado código objeto. Este arquivo fica armazenado no computador e é processado pelo executável quando o usuário resolve executar o programa.

Segue abaixo um fluxograma que ilustre esse funcionamento:

https://i.imgur.com/5GxRll8.png

Código fonte "independente do sistema operacional" → Compilador "atua cada vez que se modifica o programa" → Código objeto "Depende do sistema operacional" → Executável "atua cada vez que executa o programa".

Uma linguagem que utiliza esse tipo de execução e é muito conhecida é a linguagem C.

Interpretadas

Nesta estratégia, o software que comanda a tradução também comanda a execução do programa. Tal software é chamado interpretador. Ele faz a leitura de cada linha do código fonte, traduz em linguagem de máquina os comandos correspondentes, e executa estes comandos.

As linguagens interpretadas, normalmente não necessitam de um passo específico de compilação para executar, o próprio código fonte escrito será executado através de um interpretador, o JavaScript por exemplo (Não confunda com Java), será interpretado pelo navegador, o texto em JavaScript será o seu código fonte e o navegador será o interpretador desse código, também chamamos esse processo como "compilação em tempo de execução", o interpretador vai fazendo uma espécie de tradução para a máquina por baixo dos panos durante o tempo em que está fazendo a leitura do seu código fonte.

Os códigos de linguagens interpretadas são, na maioria das vezes, muito fácil de portar de uma máquina para outra, ou até mesmo entre sistemas operacionais diferentes, por não haver a necessidade de compilar o código, basta que tenha o interpretador disponível, como por exemplo o navegador para interpretar o JavaScript, o queridinho JS para os íntimos hahaha.

Um fluxograma que ilustre o funcionamento de um código interpretado, seria basicamente assim:

https://i.imgur.com/FVpz9TI.png

O interpretador por sua vez faz a comunicação com a máquina onde está executando o código, mas ele que faz todo o restante do trabalho ao invés de você precisar compilar, para cada máquina um binário diferente.

Como exemplo de linguagem interpretada, como já dito anteriormente, temos o JS, e além dele temos outras como PHP, R, Ruby e etc.

Híbridas

Aqui entra o meio de campo entre as linguagens compiladas e interpretadas, são as linguagens que são compiladas e interpretadas.

O método híbrido, representa um meio termo entre os compiladores e os interpretadores. Ele traduz (compila) os programas em linguagem de alto nível para uma linguagem intermediária projetada para facilitar a interpretação. Depois, usa um interpretador.

Os Sistemas de implementação híbridos são mais rápidos do que a interpretação pura pelo fato de trabalharem com a etapa de compilação, porque as sentenças da linguagem fonte são decodificadas apenas uma vez. Em um interpretador puro, todas as linhas são interpretadas em todas as vezes que o programa é rodado. No modelo híbrido, o código compilado pode ser reutilizado, por isso algumas partes do código-fonte são decodificadas apenas uma vez, evitando repetir a mesma operação nas versões seguintes.

JIT

Um sistema de implementação Just-in-Time (JIT) inicialmente traduz os programas para uma linguagem intermediária. Então, durante a execução, compila os métodos da linguagem intermediária para linguagem de máquina quando esses são chamados. A versão em código de máquina é mantida para chamadas subsequentes. Sistemas JIT são bastante usados para programas Java. As linguagens .NET também são todas implementadas com um sistema JIT.

O mundo perfeito

Analisando os prós e contras de cada implementador de linguagens, parece claro que ambos possuem vantagens complementares. O interpretador é melhor durante o desenvolvimento porque é preciso rodar o programa várias vezes até ele ficar pronto. Depois de pronto o código, o compilador é melhor porque é mais rápido.

Algumas vezes, um implementador pode fornecer tanto implementações compiladas quanto interpretadas para uma linguagem. Nesses casos, ele pode ser usado exatamente com os prós de cada abordagem. O interpretador é usado para desenvolver e depurar programas e, após um estado (relativamente) livre de erros ser alcançado, os programas são compilados para aumentar sua velocidade de execução.

Desta forma, uma linguagem de programação pode ser dita como compilada, interpretada ou compilada e interpretada (híbrida).