Introdução à Teoria dos Compiladores/Definições

De Wikiversidade

Sabe-se que um computador só compreende comandos baseados em linguagem binária, porém, mesmo os programas mais simples exigiriam um nível de abstração muito grande do programador, além de despender muito tempo[1]. A Teoria dos Compiladores tem como objetivo estudar e definir os parâmetros que permita a construção de linguagens de programação e sua execução.


Índice

[editar] Compilador

[editar] O que é um compilador

Nt-compilador.png

Um compilador é um programa (ou um conjunto de programas) que traduz um código fonte para uma linguagem de mais baixo nível (a linguagem alvo, que tem uma forma binária conhecida como código objeto). Normalmente, o código fonte é escrito em uma linguagem de programação de alto nível, com grande capacidade de abstração, e o código objeto é escrito em uma linguagem de baixo nível, como uma sequência de instruções a ser executada pelo processador.

O compilador é um dos dois tipos mais gerais de tradutores, juntamente com o interpretador.

[editar] Componentes de um compilador

A construção de um compilador é dividida em partes, cada uma com uma função especifica:

  • Analisador Léxico (AL): separa no programa fonte cada símbolo que tenha algum significado para a linguagem ou avisa quando um símbolo que não faz parte da linguagem é encontrado.
  • Análise Sintática (AS): é o responsável por verificar se a seqüência de símbolos existentes no programa fonte formam um programa válido ou não. É construído sobre uma gramática composta de uma série de regras que descrevem quais são as construções válidas da linguagem.
  • Análise Semântica (ASE): irá verificar se os aspectos semânticos estão corretos, ou seja, se não existem incoerências quanto ao significado das construções utilizadas pelo programador. A ASE depende de uma tabela de símbolos onde são armazenadas as informações de variáveis declaradas, funções ou métodos, entre outros.
  • Geração e Otimização de Código (GC): após a verificação que não existem erros sintáticos ou semânticos, o compilador realiza a sua tarefa de criar o programa objeto que reflete, mediante instruções de baixo nível, os comandos do programa fonte. Também pode fazer a otimização do código, onde são aplicadas diversas técnicas para otimizar algumas características do programa objeto, como o seu tamanho ou sua velocidade.

[editar] O processo de compilação

O processo de compilação é composto de análise e síntese.

A análise tem como objetivos entender o código fonte, verificar erros, falhas e inconsistências, e representá-lo em uma estrutura intermediária. Pode ser subdividida ainda em análise léxica, análise sintática e análise semântica.

A síntese constrói o código objeto a partir desta representação intermediária, e é mais variada, podendo ser composta pelas etapas de Geração de código intermediário, otimização de código e geração de código final (ou código de máquina), sendo somente esta última etapa obrigatória.


[editar] Pré-processador

Muitos compiladores incluem um pré-processador. Um pré-processador normalmente é responsável por mudanças no código fonte destinadas de acordo com decisões tomadas em tempo de compilação. Por exemplo, um programa em C permite instruções condicionais para o pré-processador que podem incluir ou não parte do código caso uma assertiva lógica seja verdadeira ou falsa, ou simplesmente um termo esteja definido ou não. Tecnicamente, pré-processadores são muito mais simples que compiladores e são vistos pelos desenvolvedores como programas à parte, apesar dessa visão não ser necessariamente compartilhada pelo usuário.


[editar] Linker

Outra parte separada do compilador que muitos usuários vêem como integrada é o linker, cuja função é unir vários programas já compilados de uma forma independente e unificá-los em um programa executável. Isso inclui colocar o programa final em um formato compatível com as necessidades do sistema operacional para carregá-lo em memória e colocá-lo em execução.

[editar] Interpretador

[editar] O que é um interpretador

Interpretadores são programas de computador que lêem um código fonte de uma linguagem de programação e os convertem em código executável. Seu funcionamento pode variar de acordo com a implementação. Em muitos casos o interpretador lê linha-a-linha e converte em código objeto à medida que vai executando o programa. Linguagens interpretadas são mais dinâmicas por não precisarem escrever-compilar-testar-corrigir-compilar-testar-distribuir, e sim escrever-testar-corrigir-escrever-testar-distribuir. Mas existem também linguagens que funcionam tanto como interpretadores quanto como compiladores, como, por exemplo, Python (quando requerido).

A princípio, podem-se implementar compiladores e interpretadores para qualquer linguagem de programação. Mas para determinadas linguagens é mais fácil "fabricar" interpretadores, e para outras é mais prático um compilador.

[editar] Bytecode

Bytecode

Como vimos, um compilador traduz um programa de uma linguagem textual, facilmente entendida por um ser humano, para uma linguagem de máquina, específica para um processador e um sistema operacional.

Em linguagens de programação híbridas, o compilador tem o papel de converter o código fonte em um código chamado de Bytecode (código em bytes), que é um estágio intermediário entre o código-fonte (escrito numa linguagem de programação específica) e a aplicação final.

Para executar o bytecode utilizamos uma máquina virtual, que serve para interpretar e executar o bytecode.

As principais vantagens do bytecode são:

  • Portabilidade (Independecia de Sistema Operacional) — pois o bytecode roda na máquina virtual, e não no Sistema Operacional do equipamento.
  • Não-necessidade do pré-processamento, típico dos compiladores.

O bytecode é encarado como um produto final, cuja validação da sintaxe e tipos de dados (entre outras funções dos compiladores) não será necessária.

Como exemplo de linguagens que utilizam bytecode temos: Java, C# e Lua.

[editar] Just-In-Time Compiler (JIT)

Um compilador é chamado de Just-in-time compiler (JIT) quando seu processo de compilação acontece apenas quando o código é chamado. Normalmente, o usuário tem a percepção que um compilador JIT é um interpretador.

Writing.png Esta página é somente um esboço.
Ampliando-a você ajudará a melhorar a Wikiversidade.


[editar] Bibliografia e Referências

[editar] Notas

  1. http://www.guiadohardware.net/termos/compilador

[editar] Bibliografia