Pular para o conteúdo

linguagem c

Responder tópico
  • Denunciar
  • Indicar

1. linguagem c

Enviado em 17/04/2009 - 10:54h

Olá amigos, tudo bem? Estou estudando compiladores na faculdade, e estava construindo um compilador da linguagem C, estou indo bem até, mas agora me deparei com algo muito critico, transformar tudo que fiz da linguagem C, em código de máquina, assembly. Alguém aí já fez isso, e pode me dar umas dicas? estou sem da onde começar. heheh

abraços

Responder tópico

2. Re: linguagem c

Enviado em 17/04/2009 - 14:21h

depende até onde você já chegou.
supondo que seu compilador já esteja transformando todas as sentenças em árvores ast (abstract syntax tree), e admitindo um compilador simples, sem passes mirabolantes, otimizações e linguagens intermediárias, basicamente precisará percorrer as ast nó por nó e a partir daí fazer as devidas transformações. o mais comum e prático é criar um descritor de máquina contendo os templates para as instruções e utilizá-lo para as substituições, mas para isso eu sugiro que antes transforme em alguma linguagem intermediária baixo nível genérica - a exemplo do rtl.
explique melhor como está construindo o compilador, e onde chegou até agora.

3. Re: linguagem c

Enviado em 17/04/2009 - 15:44h

entaum, eu fiz o seguinte, construi um sintaxe no lex, junto com uma tabela de simbolos tbm no lex, depois fiz a gramatica da linguagem c, no yacc, tudo isso compilado.

agora tenho q passar essa gramatica pra assembly.

4. Re: linguagem c

Enviado em 18/04/2009 - 09:32h

Não entendi muito bem a sua pergunta você quer fazer um compilador ou quer uma dicade compilador ? se quiser uma dicade compilador uso o codeblocks

5. Re: linguagem c

Enviado em 18/04/2009 - 11:11h

então cara, em suma, a partir daí você precisará revisitar cada sentença, e conforme sua variante, ir emitindo instruções (insn) de sua máquina alvo. o mais usual é construir uma árvore para cada bloco de sentenças relacionadas, onde cada nó será um token.

exemplo:
a = b + c
ficará
.........../===b
a===+
...........\===c

(coloquei na horizontal pois na vertical perderia a formatação :D)

supondo que você tenha templates insn tipo:
move #n,#regi
add #n,#regi
onde #n é um valor imediato e #regi é um registrador imediato,
a primeira transformação óbvia é:
move a,r1
ao passar pelo próximo nó (+):
add b,r1
add c,r1

há alguns livros bons no assunto, como o Compiler Design Handbook, Engineering a Compiler, e também o famoso livro do dragão, entre outros.
dê uma olhada também no GCC Internals, em especial os capítulos 10 e 16.
uma boa leitura também é o Let's Build a Compiler, disponível gratuitamente, inclusive em formato pdf.
e, como o google sempre é nosso amigo, faça uma busca por 'compiler back-end'

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder