Você está na página 1de 14

Resumo para Estudo Compiladores B2.

Tabela de Smbolos O Que Tabela de Smbolos: Consiste em uma estrutura de dados, que armazena e disponibiliza todas as informaes sobre os identificadores e seus atributos. Essas informaes so coletadas nas etapas de analise, e so utilizadas da sntese at a gerao de cdigo. Alguns dos atributos dos identificadores so: Lexemas, escopos, tipos, endereos de memria, e etc. A tabela de smbolos facilita muito a verificao de escopo atravs de duas estratgias: Tabela de Smbolos com Arvore Invertida: O cdigo lido de forma que quando localizado um programa, ele o insere em uma lista, e vai varrendo-o e encontrando todas as suas variveis e colocando-as nesta mesma lista, caso ache um programa, procedimento ou funo dentro desse mesmo programa, ele cria novamente uma lista ligada a lista pai (ou seja, a lista pai aponta para a lista filha, de forma que ela no seja misturada em outros contextos de programas/funes/procedimentos que no estejam dentro do programa pai), porem em outra dimenso. Ao ler o cdigo, vamos supor que ao encontrar uma varivel que

Pgina 1 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

esta sendo manipulada (exemplo: a:= 1) necessrio que seja verificado se esta varivel foi declarado em algum lugar do cdigo, de forma que o escopo esteja acessvel ou se a varivel em si existe, desta forma, ele percorre a lista ligada da direita para a esquerda, caso ela no seja encontrada ocasionado o erro e o programador informado que a varivel no existe no contexto do procedimento/funo/programa. Exemplo: Vamos supor que a TS com Arvore invertida ir ler o cdigo abaixo e gerar sua arvore (lembrando que lido linha a linha): Programa P{ Var a :int; Procedimento Q{ Var b,c :int; } Procedimento R{ Var d,e :int; Procedimento S{ Var f,g :int; f := 1; b:= 1; } } }

Pgina 2 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

As letras em preto simbolizam os procedimentos, funes ou mtodos declarados no programa, as letras vermelhas simbolizam as variveis de cada mtodo, o trao verde indica o caminho que o verificador percorreu para encontrar a declarao da varivel f nos contextos pertencentes a S, observe que f esta declarado dentro do contexto que S possui acesso. J o trao amarelo indica o caminho percorrido para a verificao da varivel b dentro do contexto S, observe que S no tem acesso ao procedimento Q, onde a varivel b foi declarada.

Tabela de Smbolos com Pilha: O cdigo lido de forma que ao encontrar um novo programa o insere em uma pilha, o mesmo acontece com as variveis deste mesmo programa. Caso encontre outro procedimento/funo/programa dentro deste mesmo programa, este novo procedimento inserido na pilha juntamente com suas varivel (note que por enquanto o mesmo processo da TS com Arvore Invertida, porem, ao invs de uma lista ligada uma pilha), ao terminar de ler este programa filho do programa principal, o mesmo desempilhado completamente, ficando apenas o programa principal, pai. E assim continua. Caso encontre um novo procedimento o mesmo feito com ele, mas vamos supor que dentro desses procedimentos, houvesse uma
Pgina 3 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

chamada de uma varivel, ento o sistema percorreria a pilha de cima (do ponto onde foi feito a chamada )para baixo em busca da varivel (por isso, ao terminar de ler um procedimento filho, o mesmo desempilhado, desta forma um outro procedimento que no esta dentro desse mesmo contexto no poder ter acesso as suas variveis), caso ele no encontre dentro de si ou de seu pai a varivel instanciada, o usurio avisado que a varivel em questo no existe ou no esta dentro do contexto correto. Exemplo: Vamos supor que a TS com Pilha ir ler o cdigo abaixo e gerar sua pilha(lembrando que lido linha a linha): Programa P{ Var a :int; Procedimento Q{ Var b,c :int; } Procedimento R{ Var d,e :int; Procedimento S{ Var f,g :int; f := 1; b:= 1; } } }

Pgina 4 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

As letras em preto simbolizam os procedimentos, funes ou mtodos declarados no programa, as letras vermelhas simbolizam as variveis de cada mtodo,o trao vermelho cortando os endereos de memria do procedimento Q indica que Q foi desempilhado da pilha,o trao verde indica o caminho que o verificador percorreu para encontrar a declarao da varivel f nos contextos pertencentes a S, observe que f esta declarado dentro do contexto que S possui acesso. J o trao amarelo indica o caminho percorrido para a verificao da varivel b dentro do contexto S, observe que, caso o procedimento Q no tenha sido desempilhado da pilha, S poderia ter acesso a varivel b, desta forma indicaria tambm que S esta dentro do contexto de Q, mas no o caso, por tanto S no tem acesso a varivel b, e o sistema emitiria uma mensagem de erro para o usurio indicando que a varivel no existe ou no esta dentro do contexto S. Observe tambm, que esta imagem s foi at os passos em que so atribudos valores nas variveis b e f, no caso, se os passos de leitura da continuassem, ento o procedimento S seria desempilhado, e em seguida o procedimento R, pois, S filho de R, e R j foi lido inteiramente, assim o procedimento iria acabar.

Pgina 5 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

Gerao de Cdigo aps a Aplicao destas Estratgias: Mas espera ai, como vamos gerar o cdigo a partir dessas estratgias? Simples, no caso da pilha, seria essencial salvar uma cpia da pilha sem desempilhar nenhum procedimento, outra forma seria ir gerando o cdigo juntamente com a estratgia,e caso ocorresse algum erro o cdigo gerado seria jogado fora. No caso da lista, poderia ento ser gerado o cdigo por mdulos, por exemplo, a cada procedimento, funo ou programa verificado, gerado o cdigo do seu contedo, assim, gerando o cdigo por mdulos!

Analisador Semntico Para que serve? O Analisador Semntico tem a funo de conferir os escopos e tipos dos identificadores, entre outras funes. Na verdade, o analisador semntico tenta localizar o sentido de cada componente do programa e tende entender o que o programador em si quis dizer com aquilo, tambm faz checagem de tipagem e escopos. Geralmente os programas so escritos em linguagem de alto -nvel. Desta forma a consistncia de um identificador em expresses depende de sua declarao (implcita ou explicita). Esse tipo de dependncia s poderia ser completamente checado em gramticas sensveis ao contexto. Em gramticas mais restritivas, possvel atribuir aes semnticas as produes, usualmente isso realizado atravs de uma arvore com atributos. Ham?(alguns vo pensar isso, eu pensei...) Em outras palavras, como a maioria dos programas so escritos em linguagem de alto-nvel necessrio que haja alguma forma de verificar se os comandos escritos em linguagem de alto- nvel esto bem formados e depois traduzi-los para linguagem de maquina, caso no estejam bem formados, o usurio advertido que h alguma formulao errada. Em muitos compiladores, o analisador semntico considerado parte do analisador sinttico, pois, como disse a cima, necessrio verificar se os comandos esto em formados, e isto o analisador sinttico j faz, mas ele no consegue traduzi-los para linguagem de baixo-nvel. Alem disso a tabela de smbolos tambm ajuda o analisador semntico, pois,
Pgina 6 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

ela usada para: Evitar que o nome de um procedimento aparea do lado esquerdo de uma atribuio: Procedimento() := a; X a:= Procedimento Evitar que um procedimento aparea sem sua lista de atributos. Evitar que um numeral aparea do lado esquerdo de uma atribuio 1 := a; X a := 1; Otimizar o uso da memria atribuindo as constantes idnticas o mesmo endereo de memria. Final CONSTANTE_A := 1; X Final CONSTANTE_A_B := 1; Final CONSTANTE_B := 1

Funes Bsicas de um Compilador: Verificar a duplicidade na declarao de um identificador no mesmo contexto: Programa Xuxu(){ Programa Xuxu(){ Int A; X int A; Int A; int B; } } Verificar o uso de identificadores no declarados: Int a; b = a+1; X Verificar a compatibilidade de tipos: int a; char b; b := a; X Verificar chamadas de procedimentos/funes esto bem formadas.

Pgina 7 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

Verificar o uso de operadores unrios(-,+,not, etc): int a; int b; IF(A not B) X

Gerao d Cdigo O que : Ele encarregado simplesmente de pegar um arquivo fonte e transform-lo em cdigo fonte para ser executado em uma maquina alvo. Maquina Virtual: A gerao de cdigo est associada a uma maquina alvo, no nosso caso, veremos a gerao de cdigo em uma maquina virtual (MV) a pilha. Na MV a memria est divida nas seguintes regies: Regies de Programas (P) Que conter as instrues da MV (seria como se fosse um programa e suas instrues, porem sem modelagem de variveis, ou seja, como se cada instruo estivesse empilhada em uma pilha.). Regies de Dados (M) Que conter os valores manipulados pela regio de programa, e funcionar como uma pilha. (seria o valor das variveis manipuladas e modeladas pela Regio de Programa, porem, estes valores esto organizados em uma pilha, imagine que a regio de memria quer carregar uma varivel, ento esta varivel criada na regio de dados, e alocado um endereo na pilha e atribudo seu valor no mesmo endereo).

Tambm contamos com dois Registradores:

Pgina 8 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

Registradores de Programa (i) Que conter o endereo na Regio de programa da prxima instruo (seria como um cursor que se posiciona em cada instruo de um programa.). A cada busca fetch de cada instruo, o registrador ser incrementado, assim como outros contadores de programa, em outras palavras, a cada termino de instruo, o contador de programa recebe i = i+1. Registrador de Topo da Pilha (S) Que conter o endereo do topo da pilha da Regio de Dados. Exemplos de Instrues na MV: LDC c //Carrega uma constante S = S+1 M[S] = c //S o endereo do topo da pilha de dados, assim, quando S incrementado significa que a varivel no sobrescrever a varivel que o cursor esta posicionado. M[S]=c, significa que a pilha de dados M, receber a constante c no endereo indicado pelo cursor de topo de pilha =D LDU v //Carrega variavel S=S+1 M[s] = M[x] ADD //soma, idem para subtrao, diviso, multiplicao M[s-1] = M[s-1]+M[s] s= s-1 //Soma as duas primeiras variveis que esto no topo da pilha, e faz o cursor de topo de pilha apontar para a posio da primeira varivel, com o valor da novo valor calculado. INV //Inverte sinal m[s] = - m[s] //Pega o valor do topo da pilha de dados, e a faz receber seu prprio valor
Pgina 9 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

com sinal invertido AND //Conjugao, idem para OR Se M[s-1] =1 AND m[s] =1 ento m[s-1] =1; //A conjugao Verdadeiro seno M[s-1] =0; //A conjugao falsa s= s-1; //Verifica as duas primeiras variveis que esto no topo da pilha, se ela for verdadeira, a posio anterior do topo da fila recebe o valor 1 indicando que a conjugao verdadeira, seno, esta mesmo posio recebe valor 0 indicando que a conjugao falsa. CME //Comparar menor Se m[s-1] < m[s] ento m[s-1] =1; Senao m[s-1] =0; s=s-1; //Possui o mesmo mecanismos do comando AND STR n //Armazena um valor M[s] = M[n]; s=s+1; JMP p //Pular para outro local da Regio de Programa(pula para outra instruo) i = p; //Lembrando que i um contador, e ele aponta para a prxima instruo do programa. JMPF p //Desviar se a condio for falsa
Pgina 10 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

Se M[s] =0 ento i=p; senao i=i+1; //Se a condio for falsa, ento pula para outra instruo determinada em p, caso seja verdadeiro, apenas vai para a prxima instruo. Null //No faz nada RD //Leitura s = s+1 M[s] = proximo_valor_da_entrada PRN //impresso imprime m[s] s=s-1; //Imprime o valor da varivel contida no endereo do topo da pilha de dados START //Inicia o programa de forma a limpar todas as variveis do programa anterior, e prepara o sistema para iniciar o novo programa S =1; HLT //Parar o programa e limpa as pilhas e os registradores ALLOC n //Aloca memria para n variveis s = s+n; DALLOC n //Desaloca memria, ou seja, desloca todas as variveis contidas no programa que foi executado, importante para que seja possvel economizar memria e no estour-la, de forma que, ao terminar um programa ou um procedimento dentro de outro programa, este comando limpe as variveis do programa, ou do procedimento dentro do
Pgina 11 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

programa, ai depende do contexto. s = s-n CALL p //Chama um procedimento/funo do programa s = s+1 m[s] = i+1; i=p; //O cursor s, recebe mais um identificando o topo da pilha, este endereo de topo de pilha recebe a instruo aps a chamada do procedimento para caso necessrio voltar posteriormente. I q o cursor de instruo recebe o endereo do procedimento desejado RETURN i = M[s]; s=s-1; //I que o cursor de instruo do programa recebe a posio original antes da chamada do procedimento, e S volta uma posio.

Otimizao de Cdigo

O Que : Esta etapa consiste em aplicar um conjunto de heursticas e substituir e/ou remover seqncia de cdigo que produzem ineficincia. Ela consiste em tentar aumentar a velocidade e o tamanho do cdigo, ou, cada uma separada, depende do compilador. Mtodos para melhorar o cdigo: Identificao de variveis que tem o mesmo valor e no so alteradas. x =1; x=1; y =1; //desnecessrio
Pgina 12 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

a=x+1; b=y+1;

a=x+1; b=x-1;

Eliminao de cdigo redundante: x=1; x=1; ... x=1; //Caso de fato no meio do cdigo x no receba outro valor, este comando torna-se desnecessrio Eliminao de variveis no usadas: int x,y; int x; x=1; x=1; Analise do fluxo do programa: JUMP L1 C1 C; C2 L1, C3 Substituio de operaes de alto custo x = x+1; x++; a=pow(x,2) a=x+x; //Somar mais lento do que apenas incrementar. No caso do comando pow(Potncia), como a potencia em si pequena neste caso, para que no seja necessrio ter criar um contador para cada potncia, muito mais fcil deixar o valor fixo, assim economizando tempo! Eliminao de Nulls C1 L1:NULL C1 C2 L1:C2 //Os nulls ajudam muito na hora de escrever ou ler o cdigo, porem, como null apesar de no fazer nada, uma instruo que deve ser lida,validada, e executada pelo compilador, ela toma tempo, como ela em si no apresenta nenhum valor, o otimizador de cdigo o tira.

Pgina 13 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

Pgina 14 Salad102 CC e SI
http://br.groups.yahoo.com/group/salad102/

Resumo montado para AUXILIAR nos estudos da matria, porem, o mesmo NO POSSUI TODO CONTEUDO PASSADO. Por tanto NECESSRIO que seja estudado todo contedo passado pelo(a) professor(a) para um estudo mais COMPLETO.

Você também pode gostar