11.07.2015 Views

tesis_uam/Guia para hacer compiladores _UAM7403.pdf - cedip

tesis_uam/Guia para hacer compiladores _UAM7403.pdf - cedip

tesis_uam/Guia para hacer compiladores _UAM7403.pdf - cedip

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

1.2.7 Optimización de Código.La fase de optimización de código trata de mejorar el códigointermedio, de modo que resulte un código de Mquina más rápidode ejecutar. Algunas optimizaciones sontriviales. Por ejemplo, unalgoritmo natural genera el código intermedio (1.1) utilizandouna instrucción <strong>para</strong> cada operador de la representación de árboldespues del análisis semántico, aunque hay una forma mejor derealizar los mismos cálculos utilizando las dos instruccionestempl := id3 * 60.0id1 := id2 + templEste sencillo algoritmo no tiene nada de malo, puesto que elproblema se puede solucionar en la fase de optimización decódigo. Esto es, el compilador puede deducir que la conversión de60 de entero a real se puede <strong>hacer</strong> de una vez por todas en elmomento de la compilación, de modo que la operación EntAReal sepuede eliminar. Además, temp3 se usa sólo una vez, <strong>para</strong>transmitir su valor a idl. Entonces resulta seguro sustituir id1por temp3, a partir de lo cual la última proposición de (1.1) nose necesita y se obtiene el código de (1.2).Hay mucha variación en la cantidad de optimización de códigoque ejecutan los distintos <strong>compiladores</strong>, una parte significativadel tiempo del compilador se ocupa en esta fase. Sin embargo, hayoptimizaciones sencillas que mejoran senciblemente el tiempo deejecución del programa objeto sin retardar demasiado lacompilación.1.2.8 Generación de Código.La fase final de un compilador es la generación de códigoobjeto, que por lo general conciste en código máquinarelocalizable o código ensamblador. Las posiciones de memoria seseleccionan <strong>para</strong> cada una de las variables usadas por elprograma. Después cada una de las instrucciones intermedias setraduce a una secuencia de instrucciones de máquina que ejecutanla misma tarea. Un aspecto desicivo es la asignación de variablesa registros.Como ejemplo, si utilizamos los registros AX y BX en latraducción del código (1.2) a lenguaje ensamblador <strong>para</strong> lafamilia de procesadores 8086-8088 tendríamos:MOV AX,id3MUL 60MOV BX, id2ADD AX,BXMOV id1,AX

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!