OFICINA DA PESQUISA PROGRAMAÇÃO APLICADA À CIÊNCIA DA COMPUTAÇÃO Prof. Msc. Carlos José Giudice dos Santos carlos@oficinadapesquisa.com.br www.oficinadapesquisa.com.br
Compiladores e Interpretadores
Compiladores e Interpretadores [01] Nós já sabemos que computadores só entendem linguagem binária. Desse modo, quando programamos um computador em alguma linguagem de programação, esta linguagem deve ser traduzida para uma linguagem binária. Em relação a esse processo de tradução para uma linguagem binária, existem dois tipos de linguagens: Linguagens compiladas Linguagens interpretadas Os dois tipos de linguagem tem características próprias, vantagens e desvantagens.
Compiladores e Interpretadores [02] Uma boa analogia para se entender o que é uma linguagem compilada é o processo de dublagem de filmes. Todos os filmes geralmente são produzidos no idioma nativo de um país. Por exemplo, os filmes e desenhos de Hollywood são produzidos em inglês, que é o idioma nativo dos EUA. Quando esse filme vai ser comercializado em um país com idioma diferente, todas as falas do filme são traduzidas, do início ao fim, em um processo chamado de dublagem. Repare que nesse processo a tradução é realizada toda de uma só vez, ou seja, todo o filme é dublado, trocando o áudio original produzido em outro idioma (que não entendemos) para um outro áudio em nosso idioma (que somos capazes de compreender).
Compiladores e Interpretadores [03] O processo de interpretação de linguagens de programação é diferente. Para podermos entender, uma boa analogia é a do intérprete. Imagine que você está em um país (por exemplo, a China) e não fala e nem consegue entender nada do que as pessoas dizem. Se você precisar pedir algo para uma pessoa, ela não vai te entender porque ela não fala a sua língua. Nesse caso, você vai precisar de um intérprete. Assim, cada frase que você falar para o intérprete será traduzida para o idioma do país que você está, e desse modo, você se fará entender por meio do intérprete, que traduz, em tempo real, frase após frase. Agora que aprendemos a diferença básica, vamos conhecer um pouco mais as características de cada uma.
Linguagens Compiladas [01] As linguagens compiladas passam por quatro etapas desde o programa escrito em uma linguagem de alto nível até a etapa em que o programa, em código de máquina, é executado pelo computador: Fase 1 Compilação: Nesta fase temos um programa escrito em uma linguagem de alto nível, que é chamado de programa fonte. Este programa fonte passa por um processo chamado de compilação, em que um programa chamado de compilador (compiler) traduz o programa fonte para um programa escrito em linguagem Assembly. O resultado final será um arquivo (não executável), geralmente com a extensão.asm (de Assembly).
Linguagens Compiladas [02] Fase 2 Montagem: Nesta fase temos um programa escrito em uma linguagem de baixo nível (Assembly) que, a partir de um programa chamado de montador (assembler), transforma o programa escrito em Assembly em um ou mais arquivos em linguagem de máquina. Geralmente é gerado um arquivo com o mesmo nome do arquivo em Assembly (chamado de módulo), mas com a extensão.obj, que contém cada instrução da linguagem em Assembly convertido para uma versão binária da instrução. Podem ser gerados também outros arquivos com a extensão.obj, que são rotinas em linguagem de máquina. Arquivos com a extensão.obj são associados geralmente ao Relocatable Object Code. Os outros arquivos gerados possuem informações que são necessárias para colocar as instruções corretamente na memória.
Linguagens Compiladas [03] Fase 3 Link-edição: Nesta fase temos um programa escrito em uma linguagem de baixo nível com a extensão.obj que juntará todas as rotinas em linguagem de máquina para serem armazenadas de forma simbólica na memória. O programa que faz isso chama-se linkeditor. O objetivo do link-editor é resolver as referências de memória, ou seja, determinar os rótulos de dados e de instruções. O link-editor também transforma o arquivo com extensão.obj em um arquivo executável (geralmente com a extensão.exe). Arquivos com extensão.exe são realocáveis na memória, ou seja, podem ser carregados em qualquer parte da memória. Arquivos executáveis com a extensão.com são absolutos, ou seja, só podem ser carregados sempre em uma localização específica de memória.
Linguagens Compiladas [04] Fase 4 Carregamento: Nesta fase já temos um programa executável, ou seja, basta que ele seja carregado para a memória para que seja executado. O programa responsável em carregar este arquivo para a memória a fim de ser executado faz parte do sistema operacional e é conhecido como carregador ou loader. Geralmente o carregador lê o cabeçalho do arquivo executável para determinar o tamanho dos segmentos de texto e de dados. Após essa leitura, o carregador aloca um espaço na memória grande o suficiente para o texto e os dados. Feito isso, carrega o programa (instruções e dados) na memória, inicializa os registradores do processador e começa a executar o programa.
Linguagens Compiladas [05] A principal vantagem das linguagens compiladas é a rapidez de execução, uma vez que o programa executável já está totalmente traduzido para linguagem de máquina. A principal desvantagem das linguagens compiladas acontece no processo de desenvolvimento do programa, pois é um processo que requer muitas modificações, e a cada modificação que é feita no código fonte do programa é necessário fazer todas as etapas de novo (compilação, montagem, link-edição e carregamento) para poder testar a modificação realizada no programa fonte. Exemplos de linguagens compiladas: C, C++, Pascal, Fortran, Delphi, Visual Basic, Objective C.
Linguagens Interpretadas [01] As linguagens interpretadas passam por apenas um programa entre o programa fonte e a sua execução. Este programa é chamado de interpretador, que funciona da seguinte maneira: Lê cada instrução do programa fonte; Verifica se a sintaxe está certa (se a instrução está escrita corretamente). Converte para linguagem de máquina e ordena a execução. Isto significa que o programa não fica armazenado na memória, ou seja, cada instrução é carregada na memória, e após sua execução, ela é perdida, liberando memória para a próxima instrução ser carregada e executada.
Linguagens Interpretadas [02] A principal vantagem das linguagens interpretadas é a economia de memória, já que apenas uma linha de instrução fica armazenada na memória de cada vez. O que ocorre é que a evolução do hardware permitiu um grande aumento da memória RAM, permitindo que os compiladores fossem usados sem problemas em microcomputadores. A principal desvantagem das linguagens interpretadas é a lentidão na execução, uma vez que um programa tem que ser traduzido sempre, linha a linha, mesmo que já tenha sido executado uma vez e não tenha modificações. Esta desvantagem também deixou de ser um problema graças à evolução do hardware, que produz processadores cada vez mais rápidos. Exemplos de linguagens interpretadas: C#, Java, Lisp, Logo, PHP, Python, Ruby, entre outras.
BIBLIOGRAFIA CONSULTADA FORBELLONE, André Luiz Villar. Lógica de programação: a construção de algoritmos e estruturas de dados. 3.ed. São Paulo: Pearson Prentice Hall, 2005. SEBESTA, Robert. W. Conceitos de linguagens de programação. 9. ed. Porto Alegre: Bookman, 2011. TANEMBAUM, Andrew S. Organização estruturada de computadores. 5. ed. São Paulo: Pearson Prentice Hall, 2011.