linguagem c

1. linguagem c

Douglas Sciani Negreiros
sciani

(usa Ubuntu)

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


  


2. Re: linguagem c

Marcelo A. B. Slomp
mslomp

(usa Slackware)

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

Douglas Sciani Negreiros
sciani

(usa Ubuntu)

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

André
andrezc

(usa Debian)

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

Marcelo A. B. Slomp
mslomp

(usa Slackware)

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'






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts