Introdução à programação e aos algoritmos

João Araujo Ribeiro · Capítulo 20 de 103

Páginas do PDF

Introdução à programação e aos algoritmos

1.11 Compilada ou Interpretada

Existem centenas de linguagens de programação, cada uma voltada para um nicho de resolução de problemas. Sempre digo aos meus alunos que não existe a linguagem perfeita, que resolva todos os problemas. Cada uma tem sua especificidade. Por exemplo, a primeira linguagem de alto nível, FORTRAN, é uma linguagem voltada para a resolução de problemas que envolvem muitos cálculos. Seu nome já diz isso, FORTRAN vem de Formula Translation, tradução de fórmula. Depois veio COBOL, uma linguagem voltada para resolver problemas comerciais e de escritório, como gerar folhas de pagamento. Existem linguagens voltadas para a programação web, como PHP, linguagens para programação de software básico, como C, e linguagens para programação gráfica, como Lua.

 

1.11 COMPILADA OU INTERPRETADA

A tradução da linguagem de alto nível em linguagem de máquina pode ser feita de duas maneiras básicas: compilação ou interpretação.

Na compilação, um programa-fonte escrito em uma linguagem de programação é traduzido completamente em um programa em linguagem de máquina, e esse resultado é salvo como um novo arquivo que será executado na máquina física. Neste caso usamos um programa chamado compilador. A saída do processo é

chamada de programa-objeto (Figura 1.18).

O programa-objeto ainda não está pronto para ser executado. Normalmente, há diversas funções que são usadas com frequência, mas que não fazem parte da linguagem de programação. Por exemplo, se você usa muitas vezes uma função de raiz quadrada, não faria sentido programar uma função que faça esse cálculo toda vez que for iniciar um novo programa. Você pode colocar esta função em uma biblioteca, ou o próprio desenvolvedor da linguagem pode oferecer uma biblioteca de funções com a função da raiz quadrada.

Um programa chamado ligador (linker) fará a ligação do

programa-objeto gerado pelo compilador com as bibliotecas de funções. O processo de compilação e ligação pode ser integrado e você nem se dará conta de que a compilação tem um passo suplementar de ligação. Os detalhes desse processo fogem do escopo deste livro.

 

Figura 1.18 Compilação de um programa.

 

No processo de tradução entre a linguagem de alto nível e a

linguagem de máquina, o compilador pode encontrar erros de sintaxe; então irá gerar mensagens de erros para que o programador possa corrigi-los. O programa executável somente será gerado quando não houver mais erros de compilação.

Uma vez gerado o programa-objeto, não precisamos mais do

compilador e podemos executar o programa quantas vezes quisermos, com uma entrada de dados opcional.

Como cada processador tem um tipo próprio de linguagem de máquina, o compilador gera programas-objeto apenas para o tipo de máquina para o qual foi criado. Assim, uma linguagem de programação necessita de um compilador diferente para cada tipo de computador ou ambiente computacional.

A compilação é usada em linguagens de programação, como C, C++ e FORTRAN.

A outra maneira é traduzir linha por linha do programa em linguagem de alto nível para linguagem de máquina, executando uma linha por vez. Neste caso usamos um interpretador. Note que o programa precisa do interpretador para executar, pois as ações

ocorrem dentro do ambiente do interpretador (conforme Figura

1.19).

Se houver dados, estes são processados pela execução desta linha no ambiente do interpretador. Se não houver erros, o interpretador lê a próxima linha do programa-fonte e repete o processo até que todas as linhas sejam lidas e o programa chegue ao seu final. Linguagens como Python, Java e Javascript são interpretadas.

Figura 1.19 Interpretação de um programa.

 

Existem vantagens e desvantagens em cada tipo de tradução. O

uso do compilador cria programas mais eficientes em tempo de execução, pois o programa-objeto é executado diretamente, sem passar pelo compilador. Uma vez gerado o programa-objeto, este pode ser executado diversas vezes, sem necessidade do compilador. Um programa interpretado sempre vai precisar do ambiente do interpretador, e todo o processo de execução se torna mais lento, pois o interpretador deve ler e executar cada linha antes de passar para a próxima. Do mesmo modo, mesmo que uma linha já tenha sido lida e interpretada, deverá ser lida e interpretada quantas vezes aparecer durante a execução do código, se não for feita nenhuma otimização.

O uso do interpretador permite acompanhar a execução do

código passo a passo, mas a grande vantagem dos interpretadores sobre os compiladores é a portabilidade dos programas entre várias máquinas. Como já dito, cada processador tem seu conjunto próprio de comandos. Mesmo que sejam utilizados os mesmos processadores, diferentes arquiteturas de computadores criam dificuldades quando se deseja executar o mesmo programa-objeto. Como o interpretador não gera um programa-objeto, basta ter um interpretador de uma linguagem para uma máquina e os programas escritos naquela linguagem poderão ser executados. Esta parece ser a principal razão de existirem linguagens interpretadas.

Para compensar a queda de desempenho do uso de linguagens

interpretadas, existe um meio-termo entre a compilação e a interpretação. De fato, entre esses dois estilos de tradução pode haver qualquer nível de compilação mesclada com interpretação.

A ideia aqui é usar uma máquina virtual que vai permitir uma

geração padronizada de programas-objeto. O compilador vai gerar código para esta máquina virtual e não para a máquina real. Isso facilita o projeto de compiladores, que agora têm de ser projetados

para apenas uma máquina padronizada (conforme Figura 1.20).