Fases do compilador com exemplo, processo e etapas.
โก Resumo Inteligente
As fases de um compilador descrevem como ele transforma o cรณdigo-fonte em cรณdigo de mรกquina por meio de seis etapas: anรกlise lรฉxica, anรกlise sintรกtica, anรกlise semรขntica, geraรงรฃo de cรณdigo intermediรกrio, otimizaรงรฃo de cรณdigo e geraรงรฃo de cรณdigo, com suporte do gerenciamento da tabela de sรญmbolos e tratamento de erros em todo o processo.
Quais sรฃo as fases do design do compilador?
Compilador opera em vรกrias fases, cada fase transforma o programa fonte de uma representaรงรฃo para outra. Cada fase recebe entradas de seu estรกgio anterior e alimenta sua saรญda para a prรณxima fase do compilador.
Existem 6 fases em um compilador. Cada uma dessas fases auxilia na conversรฃo da linguagem de alto nรญvel em cรณdigo de mรกquina. As fases de um compilador sรฃo:
- Anรกlise lรฉxica
- Anรกlise de sintaxe
- Anรกlise semรขntica
- Gerador de cรณdigo intermediรกrio
- Code otimizador
- Code gerador

Todas essas fases convertem o cรณdigo-fonte dividindo-o em tokens, criando รกrvores de anรกlise e otimizando o cรณdigo-fonte por diferentes fases.
Fase 1: Anรกlise Lexical
A Anรกlise Lexical รฉ a primeira fase em que o compilador verifica o cรณdigo-fonte. Este processo pode ser feito da esquerda para a direita, caractere por caractere, e agrupar esses caracteres em tokens.
Aqui, o fluxo de caracteres do programa de origem รฉ agrupado em sequรชncias significativas, identificando os tokens. Ele faz a entrada dos tickets correspondentes na tabela de sรญmbolos e passa esse token para a prรณxima fase.
As principais funรงรตes desta fase sรฃo:
- Identifique as unidades lexicais em um cรณdigo-fonte
- Classifique as unidades lexicais em classes como constantes, palavras reservadas e insira-as em tabelas diferentes. Irรก ignorar comentรกrios no programa de origem
- Identifique o token que nรฃo faz parte do idioma
Exemplo:
x = y + 10
Tokens
| X | identificador |
| = | Operador de atribuiรงรฃo |
| Y | identificador |
| + | Operador de adiรงรฃo |
| 10 | Sessรฃo |
Fase 2: Anรกlise de Sintaxe
A anรกlise de sintaxe trata da descoberta da estrutura do cรณdigo. Determina se um texto segue ou nรฃo o formato esperado. O principal objetivo desta fase รฉ garantir que o cรณdigo-fonte escrito pelo programador esteja correto ou nรฃo.
A anรกlise de sintaxe รฉ baseada nas regras baseadas na linguagem de programaรงรฃo especรญfica, construindo a รกrvore de anรกlise com a ajuda de tokens. Tambรฉm determina a estrutura do idioma de origem e a gramรกtica ou sintaxe do idioma.
Aqui estรก uma lista de tarefas realizadas nesta fase:
- Obtenha tokens do analisador lรฉxico
- Verifica se a expressรฃo estรก sintaticamente correta ou nรฃo
- Reportar todos os erros de sintaxe
- Construa uma estrutura hierรกrquica conhecida como รกrvore de anรกlise
Exemplo
Qualquer identificador/nรบmero รฉ uma expressรฃo
Se x for um identificador e y+10 for uma expressรฃo, entรฃo x= y+10 รฉ uma instruรงรฃo.
Considere a รกrvore de anรกlise para o exemplo a seguir
(a+b)*c
Na รกrvore de anรกlise
- Nรณ interior: registro com um arquivo de operador e dois arquivos para filhos
- Folha: registros com 2/mais campos; um para token e outras informaรงรตes sobre o token
- Garantir que os componentes do programa se encaixem de forma significativa
- Reรบne informaรงรตes de tipo e verifica a compatibilidade de tipo
- Os operandos de verificaรงรฃo sรฃo permitidos pelo idioma de origem
Fase 3: Anรกlise Semรขntica
A anรกlise semรขntica verifica a consistรชncia semรขntica do cรณdigo. Ele usa a รกrvore de sintaxe da fase anterior junto com a tabela de sรญmbolos para verificar se o cรณdigo-fonte fornecido รฉ semanticamente consistente. Tambรฉm verifica se o cรณdigo estรก transmitindo um significado apropriado.
O Semantic Analyzer verificarรก incompatibilidades de tipo, operandos incompatรญveis, uma funรงรฃo chamada com argumentos imprรณprios, uma variรกvel nรฃo declarada, etc.
As funรงรตes da fase de anรกlise semรขntica sรฃo:
- Ajuda vocรช a armazenar informaรงรตes de tipo coletadas e salvรก-las na tabela de sรญmbolos ou na รกrvore de sintaxe
- Permite realizar verificaรงรฃo de tipo
- No caso de incompatibilidade de tipos, onde nรฃo existem regras exatas de correรงรฃo de tipos que satisfaรงam a operaรงรฃo desejada, um erro semรขntico รฉ mostrado
- Coleta informaรงรตes de tipo e verifica a compatibilidade de tipo
- Verifica se o idioma fonte permite ou nรฃo os operandos
Exemplo
float x = 20.2; float y = x*30;
No cรณdigo acima, o analisador semรขntico irรก converter o inteiro 30 para float 30.0 antes da multiplicaรงรฃo
Fase 4: Intermediรกria Code Generation
Assim que a fase de anรกlise semรขntica termina, o compilador gera um cรณdigo intermediรกrio para a mรกquina de destino. Este cรณdigo representa um programa para algum valor absoluto.tracmรกquina t.
O cรณdigo intermediรกrio estรก entre a linguagem de alto nรญvel e a linguagem de mรกquina. Esse cรณdigo intermediรกrio precisa ser gerado de forma que seja fรกcil traduzi-lo no cรณdigo de mรกquina de destino.
Funรงรตes no nรญvel intermediรกrio Code geraรงรฃo:
- Deve ser gerado a partir da representaรงรฃo semรขntica do programa fonte
- Contรฉm os valores calculados durante o processo de traduรงรฃo
- Ajuda vocรช a traduzir o cรณdigo intermediรกrio para o idioma de destino
- Permite manter a ordem de precedรชncia do idioma de origem
- Ele contรฉm o nรบmero correto de operandos da instruรงรฃo
Exemplo
Por exemplo, nos
total = count + rate * 5
O cรณdigo intermediรกrio com a ajuda do mรฉtodo de cรณdigo de endereรงo รฉ:
t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3
Fase 5: Code Operacional
A prรณxima fase รฉ a otimizaรงรฃo do cรณdigo ou cรณdigo intermediรกrio. Esta fase remove linhas de cรณdigo desnecessรกrias e organiza a sequรชncia de instruรงรตes para acelerar a execuรงรฃo do programa sem desperdiรงar recursos. O principal objetivo desta fase รฉ melhorar o cรณdigo intermediรกrio para gerar um cรณdigo que rode mais rรกpido e ocupe menos espaรงo.
As principais funรงรตes desta fase sรฃo:
- Ajuda vocรช a estabelecer uma compensaรงรฃo entre velocidade de execuรงรฃo e velocidade de compilaรงรฃo
- Melhora o tempo de execuรงรฃo do programa alvo
- Gera cรณdigo simplificado ainda em representaรงรฃo intermediรกria
- Removendo cรณdigo inacessรญvel e livrando-se de variรกveis โโnรฃo utilizadas
- Removendo instruรงรตes que nรฃo sรฃo alteradas do loop
Exemplo:
Considere o seguinte cรณdigo
a = intofloat(10)
b = c * a
d = e + b
f = d
Pode se tornar
b =c * 10.0 f = e+b
Fase 6: Code Generation
Code A geraรงรฃo รฉ a รบltima fase de um compilador. Ela recebe entradas das fases de otimizaรงรฃo de cรณdigo e produz o cรณdigo de pรกgina ou cรณdigo objeto como resultado. O objetivo desta fase รฉ alocar espaรงo de armazenamento e gerar cรณdigo de mรกquina relocรกvel.
Tambรฉm aloca locais de memรณria para a variรกvel. As instruรงรตes do cรณdigo intermediรกrio sรฃo convertidas em instruรงรตes de mรกquina. Esta fase converte o cรณdigo otimizado ou intermediรกrio na linguagem de destino.
A linguagem alvo รฉ o cรณdigo de mรกquina. Portanto, todos os locais de memรณria e registros tambรฉm sรฃo selecionados e alocados durante esta fase. O cรณdigo gerado por esta fase รฉ executado para receber entradas e gerar saรญdas esperadas.
Exemplo
uma = b + 60.0
Seria possivelmente traduzido para registros.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Gerenciamento de tabela de sรญmbolos
Uma tabela de sรญmbolos contรฉm um registro para cada identificador com campos para os atributos do identificador. Este componente torna mais fรกcil para o compilador pesquisar o registro do identificador e recuperรก-lo rapidamente. A tabela de sรญmbolos tambรฉm auxilia no gerenciamento do escopo. A tabela de sรญmbolos e o manipulador de erros interagem com todas as fases e a tabela de sรญmbolos รฉ atualizada de forma correspondente.
Rotina de tratamento de erros
No processo de design do compilador, pode ocorrer erro em todas as fases fornecidas abaixo:
- Analisador lรฉxico: tokens escritos incorretamente
- Analisador de sintaxe: parรชnteses ausentes
- Gerador de cรณdigo intermediรกrio: operandos incompatรญveis para um operador
- Code Otimizador: Quando a instruรงรฃo nรฃo รฉ alcanรงรกvel
- Code Generator: Quando a memรณria estรก cheia ou os registros adequados nรฃo estรฃo alocados
- Tabelas de sรญmbolos: erro de vรกrios identificadores declarados
Os erros mais comuns sรฃo sequรชncias de caracteres invรกlidas na varredura, sequรชncias de tokens invรกlidas no tipo, erro de escopo e anรกlise na anรกlise semรขntica.
O erro pode ser encontrado em qualquer uma das fases acima. Apรณs encontrar os erros, a fase precisa lidar com os erros para continuar com o processo de compilaรงรฃo. Esses erros precisam ser relatados ao manipulador de erros que trata o erro para executar o processo de compilaรงรฃo. Geralmente, os erros sรฃo relatados na forma de mensagem.


