Implementação de Compiladores

Enviado em: 04/04/2008
Autor(es): Glaucia Bittencourt Tristão e Cleber Stefanello Pippi

Este artigo descreve a implementação de compiladores, apresentando um resumo de seus conceitos e algumas aplicações.

1. Compiladores

Um compilador é um programa que converte uma linguagem de fácil escrita e leitura, para programadores em uma linguagem que possa ser interpretada e executada pelas máquinas.
O compilador está configurado para não aceitar determinados erros e seguir determinadas regras predeterminadas pela linguagem da qual ele é programado para interpretar. Sendo assim, um compilador deve detectar erros feitos pelo programador, corrigir ou indicar o melhor caminho para a correção do programa, e só então traduzir para linguagem de máquina (Assembly).
Em linguagens de programação híbridas, o compilador tem o papel de converter o código fonte em um código chamado de byte code, que é uma linguagem de baixo nível. Um exemplo deste comportamento é o do compilador da linguagem Java que, em vez de gerar código onde está sendo executado o compilador, gera código chamado Java Bytecode.
Muitos compiladores incluem pré-processadores. 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.

2. Organização de um compilador

As fases de um compilador podem ser classificadas em dois grupos: análise e síntese. Na fase de análise, encontram-se as fases de análise léxica, análise sintática e análise semântica. Já na fase de síntese encontram-se as fases de geração de código intermediário, otimização e geração de código. Adicionalmente as estas fases, existem ainda duas fases adicionais que interagem com todas as fases do compilador: o gerenciamento de tabelas e o tratamento de erros. A Figura  abaixo ilustra todas as fases de um compilador.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A fase de análise léxica (varredora) tem por objetivo ler o programa fonte e transformar seqüências de caracteres em uma representação interna, denominada itens léxicos.
 Os itens léxicos a serem reconhecidos pelo analisador léxico são determinados pela gramática da linguagem-fonte. Deste modo, caso um item léxico não seja definido por esta gramática, um erro léxico é gerado.           
          
         
 A análise Sintática responsabiliza-se por traduzir os Tokens, e descobrir a relação de uns com os outros. Se você escreve writeln, um espaço, e um identificador, seu programa passará pela análise léxica (writeln e identificador existem), mas não passará pela análise sintática, que informa a necessidade de um abre-parênteses logo após esta procedure.
A fase de análise semântica analisa a árvore sintática para a informação context-sensitive, gerada pelo analisador sintático em busca de inconsistências semânticas. Uma das tarefas mais importantes é a verificação de tipos, ou análise de contexto. É nesta fase que são detectadas, por exemplo, os conflitos entre tipos, a ausência de declarações de variáveis, funções e procedimentos.
A saída da fase de análise semântica, é anotada na árvore do analisador gramatical. As gramáticas de atributo são usadas para descrever a semântica de estática de um programa.
A fase de geração de código intermediário permite a geração de instruções para uma máquina abstrata, normalmente em código de três endereços, mais adequadas a fase de otimização. Esta forma intermediária não é executada diretamente pela máquina alvo.
A fase de otimização analisa o código no formato intermediário e tenta melhorá-lo de tal forma que venha a resultar um código de máquina mais rápido em tempo de execução, usando as réguas que denotam a semântica da linguagem-fonte. Uma das tarefas executadas pelo otimizador é a detecção e a eliminação de movimento de dados redundantes e a repetição de operações dentro de um mesmo bloco de programa.
E por fim, a fase de geração de código tem como objetivo analisar o código já otimizado é a gerar o um código objeto definitivo para uma máquina alvo. Normalmente este código objeto é um código de máquina relocável ou um código de montagem. Nesta etapa as localizações de memória são selecionadas para cada uma das variáveis usadas pelo programa. Então, as instruções intermediárias são, cada uma, traduzidas numa seqüência de instruções de máquina que realizam a mesma tarefa.
Atualmente, as pesquisas e os estudos desenvolvidos sobre autômatos finitos, expressões regulares e gramáticas livres de contexto, além dos próprios estudos sobre compiladores, permitiram que as fases de análise léxica e sintática tivessem um desenvolvimento bem maior que as anteriores, chegando-se ao ponto de se ter geradores automáticos para estas fases. Isto já não ocorre com a análise semântica e com a geração de código, sobre as quais ainda não se tem tão bem definido um formalismo como nas duas primeiras fases.
Ao se criar um compilador, estas últimas fases, ainda hoje são de total responsabilidade do desenvolvedor, não havendo ferramentas que as automatize, como no caso da análise sintática. Existe, no entanto, um senso comum sobre o que deve ser realizado em uma análise semântica e como aproximadamente deve ser gerado o código para as construções mais comuns em linguagens de programação, mas ainda se mantém como um trabalho manual, onde a criatividade do desenvolvedor tem mais influência dentro da implementação de um compilador.

3. Propriedades de um bom compilador

  • Gerar código correto;
  • Estar de acordo com a especificação da linguagem;
  • Ser escalável, ou seja, ser capaz de tratar códigos fonte de tamanhos arbitrários;
  • Velocidade de compilação não é mais importante;
  • Algoritmos desejavelmente lineares – O(n);
  • Não é interessante a existência de algoritmos não lineares no processo de compilação;
  • Problema: a otimização de código não é linear;
  • Outras características importantes:
  • Portabilidade do compilador;
  • Portabilidade do código alvo;

4. Implementação de um analisador léxico:

  • Como ler o arquivo texto de entrada?
    • Memória não é mais um problema;
    • A entrada por dois buffers (atual e anterior);
    • Leitura do arquivo de entrada colocando-o em memória em uma única chamada ao sistema operacional;
  • O problema da nova linha
    • No Windows/DOS, uma nova linha é marcada pela seqüência de caracteres ASCII 13 e 10;
    • No Linux, uma nova linha é marcada pelo caractere ASCII 10;
    • No OS/2, cada linha é um vetor de caracteres;
  • O que é um token exatamente?
    • Simplificação: se você pode colocar espaços na esquerda e direita sem alterar o significado, trata-se de um token;
  • Comentários não são tokens. A análise léxica os remove da seqüência de tokens gerada como saída.

 4.1 Interface de Programação (API) Léxica

 

 

 

 

 

 

  • Funções públicas
    • void startLex(string fileName);
  • Abre o arquivo fonte de entrada fileName e o copia por inteiro para a memória
  • Caso o compilador manipule múltiplos arquivos, utiliza uma pilha para armazenar a posição em que estava manipulando o arquivo atual e abre o novo arquivo
    • Token nextToken();
  • Avalia o arquivo fonte atual, caractere por caractere, e retorna o próximo token
  • Implementação de autômatos
  • Algumas funções privadas úteis
    • char nextChar();
  • Retorna o próximo caractere do arquivo atual, contando as linhas e colunas;
    • void skipLayoutAndComment();
  • Percorre o fonte ignorando comentários até encontrar um caractere que não seja espaço, tabulação ou pulo de linha.

5. Conclusão

Graças aos compiladores podemos utilizar uma linguagem de fácil escrita para a linguagem que a máquina entenda, tornando assim muito mais fácil a elaboração de programas em diversas linguagens, uma vez que a maioria dos compiladores checa a consistência do código informado pelo programador, sem ter a preocupação de estar tendo que passar diretamente para a máquina a sua linguagem (assembly).

Referências

Disponível em: http://pt.wikipedia.org/wiki/Compilador. Último acesso: 11/2007.
Disponível em: http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node37.html.  Último acesso: 11/2007.
Disponível em: http://www.geocities.com/SiliconValley/Bay/1058/compiler.html. Último acesso: 11/2007.
Disponível em: http://br.geocities.com/feliposz/compiladores/crenshaw/tutor03.html.      Último acesso: 11/2007.
Disponível em: www.inf.ufsc.br/~olinto/ine5622-cap1.doc. Último acesso: 11/2007.

Envie seu comentário

Comentários

  • http://hdlohdaw.com/2ku/2
    http://ozorqx.com/ohj/2w
    http://xozkyaf.com/v08/45
    http://rvpkmndh.com/5ps/6
    http://nqcngszq.com/iwk/0
    http://hdlohdaw.com/bbm/3e
    http://ozorqx.com/jg7/2
    http://xozkyaf.com/vbz/3r
    http://rvpkmndh.com/4
    http://nqcngszq.com/08p/4n
    http://hdlohdaw.com/9n2/2a
    http://ozorqx.com/3c
    http://xozkyaf.com/kga/1n
    http://rvpkmndh.com/3va/2g
    http://nqcngszq.com/rvj/29
    http://hdlohdaw.com/cb2/o
    http://ozorqx.com/893/3q
    http://xozkyaf.com/57u/u
    http://rvpkmndh.com/lkj/36
    http://nqcngszq.com/wfh/1a
    http://hdlohdaw.com/cds/2z
    http://ozorqx.com/fv8/1o
    http://xozkyaf.com/bsw/37
    http://rvpkmndh.com/s5m/7
    http://nqcngszq.com/meb/31
    http://hdlohdaw.com/3u
    http://ozorqx.com/6hz/t
    http://xozkyaf.com/v08/2c
    http://rvpkmndh.com/qkw/3d
    http://nqcngszq.com/meb/3a

    Posted by Bryce Cox, 04/07/2009 5:52pm (4 horas atrás)

  • http://ozorqx.com/rjh/3u
    http://rvpkmndh.com/s5m/1e
    http://xozkyaf.com/bsw/2h
    http://nqcngszq.com/wfh/48
    http://hdlohdaw.com/cds/d
    http://ozorqx.com/4f
    http://rvpkmndh.com/pkv/37
    http://xozkyaf.com/bsw/10
    http://nqcngszq.com/iwk/48
    http://hdlohdaw.com/fy8/3b
    http://ozorqx.com/fv8/1i
    http://rvpkmndh.com/lkj/23
    http://xozkyaf.com/n0w/2t
    http://nqcngszq.com/jua/1l
    http://hdlohdaw.com/na2/3q
    http://ozorqx.com/893/0
    http://rvpkmndh.com/3va/7
    http://xozkyaf.com/kga/2q
    http://nqcngszq.com/iwz/o
    http://hdlohdaw.com/cds/3t
    http://ozorqx.com/6hz/4o
    http://rvpkmndh.com/mgv/3y
    http://xozkyaf.com/kga/2e
    http://nqcngszq.com/gbk/1k
    http://hdlohdaw.com/s44/4g
    http://ozorqx.com/6hz/3g
    http://rvpkmndh.com/3va/2w
    http://xozkyaf.com/4
    http://nqcngszq.com/wfh/2w
    http://hdlohdaw.com/fy8/4r

    Posted by Rae Lee, 04/07/2009 11:44am (10 horas atrás)

  • http://ozorqx.com/6hz/2
    http://rvpkmndh.com/sob/38
    http://nqcngszq.com/meb/15
    http://hdlohdaw.com/9n2/2t
    http://xozkyaf.com/n0w/e
    http://ozorqx.com/893/1c
    http://rvpkmndh.com/pkv/2o
    http://nqcngszq.com/08p/7
    http://hdlohdaw.com/c6j/4q
    http://xozkyaf.com/kga/4j
    http://ozorqx.com/iqz/46
    http://rvpkmndh.com/s5m/2v
    http://nqcngszq.com/08p/4m
    http://hdlohdaw.com/q
    http://xozkyaf.com/v08/p
    http://ozorqx.com/jg7/2d
    http://rvpkmndh.com/3va/4
    http://nqcngszq.com/jua/2x
    http://hdlohdaw.com/fy8/4f
    http://xozkyaf.com/y30/2m
    http://ozorqx.com/jg7/4a
    http://rvpkmndh.com/mgv/37
    http://nqcngszq.com/vhf/2a
    http://hdlohdaw.com/fy8/10
    http://xozkyaf.com/n0w/f
    http://ozorqx.com/vck/23
    http://rvpkmndh.com/0o3/w
    http://nqcngszq.com/wfh/0
    http://hdlohdaw.com/2h
    http://xozkyaf.com/e

    Posted by Rena Parrish, 04/07/2009 6:06am (16 horas atrás)

  • http://birkkane.com/zg1/4m
    http://jmgmypium.com/07t/l
    http://ouvthweg.com/rj8/p
    http://vwsevihm.com/nlm/1f
    http://nhroiv.com/6g3/1h
    http://birkkane.com/2p
    http://jmgmypium.com/6sp/2z
    http://ouvthweg.com/du7/25
    http://vwsevihm.com/hcf/3m
    http://nhroiv.com/wd4/2x
    http://birkkane.com/jfs/21
    http://jmgmypium.com/fmw/13
    http://ouvthweg.com/j6m/26
    http://vwsevihm.com/hcf/1h
    http://nhroiv.com/hj6/4a
    http://birkkane.com/zg1/s
    http://jmgmypium.com/o2f/33
    http://ouvthweg.com/k4b/25
    http://vwsevihm.com/idg/3f
    http://nhroiv.com/lht/3t
    http://birkkane.com/zg1/3p
    http://jmgmypium.com/6sp/24
    http://ouvthweg.com/k4b/6
    http://vwsevihm.com/xs1/4e
    http://nhroiv.com/6g3/p
    http://birkkane.com/zg1/c
    http://jmgmypium.com/fmw/s
    http://ouvthweg.com/k4b/1v
    http://vwsevihm.com/36
    http://nhroiv.com/e

    Posted by Ralph Nolan, 04/07/2009 2:25am (20 horas atrás)

  • 9ed05658b4<a href= http://bbs.co.91.com/member.php?u=148926 ></a><a href= http://bbs.co.91.com/member.php?u=148930 >nexium</a><a href= http://bbs.co.91.com/member.php?u=148924 ></a><a href= http://bbs.co.91.com/member.php?u=148927 >zithromax</a><a href= http://bbs.co.91.com/member.php?u=148936 ></a><a href= http://bbs.co.91.com/member.php?u=148954 >generic xanax</a><a href= http://bbs.co.91.com/member.php?u=148926 >purchase thyroid</a><a href= http://bbs.co.91.com/member.php?u=148945 >phendimetrazine 270 mg</a><a href= http://bbs.co.91.com/member.php?u=148950 >levitra no prescription</a><a href= http://bbs.co.91.com/member.php?u=148935 >ativan addiction</a><a href= http://bbs.co.91.com/member.php?u=148948 >cheapest soma</a><a href= http://bbs.co.91.com/member.php?u=148946 >phentermine addiction</a>

    Posted by aaa, 03/07/2009 11:06pm (23 horas atrás)

  • http://jmgmypium.com/pvu/1s
    http://ouvthweg.com/qm8/8
    http://birkkane.com/3b
    http://nhroiv.com/6b3/r
    http://vwsevihm.com/nlm/2z
    http://jmgmypium.com/r7y/e
    http://ouvthweg.com/25
    http://birkkane.com/coi/33
    http://nhroiv.com/lht/2b
    http://vwsevihm.com/11
    http://jmgmypium.com/qfw/2x
    http://ouvthweg.com/qm8/25
    http://birkkane.com/zg1/25
    http://nhroiv.com/4
    http://vwsevihm.com/6az/16
    http://jmgmypium.com/zta/23
    http://ouvthweg.com/qm8/17
    http://birkkane.com/b
    http://nhroiv.com/llq/2p
    http://vwsevihm.com/hcf/3p
    http://jmgmypium.com/6sp/6
    http://ouvthweg.com/x7z/3k
    http://birkkane.com/4m
    http://nhroiv.com/wd4/f
    http://vwsevihm.com/blo/12
    http://jmgmypium.com/r7y/3u
    http://ouvthweg.com/7oh/41
    http://birkkane.com/coi/44
    http://nhroiv.com/sgj/47
    http://vwsevihm.com/hcf/z

    Posted by Nathaniel Luna, 03/07/2009 9:13pm (1 dia atrás)

  • 3885faed94 <a href= http://bbs.co.91.com/member.php?u=148943 >generic meridia</a> 295b8 <a href= http://bbs.co.91.com/member.php?u=148941 >hydrocodone</a> b70e3 <a href= http://bbs.co.91.com/member.php?u=148939 >order ephedrine</a> de3b1 <a href= http://bbs.co.91.com/member.php?u=148948 ></a> 57632 <a href= http://bbs.co.91.com/member.php?u=148953 ></a> 59504 <a href= http://bbs.co.91.com/member.php?u=148953 >viagra</a> deb30 <a href= http://bbs.co.91.com/member.php?u=148931 ></a> 4b42b <a href= http://bbs.co.91.com/member.php?u=148937 >cheap clonazepam</a> 9ab2f <a href= http://bbs.co.91.com/member.php?u=148947 >cheap propecia</a> c7bec <a href= http://bbs.co.91.com/member.php?u=148928 >cheapest zoloft</a> b2a9c <a href= http://bbs.co.91.com/member.php?u=148930 >cheapest nexium</a> 6f5e7 <a href= http://bbs.co.91.com/member.php?u=148930 >order nexium</a> bef0b <a href= http://bbs.co.91.com/member.php?u=148933 ></a> a935a <a href= http://bbs.co.91.com/member.php?u=148936 >cialis for sale</a> 82536 <a href= http://bbs.co.91.com/member.php?u=148922 ></a> bacd5

    Posted by buy, 03/07/2009 9:09pm (1 dia atrás)

  • 67206eafa5 <a href= http://bbs.co.91.com/member.php?u=148942 >order lipitor</a> 8d508 <a href= http://bbs.co.91.com/member.php?u=148925 >buy prozac online</a> 99b47 <a href= http://bbs.co.91.com/member.php?u=148921 >cheap fluoxetine</a> dc38c <a href= http://bbs.co.91.com/member.php?u=148928 >buy zoloft online</a> 5068f <a href= http://bbs.co.91.com/member.php?u=148918 ></a> ec84d <a href= http://bbs.co.91.com/member.php?u=148921 >fluoxetine pills</a> 74732 <a href= http://bbs.co.91.com/member.php?u=148915 >cheap carisoprodol</a> b50ce <a href= http://bbs.co.91.com/member.php?u=148934 ></a> 9da41 <a href= http://bbs.co.91.com/member.php?u=148952 >cheap valium</a> 8396d <a href= http://bbs.co.91.com/member.php?u=148939 ></a> 2a3ce <a href= http://bbs.co.91.com/member.php?u=148939 >ephedrine products</a> cbe2d <a href= http://bbs.co.91.com/member.php?u=148911 >cheapest butalbital</a> 5ee89 <a href= http://bbs.co.91.com/member.php?u=148922 >klonopin no prescription</a> 98aed <a href= http://bbs.co.91.com/member.php?u=148949 >order tramadol</a> 8fe01 <a href= http://bbs.co.91.com/member.php?u=148916 >celebrex</a> e01fd

    Posted by cheapest, 03/07/2009 7:03pm (1 dia atrás)

  • 80a9af4068 <a href= http://bbs.co.91.com/member.php?u=148916 >celebrex no prescription</a> 39678 <a href= http://bbs.co.91.com/member.php?u=148944 >paxil</a> 7ed17 <a href= http://bbs.co.91.com/member.php?u=148951 ></a> efef0 <a href= http://bbs.co.91.com/member.php?u=148934 >ambien pills</a> f6406 <a href= http://bbs.co.91.com/member.php?u=148931 >cheap zolpidem</a> e2839 <a href= http://bbs.co.91.com/member.php?u=148928 >purchase zoloft</a> 4305d <a href= http://bbs.co.91.com/member.php?u=148915 >carisoprodol online</a> 55764 <a href= http://bbs.co.91.com/member.php?u=148927 >zithromax online</a> a5bee <a href= http://bbs.co.91.com/member.php?u=148951 >cheapest ultram</a> bc984 <a href= http://bbs.co.91.com/member.php?u=148929 >cheap adipex</a> 05ebf <a href= http://bbs.co.91.com/member.php?u=148935 >buy ativan online</a> 039b9 <a href= http://bbs.co.91.com/member.php?u=148924 >buy nolvadex</a> 8c36a <a href= http://bbs.co.91.com/member.php?u=148947 >buy propecia</a> 150df <a href= http://bbs.co.91.com/member.php?u=148918 ></a> e986e <a href= http://bbs.co.91.com/member.php?u=148923 ></a> f3f5a

    Posted by cheapest, 03/07/2009 5:08pm (1 dia atrás)

  • 3fbabe1748 <a href= http://bbs.co.91.com/member.php?u=148932 >adipex online pharmacy</a> 740d3 <a href= http://bbs.co.91.com/member.php?u=148937 >clonazepam addiction</a> ad684 <a href= http://bbs.co.91.com/member.php?u=148930 >generic nexium</a> e1b09 <a href= http://bbs.co.91.com/member.php?u=148921 >fluoxetine</a> 56365 <a href= http://bbs.co.91.com/member.php?u=148935 >cheapest ativan</a> b648f <a href= http://bbs.co.91.com/member.php?u=148945 ></a> 93459 <a href= http://bbs.co.91.com/member.php?u=148927 >zithromax pills</a> 9c75b <a href= http://bbs.co.91.com/member.php?u=148954 ></a> 22223 <a href= http://bbs.co.91.com/member.php?u=148938 >diazepam online</a> e771a <a href= http://bbs.co.91.com/member.php?u=148950 >generic levitra</a> 56687 <a href= http://bbs.co.91.com/member.php?u=148933 ></a> b6c53 <a href= http://bbs.co.91.com/member.php?u=148941 >cheap hydrocodone</a> 03227 <a href= http://bbs.co.91.com/member.php?u=148950 >buy levitra online</a> 8eb4f <a href= http://bbs.co.91.com/member.php?u=148933 >rx adipex</a> 775fc <a href= http://bbs.co.91.com/member.php?u=148919 >effexor online</a> dd886

    Posted by effexor, 03/07/2009 3:10pm (1 dia atrás)

RSS feed for comments on this page