Académique Documents
Professionnel Documents
Culture Documents
Aps termos examinado os mdulos que compe o front-end de um compilador podemos passar ao estudo de como gerado o cdigo executvel a partir do resultado obtido nos mdulos de entrada. O back-end do compilador pode envolver mais do que uma etapa, sendo que necessariamente temos uma etapa de gerao do cdigo, que pode ou no ser acompanhada por etapas de otimizao do cdigo. Neste captulo nos ocuparemos da gerao do cdigo, que obviamente vai depender do hardware em que se v aplicar o programa executvel gerado. Entretanto, esta dependncia do hardware acaba por no ser sentida quando se discute os aspectos essenciais do processo de gerao de cdigo. A seguir faremos uma breve descrio das diferenas de hardware que devem ser levadas em conta na implementao do gerador de cdigo, para ento passarmos ao estudo dos problemas envolvidos na gerao de cdigo, independente da mquina em que se executar a compilao.
Cdigo: Instruo Contedo da pilha (topo a esquerda) LoadCon 3 3 LoadCon 4 4 3 Multiply 12 LoadCon 5 5 12 LoadCon 2 2 5 12 Multiply 10 12 Add 22 Exemplo 2: Uso de variveis. Apesar de que o conjunto de operaes dado acima funciona bastante bem, temos que na maioria das vezes os operandos so variveis, cujos valores reais devem ser buscados na memria. Para fazer isso lanamos mo das instrues Load e Store, que trabalham sobre endereos indexados atravs da pilha. Por exemplo, se quizermos fazer a atribuio a = b temos que fazer: Instruo Contedo da pilha (topo a esquerda) LoadCon <value> endereo da varivel a LoadCon <value> endereo de b; endereo de a Load valor de b; endereo de a Store (vazia) Exemplo 3: Uso de endereos e cdigos. A partir do conjunto de instrues da seo 5.1.1 pode-se observar que a cada instruo temos associado um mnemnico (que o que temos usado at aqui) e um cdigo. Na realidade, o computador entende apenas o cdigo, logo o mesmo que vai estar presente aps a gerao do executvel. Por outro lado, o exemplo anterior introduziu o problema de como localizar endereos das variveis presentes em cada instruo. Este problema resolvido mais adiante, atravs da tabela de smbolos, assim nos concentraremos neste exemplo a mostrar como poderia seria o cdigo sem o uso dos mnemnicos. Para tanto considere a resoluo da atribuio a = a-1 % armazena a posio de a na memriapara o retorno de seu valor final 28 a % armazena a posio de a na memriapara obter seu valor inicial 27 % obtm o valor de a 28 1 % coloca 1 na pilha 20 % nega o valor no topo da pilha (obtm -1) 12 % soma a + (-1) 26 % armazena o novo valor de a Destes exemplos j podemos vislumbrar algumas rotinas a serem seguidas sempre. Uma delas o fato de que se existir uma atribuio, temos que construir um prembulo em que ser armazenado na pilha o endereo de retorno e um desfecho, fazendo de fato esta operao, deixando ento a pilha vazia. A expresso cujo resultado vai ser atribudo fica ento entre estas duas instrues. 28 a Alm disso, como no existe a operao de subtrao, sempre que quizermos execut-la teremos que executar a operao de Negate sobre o subtrator, para ento som-lo ao subtraendo. Da mesma forma, a operao de diviso no pode ser executada com apenas uma nica instruo, alis, neste caso nem podemos faz-la com poucas instrues, pois o nico mtodo disponvel passa a ser o das subtraes sucessivas.
Figura 5.2 - rvores de derivao para G1 e G2 Logo vemos que ordem em que sero executadas as somas depende de como a gramtica foi arranjada.