generacion´ de codigo´ intermedio....

46
TEMA 7 GENERACI ´ ON DE C ´ ODIGO INTERMEDIO. OPTIMIZACI ´ ON Bibliograf´ ıa: Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, ecnicas y herramientas, Tema 8, 9, 10 (pag. 478-666). Louden, K.C. (1997), Compiler Construction: Principles and Prac- tice, Tema 8, p´ aginas: 398-481. 1 Introducci´ on. 2 Tipos de representaciones intermedias: C´ odigo de 3-direcciones. 3 odigo intermedio como un atributo sintetizado. 4 Generaci´ on de c ´ odigo para expresiones y sentencias de control: 4.1 Proposiciones de asignaci ´ on. 4.2 Expresiones aritm´ eticas. 4.3 Expresiones booleanas. 4.4 Sentencias de control. 5 Optimizaci´ on de c ´ odigo: 5.1 Bloques b´ asicos y optimizaci´ on local. 5.2 Eliminaci´ on de subexpresiones comunes. 5.3 Eliminaci´ on de c ´ odigo muerto.

Upload: dangthu

Post on 07-Sep-2018

270 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7

GENERACION DE CODIGO INTERMEDIO.OPTIMIZA CION

Bibliograf ıa:

� Aho, A.V., Sethi,R., Ullman,J.D.(1990),Compiladores:principios,

tecnicasy herramientas, Tema8, 9, 10 (pag.478-666).

� Louden,K.C. (1997),CompilerConstruction:PrinciplesandPrac-tice, Tema8, paginas:398-481.

1 Introduccion.

2 Tiposderepresentacionesintermedias:Codigode3-direcciones.

3 Codigointermediocomounatributo sintetizado.

4 Generacion decodigoparaexpresionesy sentenciasdecontrol:

4.1 Proposicionesdeasignacion.

4.2 Expresionesaritmeticas.

4.3 Expresionesbooleanas.

4.4 Sentenciasdecontrol.

5 Optimizacion decodigo:

5.1 Bloquesbasicosy optimizacion local.

5.2 Eliminacion desubexpresionescomunes.

5.3 Eliminacion decodigomuerto.

Page 2: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

206 7.1. INTRODUCCION

5.4 Transformacionesaritmeticas.

5.5 Empaquetamientodevariablestemporales.

5.6 Mejorasenlazos.

7.1 INTRODUCCION

Comosecomento en el primer capıtulo el procesode la compilacion sedesglosaendospartes:la partequedependesolodellenguajefuente(etapainicial o front-end) y la partequedependesolo del lenguajeobjeto(etapafinal o back-end).

� Etapainicial: correspondeconla partedeanalisis(lexico,sintacticoy semantico).

� Etapafinal: correspondeconlapartedesıntesis(generaciondecodigo).

La etapainicial traduceun programafuenteaunarepresentacion interme-

dia apartir dela cualla etapafinal generael codigoobjeto.

De estaforma, los detallesquetienenquever con las caracterısticasdellenguajeobjeto(codigoensamblador, codigomaquinaabsolutoo relocal-izable,. . . ), la arquitecturadela maquina(numeroderegistros,modosdedireccionamiento,tamanodelos tiposdedatos,memoriacache,...), el en-tornodeejecucion (estructuraderegistrosy memoriadela maquinadondeseva a ejecutarel programa. . . ) y el sistemaoperativo seenglobanen laetapafinal y seaislandel resto.

La generacion de codigo es la tareamas complicadade un compilador.Las ventajasde utilizar estarepresentacion intermedia,independientedela maquinaenla quesevaaejecutarel programa,son:� Sepuedecrearuncompiladorparaunanuevamaquinadistintaunien-

do la etapafinal dela nuevamaquinaa unaetapainicial ya existente.Sefacilita la redestinacion.

Page 3: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 207

� Se puedeaplicar, a la representacion intermedia,un optimadordecodigoindependientedela maquina.

La figura7.1muestralasdosetapasy comoserelacionanentresı a travesdela representacion intermedia.

Componentes

Analizador

Analizador

Arbol

Analizador

Optimizador de

fuentePrograma ETAPA

INICIAL

ETAPA

FINAL

Generador de

Optimizador deIntermedio

código intermedio

Semántico

Sintáctico

Sintáctico

léxicos

Léxico

Código

código máquina

Código máquina

Código máquina

Figura 7.1: Etapainicial y final deuncompilador

Enestecapıtulo veremoscomotraducirlasconstruccionesdeloslenguajesde programacion como: las declaraciones,asignacionesy proposicionesdeflujo decontrola unarepresentacion intermedia.La mayorpartedelastraduccionesdeestasproposicionessepuedenimplantarduranteel analisissintacticoutilizando las tecnicasde traduccion vistasen en el diseno deesquemasdetraducciondirigidospor la sintaxis(ETDS).

Page 4: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

208 7.2. TIPOSDE REPRESENTACIONESINTERMEDIAS: EL CODIGO DE 3-DIRECCIONES

7.2 TIPOS DE REPRESENTACIONES INTERMEDIAS: EL CODIGODE 3-DIRECCIONES

Unarepresentacionintermediaesunaestructuradedatosquerepresentaalprogramafuenteduranteel procesodela traduccionacodigoobjeto.Has-ta ahorahemosusadoel arbol de analisis sintacticocomorepresentacionintermedia,junto conla tabladesımbolosquecontenıa informacionsobrelos nombres(variables,constantes,tiposy funciones)queaparecıanenelprogramafuente.

Aunqueel arboldeanalisissintacticoesunarepresentacion valida,no separeceni remotamenteal codigoobjeto,enel quesolo seempleansaltosa direccionesen memoriaen vez de construccionesde alto nivel, comosentenciasif-then-else . Es necesariogenerarunanueva forma derepresentacionintermedia.A estarepresentacionintermedia,quesepareceal codigoobjetoperoquesiguesiendoindependientedela maquina,selellamacodigointermedio.

El codigo intermediopuedetomarmuchasformas.Todasellasseconsid-erancomouna forma de linearizacion del arbol sintactico,esdecir, unarepresentacion del arbol sintacticode forma secuencial.El codigo inter-mediomashabitualesel codigode3-direcciones.

El codigo de tr es dir eccioneses una secuenciade proposicionesde laformageneral

x = y op z

dondeop representacualquieroperador;x,y,z representanvariablesdefinidasporel programadoro variablestemporalesgeneradasporel com-pilador. y,z tambienpuedenrepresentarconstanteso literales.op repre-sentacualquieroperador:unoperadoraritmeticodepuntofijo o flotante,ounoperadorlogicosobredatosbooleanos.

Page 5: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 209

No sepermiteningunaexpresion aritmeticacompuesta,puessolo hayunoperadorenel ladoderecho.Porejemplo,x+y*z sedebetraducira unasecuencia,donde

���������sonvariablestemporalesgeneradaspor el compi-

lador.

� ���� ����� ���� ���Lasexpresionescompuestasy lasproposicionesdeflujo decontrolsehandedescomponerenproposicionesdeestetipo, definiendoun conjuntosu-ficientementeampliodeoperadores.Sele llamacodigode3-direccionesporquecadaproposicioncontiene,enel casogeneral,tresdirecciones,dosparalos operandosy unaparael resultado.(Aunqueapareceel nombredela variable,realmentecorrespondeal punteroa la entradadela tabladesımbolosdedichonombre).

El codigodetresdireccionesesunarepresentacion linealizada(deizquier-daa derecha)del arbolsintacticoenla quelos nombrestemporalescorre-spondena los nodosinternos.Comoestosnombrestemporalesserepre-sentanenla memoriano seespecificamasinformacion sobreellosenestetipo de codigo. Normalmenteseasignaran directamentea registroso sealmacenaranenla tabladesımbolos.

2*a+b-3

t1 t2

t3+

* -

a b 32

Codigo de 3-direcciones:���= 2 * a���= b - 3���=� �

+���

Page 6: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

210 7.2. TIPOSDE REPRESENTACIONESINTERMEDIAS: EL CODIGO DE 3-DIRECCIONES

7.2.1 Tiposdeproposicionesde3-direcciones

La formadecodigode3-direccionesquehemosvisto hastaahoraesinsu-ficientepararepresentartodaslasconstruccionesdeunlenguajedeprogra-macion(saltoscondicionales,saltosincondicionales,llamadasafunciones,bucles,etc),por tantoesnecesariointroducirnuevosoperadores.El con-juntodeproposiciones(operadores)debeserlo suficientementerico comoparapoderimplantarlasoperacionesdel lenguajefuente.

Lasproposicionesde3-direccionesvana serenciertamaneraanalogasalcodigoensamblador. Lasproposicionespuedenteneretiquetassimbolicasy existeninstruccionesparael flujo decontrol(goto ). Unaetiquetasimbolicarepresentael ındicedeunaproposicion de3-direccionesen la lista de in-strucciones.

Lasproposicionesde3-direccionesmascomunesqueutilizaremos:

1 Proposicionesde la forma x = y op z dondeop esun operadorbinarioaritmetico,logicoo relacional.

2 Instruccionesdela formax = op y , dondeop esunoperadorunario(operadornegacion logico, menosunario, operadoresde desplaza-mientoo conversiondetipos).

3 Proposicionesde copiade la forma x = y , dondeel valor de y seasignaax .

4 Saltoincondicionalgoto etiq . La instruccion conetiquetaetiq

esla siguientequeseejecutara.

5 Saltoscondicionalescomoif false x goto etiq .

6 param x y call f paraapilar los parametrosy llamadasa fun-ciones(losprocedimientosseconsideranfuncionesquenodevuelvenvalores). Tambien return y , queesopcional,paradevolver val-ores.Codigogeneradocomopartedeunallamadaal procedimientop(x 1,x 2,...,x n) .

Page 7: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 211

param���

param� �

...

param���

call p,n

7 Asignacionescon ındicesde la forma x = y[i] , dondeseasignaa x el valor de la posicion en i unidadesdememoriamasalla de laposiciony . O tambienx[i] = y .

8 Asignacionesdedireccionesapunterosdela formax = &y (el valorde

�esla direccion de

�), x = *y (el valor de

�seigualaal con-

tenidodela direccion indicadaporel puntero�) o *x = y (el objeto

apuntadopor�

seigualaal valorde�).

Ejemplo. Consideremosel codigoquecalculael factorialdeun numero.La tabla7.1muestrael codigofuentey el codigode3-direcciones.Existeun saltocondicionalif false queseusaparatraducirlassentenciasdecontrol if-then, repeat-until que contienedos direcciones:elvalor condicionalde la expresion y la direccion de salto. La proposicionlabel solo tiene una direccion. Las operacionesde lecturay escritu-ra, read, write , conunasoladireccion. Y unainstruccion deparadahalt queno tienedirecciones.

Page 8: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

212 7.2. TIPOSDE REPRESENTACIONESINTERMEDIAS: EL CODIGO DE 3-DIRECCIONES

readx; readx

if 0 � x then t1 = 0 � x

fact:=1; if falset1 gotoL1

repeat fact=1

fact:=fact*x; labelL2

x:=x-1; t2=fact* x

until x=0; fact=t2

write fact; t3=x-1

end; x=t3

t4=x==0

if falset4 gotoL2

write fact

labelL1

halt

Tabla 7.1: Codigofuentey codigode3-direccionespara el calculodel factorial

7.2.2 Implementacion decodigode tr esdir ecciones

Unaproposiciondecodigode3-direccionessepuedeimplantarcomounaestructuratipo registro con camposparael operador, los operandosy elresultado. La representacion final sera entoncesuna lista enlazadao unvectordeproposiciones.

Implementacion mediantecuadruplos

Un cuadruploesunaestructuratipo registroconcuatrocamposquesella-man(op, result, arg1, arg2) . El campoop contieneuncodigointernoparael operador.

Porejemplo,la proposiciondetresdireccionesx = y + z serepresentamedianteel cuadruplo(ADD, x,y, z). Las proposicionescon operadoresunariosno usanel "!$#&% . Los camposqueno seusansedejanvacıoso unvalor NULL. Comosenecesitancuatrocampossele llamarepresentacionmediantecuadruplos.

Page 9: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 213

Una posibleimplantacion del programaquecalculael factorialmediantecuadruplossemuestraahoraenla parteizquierdadela tabla7.2.

(a)Cuadruplos (b) Tripletes

(read,x,–,–) (0) (read,x,–)

(isbigger,t1,x,0) (1) (isbigger,x,0)

(if false,t1,L1,–) (2) (if false,(1), (11))

(assign,fact,1,–) (3) (assign,fact,1)

(label,L2,–,–) (4) (mult, fact,x)

(mult,t2,fact,x) (5) (assign,(4), fact)

(assign,fact,t2,–) (6) (sub,x,1)

(sub,t3,x,1) (7) (assign,(6), x)

(assign,x,t3,–) (8) (isequal,x, 0)

(isequal,t4,x,0) (9) (if false,(8),(4))

(if false,t4,L2,–) (10) (write,fact,–)

(write,fact,–,–) (11) (halt,–,–)

(label,L1,–,–)

(halt,–,–,–)

Tabla7.2: Codigode3-direccionesmediante:(a) cuadruplosy (b) tripletes

Page 10: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

214 7.2. TIPOSDE REPRESENTACIONESINTERMEDIAS: EL CODIGO DE 3-DIRECCIONES

Implementacion mediantetripletes

Paraevitar tenerqueintroducirnombrestemporalesenla tabladesımbolos,sehacereferenciaa un valor temporalsegun la posicion dela proposicionquelo calcula.Laspropiasinstruccionesrepresentanel valor del nombretemporal.La implantacion sehacemedianteregistrosdesolo trescampos(op, arg1, arg2) .

La partederechadela tabla7.2muestrala implantacionmediantetripletesdel calculo del factorial. Los numerosentreparentesisrepresentanpun-terosdentrode la lista detripletes,entantoquelos punterosa la tabladesımbolosserepresentanmediantelos nombresmismos.

En la notacion de tripletessenecesitamenorespacioy el compiladornonecesitagenerarlos nombretemporales.Sin embargo, en estanotacion,trasladarunaproposicion quedefinaun valor temporalexige quesemod-ifiquentodaslas referenciasa esaproposicion. Lo cualsuponeun incon-venientea la hora de optimizar el codigo, puesa menudoes necesariocambiarproposicionesdelugar.

A partir deahoranosvamosacentrarenla notaciondecuadruplos,queesla queseimplantara en la practica3. La figura7.2 a continuacion mues-tra en codigo C comosepodrıa implantarla estructurade datosparaloscuadruplos:

typedefenum ' assign,add,mult,if false,goto,label,read,write, isequal,. . . ( OpKind;typedefstruct '

int val;// paravaloreschar*name;//paraidentificadoresdevariables( Address;

typedefstruct 'OpKindop;Addressresult,arg1,arg2;( Quad;

Figura 7.2: PosibleimplantacionenC dela estructura cuadruplo

Page 11: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 215

Porsimplicidadsepodrianconsiderarloscamposresult, arg1, arg2

comopunterosa caracter. En estaimplantacion solo sepermitequeun ar-gumentorepresenteunaconstanteenteraounacadena( lacadenarepresen-ta el nombredeun temporalo unavariablede la tabladesımbolos).Unaalternativa a almacenarnombresenel cuadruploesalmacenarpunterosala tablade sımbolos,con lo queseevita tenerquehaceroperacionesdebusquedaenunprocesadoposterior.

7.3 CODIGO INTERMEDIO COMO UN ATRIB UTO SINTETIZA-

DO

El codigo intermediopuedeser consideradocomo un atributo sintetiza-do. El codigo intermedioes visto como una cadenade caracteresy sepuededisenar un esquemade traduccion dirigido por la sintaxis(ETDS)quegeneredichocodigoal recorrerel arboldeanalisissintacticoenordenpostfijo.

Consideremoscomoejemplola siguientegramaticasimplificadaquegen-eraexpresionesaritmeticas.Dadala expresion ) * ) �+� ) � secalculaelvalordelno-terminal) enunnombretemporal

�. Porel momento,secrea

unnuevo nombrecadavezquesenecesita.Mastardeveremosunsencillometodoparareutilizarlosnombrestemporales.

Cadano-terminaltienedosatributos:

� E.lugar , nombretemporalquecontendrael valorde ) , (���������,�.-/-/-

).

� E.cod , seriede todaslasproposicionesdecodigode3-direccionesquecalculan) .

Ambosatributossonsintetizados.La funcionnuevotemp() generanom-bresdistintos

���,

���, ... cadavezqueesllamada.Las llavesindican

Page 12: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

216 7.3. CODIGO INTERMEDIO COMO UN ATRIBUTO SINTETIZADO

una instruccion de codigo de 3-direcciones.El sımbolo // representalaconcatenacion delos trozosdecodigo.

Produccion Regla Semantica0�1 243�57698 0;:=<?>@3A698B:7<C>�3EDFD '@GIH�JKH�LNMKO 243EPQ6R8�: GTS$U/MWV,(8X1 8ZY\[]8_^ 8�: GTS$U/MWV 6a` SKH�b >dc H�LefO PCg8�:=<C>�3A6a8hYC:=<C>�3EDFD�8i^�:=<?>@3EDFD ' 8B: GTS$U.M,V 698ZYC: GTS$U.MWV [j8i^�: GTSkU.MWV,(8X1 O 8hYlP 8�: GTS$U/MWV 6R8hYm: GTS$U/MWV8�:=<C>�3A6a8hYC:=<C>�38X1 2n3 8�: GTS$U/MWV 6 GIH�JKH�LNMKO 243EP8�:=<C>�3A6poZo8X1 ` SKL 8�: GTS$U/MWV 6 GIH�JKH�LNMKO ` SkL PCg8�:=<C>�3A6poZoTabla7.3: ETDSpara expresionesaritmeticas

Veamosel ejemplox=x+3+4 . La figura 7.3 muestrael arbol sintactico.El codigode3-direccionescorrespondientees:

� �= x + 3���=� �

+ 4

x =���

lugar=’x’ cod=’ ’ lugar=’3’

cod=’ ’ lugar=’4’lugar=t1

cod=’ ’

cod=’t1=x+3’

lugar=t2cod=’t1=x+3 t2=t1+4’

cod=’t1=x+3

x=t2’ t2=t1+4

id

(x)

S

=E

E E+

+ EE

id num

num

(x) (3)

(4)

Figura 7.3: Arbol sintacticopara el ejemplox=x+3+4

Page 13: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 217

Reutilizacion de losnombrestemporales

Hastaahorasehasupuestoquela funcionnuevotemp() generaunnom-bretemporalcadavezquesenecesitauntemporal. Sinembargo,losnom-brestemporalesutilizadosparaguardarvaloresintermediosdeloscalculosde expresionestienenque ser introducidosen la tabla de sımbolosparaguardarsusvaloresconel consiguienteaumentodeespacio.

Losnombrestemporalessepuedenreutilizarmedianteunsencillometodoqueconsisteenllevarunacuentaq , iniciadaacero,devariablestemporales.Cuandoseutilice unnombretemporalcomooperandohayquedecremen-tarel valorde q en r . Siemprequesegenereunnuevo nombretemporalseusael valor del contador(sprintf(simbolo,‘‘t%d’’ ,c) ) y sein-crementael valorde q en r . Consideremosel ejemplo:

�R "st� q vu�wyx\ \zProposicion Valordec

0

t0 = a* b 1

t1 = c * d 2

t0 = t0 + t1 1

t1 = e* f 2

t0 = t0 - t1 1

x = t0 0

=

id

(x)

-+ *

e f* *

a b c d

Figura 7.4: Arbol sintacticopara el ejemplox=a*b+c*d-e*f

Page 14: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

218 7.4. TRADUCCION DE PROPOSICIONESDE ASIGNACION Y EXPRESIONESARITMETICAS

7.4 TRADUCCI ON DE PROPOSICIONES DE ASIGNACION Y EX-

PRESIONESARITM ETICAS

La tabla7.4 a continuacion muestracomosepuederealizarla traducciondeexpresionesaritmeticasmascomplejas.La funcion

gen cuad(op, result, arg1, arg2)

generael correspondientecodigode3-direccionesennotaciondecuadruplos.Cadavezqueesllamadageneraunalistadecodigoconsolo uncuadruplo.

Produccion ReglasSemanticas0{1 2n3|576R8 0;:7<C>�3}698�:=<C>�3EDFD U.H ` < SKM 3 OI~ 0Q0&�E������243$: GTSkU.MWV ��8�: GTS$U/MWV �����ZP8�1 8ZY\[]8_^ 8�: G�S$U.MWV 6R` SKH�b >�c H�LefO P8�:=<?>@3698ZYm:=<?>@3EDFD�8i^�:=<?>@3EDFD U.H ` < SKM 3 O�~Z��� ��8�: G�S$U.MWV ��8hY�: G�S$U.MWV ��8_^�: GTS$U.M,V P8�1 8ZY���8_^ 8�: G�S$U.MWV 6R` SKH�b >�c H�LefO P8�:=<?>@3698ZYm:=<?>@3EDFD�8i^�:=<?>@3EDFD U.H ` < SKM 3 O�������� ��8�: G�S$U.MWV ��8hYC: GTS$U/MWV ��8i^�: G�S$U.MWV P8�1 ��8hY 8�: G�S$U.MWV 6R` SKH�b >�c H�LefO P8�:=<?>@3698ZYm:=<?>@3EDFD U.H ` < SKM 3 O4�Z� �E� � 0;��8�: GTS$U/MWV ��8ZY?: GTS$U.M,V ������P8�1 O 8ZY�P 8�: G�S$U.MWV 698ZYC: G�S$U.MWV8�:=<?>@3698ZYm:=<?>@38�1�243 8�: G�S$U.MWV 6 G�H�JKH�LNMKO 2n3EP8�:=<?>@36�o�oTabla7.4: ETDSpara expresionesaritmeticas

En la practica las proposicionesde 3-direccionesse puedenescribir deforma consecutiva a un archivo de salidaen lugar de construirla lista deproposicionesenel atributocod , lo quefacilita la implementacion.

Veamosahoracomosepuedeimplantarunafuncion recursiva quegenerael codigode3-direcciones,quellamaremosgenera codigo() . Al finy al cabosetratadeun atributo sintetizadoy podemosrecorrerel arbolenmodopostfijo. Supongamosquela funcion devuelve un registro llamadoTAC (Three-Address-Code ), quecontienedoscampos:

� lugar (nombretemporaldondesealmacenael valor deunaexpre-

Page 15: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 219

sion)

� cod (punteroa la lista decuadruplosquealmacenael codigo).

Seutilizael lexema,peroserıaenrealidadunpunteroala tabladesımbolos.

Page 16: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

220 7.4. TRADUCCION DE PROPOSICIONESDE ASIGNACION Y EXPRESIONESARITMETICAS

typedef enum � n assign, n mult, n add, n id, ... � NodeKind;

typedef struct streenode �NodeKind kind;

int nchilds; // numero de hijos

struct streenode childs[MAXNUMCHILDS];

// se puede usar una lista con primer hijo que apunta a hermanos

int val; // para constantes numericas

char *strval; // para identificadores, deberia ser puntero a la TS� STreeNode;

typedef STreeNode * SyntaxTreeRoot;

typedef struct �char lugar[10];

lista codigo *cod; //puntero a lista de cu adruplos� TAC;

=

id E E E1 2 E E1 2

n_menos n_mult

E E1 2

n_masn_uminus

E

n_id n_num

Figura 7.5: Tiposdenodo

TAC genera codigo (STreeNode *nodo) �TAC datos;

TAC aux1, aux2;

lista codigo *cod=NULL;

datos.cod=NULL;

switch (node- � kind) �case n assign: // childs[0]=id, childs[1]=E

aux1=genera codigo(childs[1]);

cod=gen cuad(assign, lexema(id), aux1.lugar,--);

datos.cod=concatena codigo(aux1.cod,cod);

break;

Page 17: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 221

case n add: // childs[0]= � � , childs[1]= � �aux1=genera codigo(childs[0]);

aux2=genera codigo(childs[1]);

datos.lugar=nuevotemp();

cod=gen cuad(add, datos.lugar,aux1.lugar,aux2.lugar );

datos.cod=concatena codigo(aux1.cod,aux2.cod,cod);

break;

case n mult: // childs[0]= � � , childs[1]= � �aux1=genera codigo(childs[0]);

aux2=genera codigo(childs[1]);

datos.lugar=nuevotemp();

cod=gen cuad(mult, datos.lugar,aux1.lugar,aux2.lugar);

datos.cod=concatena codigo(aux1.cod,aux2.cod,cod);

break;

case n parentesis: // childs[1]= �// no haria falta crear este tipo de nodo

datos=genera codigo(childs[1]);

break;

case n id:

datos.lugar=lexema(id);

datos.cod=NULL;

break; �case n num:

datos.lugar=lexema(num);

datos.cod=NULL;

break; �return(datos);�

Page 18: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

222 7.5. TRADUCCION DE EXPRESIONESBOOLEANAS

7.5 TRADUCCI ON DE EXPRESIONES BOOLEAN AS

Las expresionesbooleanasse utilizan principalmentecomo partede lasproposicionescondicionalesquealteranel flujo de control del programa,if-then, if-then-else, while-do . Lasexpresionesbooleanassecomponendelosoperadoresbooleanosand,or,not aplicadosavari-ablesbooleanaso expresionesrelacionales.

A su vez, las expresionesrelacionalesson de la forma ) � oprel ) � ,donde) � y ) � sonexpresionesaritmeticasy oprel escualquieroperadorrelacional<, >, <=, >=,... .

Consideremosexpresionesbooleanasgeneradaspor la gramatica:

E � E or E

| E and E

| not E

| ( E )

| id oprel id

| true

| false | id

Uno de los metodosparatraducir expresionesbooleanasa codigo de 3-direccionesconsisteencodificarnumericamentelosvalorestrue y false

y evaluarunaexpresion booleanacomounaexpresionaritmetica,siguien-do unasprioridades.A menudoseutiliza r paraindicar true y 0 paraindicarfalse .

Las expresionesbooleanasseevaluande manerasimilar a unaexpresionaritmeticadeizquierdaaderecha.Supongamosel ejemplo:a or b and

not c . La secuenciadecodigode3-direccionescorrespondientees:

� �= a or b

Page 19: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 223

� �= not c�?�=

�@�and

���La siguientegramatica en la tabla 7.5 muestrael ETDS para producircodigode3-direccionesparalasexpresionesbooleanas.

Produccion ReglasSemanticas8�1 8hYf> V 8_^ 8�: GTS$U/MWV 6�` SKH�b >dc H�Le\O P8�:=<C>�3A6a8hYC:=<C>�3EDFD�8i^�:=<?>@3EDFD U.H ` < SKM 3 O > V ��8�: G�S$U.MWV ��8hY�: GTS$U.M,V ��8i^�: GTSkU.MWV P8�1 8hY M `v3�8i^ 8�: GTS$U/MWV 6�` SKH�b >dc H�Le\O P8�:=<C>�3A6a8hYC:=<C>�3EDFD�8i^�:=<?>@3EDFD U.H ` < SKM 3 O�M ` 3$��8B: GTS$U.M,V ��8ZYm: GTSkU.MWV ��8i^�: GTS$U.MWV P8�1 ` >�cf8hY 8�: GTS$U/MWV 6�` SKH�b >dc H�Le\O P8�:=<C>�3A6a8hYC:=<C>�3EDFD U.H ` < SKM 3 O ` >�cm��8B: GTS$U.M,V ��8ZY�: GTS$U/MWV �����ZP8�1 O 8ZYlP 8�: GTS$U/MWV 6a8hYC: GTS$U/MWV8�:=<C>�3A6a8hYC:=<C>�38�1 243/Yf> e$V�H�G 2n3tY 8�: GTS$U/MWV 6�` SKH�b >dc H�Le\O PCg8�:=<C>�3A6 U.H ` < SKM 3 O > e$V�H�G ��8�: G�S$U.MWV � G�H�JKH�LNM¡O 243/YlPm� G�H�JKH�LNM¡O 243W^?P�P8�1�c V�SKH 8�: GTS$U/MWV 6�` SKH�b >dc H�Le\O PCg8�:=<C>�3A6 U.H ` < SKM 3 O�ME¢d¢ 2 U `;��8B: GTS$U.MWV ��£F�����ZP8�1 ¤ M,G�¢�H 8�: GTS$U/MWV 6�` SKH�b >dc H�Le\O PCg8�:=<C>�3A6 U.H ` < SKM 3 O�ME¢d¢ 2 U `;��8B: GTS$U.MWV ��¥/�����ZP8�1 243 8�: GTS$U/MWV 6 G�H�JKH�LNM¡O 243EP8�:=<C>�3A6poFoTabla7.5: ETDSpara expresionesbooleanasutilizandounarepresentacion numerica

La funcion paragenerarcodigosepodrıaampliaranadiendonuevoscasosa la sentenciaswitch correspondientesa los tipos de nodosasociadosa los operadoreslogicos. Por ejemplo,parael nodo correspondientealoperadorlogicoand , nodotipo n and , seinsertarıa el siguientetrozodecodigo:

case n and: // childs[0]= ) � , childs[1]= ) �aux1=genera codigo(childs[0]);

aux2=genera codigo(childs[1]);

datos.lugar=nuevotemp() ;

cod=gen cuad(and, datos.lugar,aux1.lugar,au x2.l uga r);

Page 20: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

224 7.5. TRADUCCION DE EXPRESIONESBOOLEANAS

datos.cod=concatena codigo(aux1.cod,aux2.cod, cod );

break;

Page 21: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 225

7.6 TRADUCCI ON DE PROPOSICIONES DE CONTROL

Pasemosaconsiderarahorala traducciondeproposicionesdecontrol if-then, if-then-else, while-do generadasporlasiguientegramatica:

S � if E then ¦ �| if E then ¦ � else ¦ �| while E do ¦ �

7.6.1 Proposicion if-then

Supongamosuna sentenciaif-then de la forma § * if ) then§ � , verdiagramadeflujo enfigura7.6.Paragenerarel codigocorrespondi-enteaestaproposicionhabrıaqueanadirala funciongenera codigo()

un nuevo casoparala sentenciaswitch quecontempleestetipo denodoenel arbolsintactico,nodon ifthen .

SALTO CONDICIONAL

CODIGO S

F

V

Etiqueta 1

CODIGO CALCULO E

n_ifthen

SE

(a) (b)

Figura 7.6: (a) Diagramadeflujo para la proposicion if-then y (b) tipo denodo

TAC datos;

TAC aux1, aux2;

lista codigo *cod;

datos.cod=NULL;

direcciones dir; //usamos direcci on al salto, en vez de etiquetas

case n ifthen: // childs[0]=E, childs[1]= ¦ �aux1=genera codigo(childs[0]);

cod=gen cuad(if false,--, aux1.lugar, dir?);

Page 22: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

226 7.6. TRADUCCION DE PROPOSICIONESDE CONTROL

// aun no se sabe la direc. de salto

aux2=genera codigo(childs[1]);

dir=sgtedirlibre(); //relleno de retroceso

rellena(cod,arg3,dir)

datos.cod=concatena codigo(aux1.cod,cod,aux2.cod);

break;

Supondremosquetenemosunafuncion,sigtedirlibre() , queguar-dael ındicedela siguienteinstruccion libre (la funcion gen cuad() in-crementaesecontador).En la implantacionsehaoptadoporutilizar direc-cionesdirectamentea lasinstruccionesenvezdeusaretiquetas.

7.6.2 Proposicion if-then-else

Supongamosunasentenciaif-then-else dela forma §p* if ) then§ � else § � , cuyo diagramade flujo tiene la forma representadaenla figura 7.7. Paragenerarel codigo correspondientea estaproposicionhabrıaqueanadira la funciongenera codigo() unnuevo casoparalasentenciaswitch quecontempleestetipo denodoenel arbolsintactico,nodon ifthenelse . Estefragmentodecodigosepodrıa implantardeformasimilar acomohemoshechoenla seccion anterior. Ver ejercicios.

Page 23: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 227

´CODIGO CALCULO E

SALTO CONDICIONAL F

V

CODIGO S1

SALTO INCONDICIONAL

CODIGO S2

Etiqueta 1

Etiqueta 2 n_ifthen_else

S2E S1

(a= (b)

Figura 7.7: (a)Diagramadeflujo para la proposicion if-then-else y (b) tipo denodo

7.6.3 Proposicion while-do

Unasentenciawhile -do tienela forma ¨�© while ª do ¨�« , cuyodiagramade flujo viene representadoen la figura 7.8. Para generarelcodigo correspondientea estaproposicion habrıa queanadir a la funciongenera codigo() un nuevo casoparala sentenciaswitch quecontem-pleestetipo denodoenel arbolsintactico.

´CODIGO CALCULO E

SALTO CONDICIONAL F

V

SALTO INCONDICIONAL

Etiqueta 1

CODIGO S

Etiqueta 2 E

n_while

S

(a= (b)

Figura 7.8: (a)Diagramadeflujo para la proposicionwhile do y (b) tipo denodo

Supondremosque tenemosuna funcion, sigtedirlibre() , que guardaelındicedela siguienteinstruccion libre (seasumequela funcion gen cuad()

Page 24: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

228 7.7. OPTIMIZACION DE CODIGO INTERMEDIO

incrementaesecontador).

TAC datos; datos.cod=NULL;

TAC aux1, aux2;

lista codigo *cod1=NULL, *cod2=NULL;

direcciones dir1,dir2;

case n while: // childs[0]=E, childs[1]= ¬.­dir1=sgtedirlibre();

aux1=genera codigo(childs[0]);

cod1=gen cuad(if false,--, aux1.lugar, dir?);

aux2=genera codigo(childs[1]);

cod2=gen cuad(goto,--, dir1,--);// salto incondicional a dir1

dir2=sigtedirlibre();

// rellena argumento de cod1, direccion salto condicional

rellena(cod1,arg3,dir2)

datos.cod=concatena codigo(aux1.cod,cod1,aux2.cod,cod2 );

break;

Seha optadopor utilizar direccionesdirectamentea las instruccionesenvezdeetiquetas.

7.7 OPTIMIZA CION DE CODIGO INTERMEDIO

La optimizacion decodigointermediosepuederealizar:

® a nivel local: solo utilizan la informacion de un bloquebasicopararealizarla optimizacion.

® anivel global: queusaninformaciondevariosbloquesbasicos.

El terminooptimizacion de codigo esinadecuadoya queno segarantizael obtener, en el sentidomatematico,el mejor codigo posibleatendiendoa maximizaro minimizarunafuncion objetivo (tiempodeejecucion y es-

Page 25: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 229

pacio). El termino de mejora de codigo serıa mas apropiadoque el deoptimizacion.

Nos concentraremosbasicamenteen la optimizacion de codigo de tres-direcciones,puestoquesonsiempretransportablesa cualquieretapafinal,sonoptimizacionesindependientesdela maquina. Las optimizacionesanivel de la maquina,como la asignacion de registrosy la utilizacion deinstruccionesespecıficasdela maquina,sesalendelcontexto deestaasig-natura.

La mayorıadelosprogramasempleanel ¯ °\± deltiempodeejecucionenel² °\± desucodigo.Lo masadecuadoesidentificarlaspartesdel programaque se ejecutanmas frecuentementey tratar de que se ejecutenlo maseficientementeposible. En la practica,sonlos lazosinternoslos mejorescandidatospararealizarlastransformaciones.

Ademasdela optimizacion anivel decodigointermedio,sepuedereducirel tiempodeejecuciondeunprogramaactuandoaotrosniveles:anivel decodigofuentey anivel decodigoobjeto.

EtapaInicial

CodigoObjetoGenerador

de Codigo

IntermedioCodigoCodigo

fuente

el programador puedemodificar algoritmostransformar lazos

el compilador puedemejorar los lazos

el compilador puedeusar registrosseleccionar instrucciones

Figura 7.9: Nivelesenlosqueel programadory el compiladorpuedenmejorar el codigo

Page 26: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

230 7.7. OPTIMIZACION DE CODIGO INTERMEDIO

Un bloquebasicoesunaunidadfundamentaldecodigo.Esunasecuenciadeproposicionesdondeel flujo decontrolentraenel principiodelbloqueysaleal final delbloque.Losbloquesbasicospuedenrecibirel controldesdemasdeun puntoenel programa(sepuedellegar desdevariossitiosa unaetiqueta)y el controlpuedesalir desdemasdeunaproposicion (sepodrıair a unaetiquetao seguir conla siguienteinstruccion). Cuandoaplicamosoptimizacion dentrodeun bloquebasicosolo nostenemosquepreocuparsobrelos efectosde la optimizacion en los valoresde las variablesa laentradadel bloquey los valoresquetienena la salidadel bloque,quehandeserlosmismosqueenel codigooriginal sin transformar.

El algoritmoparaparticionarunprogramaenbloquessedescribeacontin-uacion:

1 Encontrar todas las proposiciones que comienzan el principio de un bloque

basico:³La primera sentencia del programa.³Cualquier proposici on del programa que es el objetivo de un salto.³Cualquier proposici on que sigue a una bifurcaci on.

2 Para cualquier proposici on que comienza un bloque basico, el bloque

consiste de esa proposici on y de todas las siguientes hasta el prin-

cipio del siguiente bloque o el final del programa.

El flujo de control de un programapuedevisualizarsecomoun grafo di-rigido debloquesbasicos.A estegrafosele llamagrafo deflujo. ComoejemploconsideremosestetrozodecodigoescritoenpseudoCquesumalosdiezprimerosnumerosquesemuestraenla tabla7.6(a):

Page 27: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 231

void main() i = 10´s = 0

int i,s; labell1

i=10; t0 = i µ 0

s=0; if falset0 gotol2

while i µ 0 do s = s + i´i = i - 1

s=s+i; gotol1

i=i-1; labell2¶. . .¶

(a) (b)

Tabla7.6: Ejemplo(a) codigofuente, (b) codigode3-direcciones

La figura 7.10 muestrael diagramade flujo parael ejemploanterior.Aparecen4 bloquesbasicos.

label l1t0 = i > 0iffalse t0 goto l2

i = i - 1s = s + i

goto l1. . .

s = 0i = 10

label l2

Figura 7.10: Diagramadeflujo

Page 28: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

232 7.7. OPTIMIZACION DE CODIGO INTERMEDIO

Algunasdefinicionesprevias:

® Dadaunaproposicionde3-direccionesdela formaa= bopcdecimosquela proposicion referenciab y c y quedefinea.

® Sedicequeunnombreenunbloquebasicoviveal final delbloquesisuvalor esreferenciadoenotro bloquebasicoenel programa.

® Sedicequeun nombreesta muertosi no esreferenciadoenel restodelprograma.

Sepresentanalgunasdelastransformacionesmasutilesparamejorarelcodigo. Sontransformacioneslocales,sepuedenrealizarobservandosololasproposicionesdeun bloquebasico.

7.7.1 Eliminaci on de subexpresionescomunes

Si unaexpresion secalculamasdeunavez,sepuederemplazarel calculodela segundapor el valor dela primeraexpresion. Consideremosel sigu-ienteejemplodelcodigo7.7(a). Vemosquela expresion ·�¸|¹�· ² secalculadosveces,por tantopodemosescribirel codigodela figura7.7(b):

t1 = 4 - 2 t1 = 4 - 2

t2 = t1 / 2 t2 = t1 / 2

t3 = a * t2 t3 = a* t2

t4 = t3 * t1 t4 = t3 * t1

t5 = t4 + b t5 = t4 + b

t6 = t3 * t1 t6 = t4

t7 = t6 + b t7 = t6 + b

c = t5 * t7 c = t5 * t5

(a) (b)

Tabla7.7: Eliminaciondesubexpresionescomunes

Estosolo esposiblesi losoperandosqueestanimplicadosenel calculodela expresionnohanmodificadosuvalor enlasproposicionesintermedias.

Page 29: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 233

7.7.2 Propagacion decopias

La propagacion decopiasconsideralasproposicionesde la forma ºX» ¼ .Despuesde estasentenciasabemosque º y ¼ tienenel mismovalor, portanto,podemosremplazarcadavezqueaparezcaº por ¼ , conla esperanzadequepodamosremplazartodaslasocurrenciasde º hastaqueseconviertaenunnombremuertoy sepuedaentonceseliminarla proposiciondecopia.

A partirdelcodigoanteriorpodemoseliminarla proposiciondecopia ·�½{»·?¾ . Sustituimos·�½ por ·?¾ . Veasefigura7.8(a). Ahorasepuedeverquehayde nuevo unasubexpresion comun quepuedesereliminada,obteniendoel codigo que se muestraen 7.8 (b). Y finalmenterealizandootra vezpropagacion decopias,obtenemos7.8(c):

t1 = 4 - 2 t1 = 4 - 2 t1 = 4 - 2

t2 = t1 / 2 t2 = t1 / 2 t2 = t1 / 2

t3 = a * t2 t3 = a * t2 t3 = a* t2

t4 = t3 * t1 t4 = t3 * t1 t4 = t3 * t1

t5 = t4 + b t5 = t4 + b t5 = t4 + b

t6 = t4 t6 = t4 t6 = t4

t7 = t4 + b t7 = t5 t7 = t5

c = t5 * t7 c = t5 * t7 c = t5 * t5

(a) (b) (c)

Tabla 7.8: Propagaciondecopiasy eliminaciondesubexpresionescomunes

Vemosque el haberhechouna optimizacion puededar lugar a que seaposibleaplicarnuevasoptimizaciones.

Page 30: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

234 7.7. OPTIMIZACION DE CODIGO INTERMEDIO

7.7.3 Eliminaci on de codigomuerto

Podemostenerproposicionesquedefinenunnombrequenuncamasesreferenciado,esta muerto.Estasproposicionespuedenentoncesserelim-inadas. Dadala proposicion a= b op c, sedice queescodigo muertooinactivosi º no esreferenciada.En general,el codigomuertoaparececo-mo consecuenciadela propagacion decopiasy esestolo quehacequelatecnicade propagacion de copiasseatan util. Veamoscomoaplicarestatecnicaal ejemploanteriorenla figura7.8(c).

Vemosque ·�½ y ·d¿ no tienenningunareferenciaa partir desudefinicion,por tanto puedenser eliminadas. Obtenemosel codigo que apareceenla figura 7.9. Seha supuestoquetodaslas variablesno-temporalesestanvivas,sehacereferenciaaellasenel restodelprograma.

t1 = 4 - 2

t2 = t1 / 2

t3 = a* t2

t4 = t3 * t1

t5 = t4 + b

c = t5 * t5

Tabla7.9: Eliminaciondecodigomuerto

Aunqueespocoprobablequeel programadorintroduzcacodigomuertooinactivo, estepuedeaparecercomoresultadode transformacionesanteri-ores.

Page 31: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 235

7.7.4 Transformacionesaritm eticas

Sepuedenhacerusode transformacionesalgebraicassimplesparare-ducir la cantidaddecomputaciontransformandooperacionesmascostosaspor otrasmenoscostosas.Existen tres tipos de transformacionesalge-braicasbasicas.

Calculo previo deconstantes

Setratadecalcularanivel decompilacionel valorprevio deconstantesenvezdehacerloentiempodeejecucionqueretardarıa la ejecuciondeunprograma.A estaoptimizacion se le llama calculo previo de constantes(eninglesconstantfolding). El codigodela figura7.9puedesermejoradodandolugar al codigodela figura7.10(a). Haciendounapropagacion decopiasy eliminaciondecodigomuertotenemosel codigodela figura7.10(b). Realizandodenuevo un calculoprevio deconstantesobtenemos7.10(c). Y finalmentepodemoshacerde nuevo la propagacion decopiasy laeliminacion decodigomuerto,obteniendoel codigodela figura7.10(d).

t1 =2 t2 = 2 / 2 t2 = 1 t3 = a* 1

t2 = t1 / 2 t3 = a* t2 t3 = a * t2 t4 = t3 * 2

t3 = a * t2 t4 = t3 * 2 t4 = t3 * 2 t5 = t4 + b

t4 = t3 * t1 t5 = t4 + b t5 = t4 + b c = t5 * t5

t5 = t4 + b c = t5 * t5 c = t5 * t5

c = t5 * t5

(a) (b) (c) (d)

Tabla7.10: Calculoprevio deconstantes

Hemospasadodeseisproposicionesa tenercuatro,eliminadounasub-straccion y unadivisionenel proceso.

Page 32: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

236 7.7. OPTIMIZACION DE CODIGO INTERMEDIO

Transformacionesalgebraicas

Podemoshacerusode identidadesalgebraicasparasimplificarel codigo.Lasprincipalesidentidadesson:

ÀÂÁ °�»Ã° ÁÄÀ » À�Å ÀÇÆ °�» À�Å À ¹ ² » ² ¹ À » À�Å À ² » À

Partiendodela figura7.10(d) podemosobtenerel codigodela figura7.11(a). De nuevo si usamospropagacion de copiasy eliminacion de codigomuertoobtenemosel codigodela figura7.11(b) :

t3 = a t4 = a* 2

t4 = t3 * 2 t5 = t4 + b

t5 = t4 + b c = t5 * t5

c = t5 * t5

(a) (b)

Tabla7.11: Identidadesalgebraicas

Reduccion de intensidad

Enla mayorıadelasmaquinaslasoperacionesdemultiplicaciony divisionsonsubstancialmentemascostosasquelasoperacionesdesumay resta.Ya su vez, las potenciasson mas costosasque las multiplicacionesy di-visiones. Por tanto,siemprequeseaposibleesconvenientesustituir unoperadormascostosopor otro menoscostoso.A estosele conocecomoreducciondela intensidad. Lasidentidadesmascomunesson:

ÀÉÈ » À ¹ À�Å Ê ¹ À » À�ÁËÀ

Ennuestroejemplodela figura7.11(b) podemosobtenerel codigo7.12

Otratransformacion tıpicaesusardesplazamientosdebits cuandosedivi-dao semultipliqueporpotenciasdedos.

Page 33: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 237

t4 = a+ a

t5 = t4 + b

c = t5 * t5

Tabla 7.12: Reduccion deintensidad

7.7.5 Empaquetamientode temporales

Setratade reusarlos temporalescon el fin de ahorrarespacio.Despuesdehaberoptimizadoel codigoesnormalpensarquesepuedanusarmenostemporalesy serıaconvenienteentoncesrenombrarestostemporales.

Supongamosquetenemosunatabladetemporalesdisponibles(porejem-plo de · ² a ·�¯ ), de maneraquemarcamossi un temporalesta vivo en unciertopuntodel bloquebasico.En general,esposibleremplazardostem-poralespor unounicosi no existeningun puntodondelos dostemporalesestanvivosala vez.Paracadatemporallo remplazamosporel primertem-poralenla tablaqueestamuertoentodoslos lugaresenel queel temporalbajoconsideracionestavivo.

Veamosnuestroejemplode la figura 7.12. ·?¾ sedefineen la primeraproposicion y esta vivo en la segunda,entonceslo remplazamospor elprimer terminalmuertode la tabla, · ² , obteniendoel codigo de la figura7.13(a). Porotro lado, ·dÌ esdefinidoenla segundaproposicion y vivo enla proposicion 3. Estono interaccionacon el temporal · ² , queestavivosolo en la segundaproposicion, por tanto ·dÌ puedesersustituidopor · ² .Obteniendoel codigodela figura7.13(b).

t1 = a+ a t1 = a+ a

t5 = t1 + b t1 = t1 + b

c = t5 * t5 c = t1 * t1

(a) (b)

Tabla7.13: Empaquetamientodetemporales

Comparandoestecodigoconel original quetenıa ochoproposiciones,sietetemporales,dosadiciones,unasubstraccion, cuatromultiplicaciones

Page 34: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

238 7.7. OPTIMIZACION DE CODIGO INTERMEDIO

y unadivision, lo hemosreducidoa tresproposicionesqueimplican dosadicionesy unamultiplicacion.

7.7.6 Mejora de los lazos

Traslado decodigo

Una modificacion importantequedisminuyela cantidadde codigo enun lazoesel trasladodecodigo. Estatransformacion tomaunaexpresionqueproduceel mismoresultadoindependientementedel numerodevecesqueseejecuteun lazoy la colocaantesdel lazo.Porejemplo:

while (i<=limite-2) ...

Sepuedetransformaren:

t=limite -2;

while (i<=t) ...

Page 35: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 239

Variablesde induccion

Setratade identificarlasvariablesquepermanecenligadasentresı enla ejecucion,estanrelacionadasentresı deformaqueconocidoel valor deunasepuedeobtenerel dela otra. Supongamosel siguientefragmentodecodigodondesehasupuestoqueloselementosdela matrizocupan4 bytesy ya seharealizadociertaoptimacion.

suma=0; suma=0;

j=0; j=0;

while j Í 10 labell1´t1= j Í 10

suma= suma+ a[j]; if falset1 gotol2

j=j+1; t2=4*j¶t3=a[t2]

. . . suma=suma+t3

j=j+1

gotol1

labell2

. . .

Tabla7.14: (a) codigofuentey (b) codigode3-direcciones

donde º�Î7· Ê$Ï en la tabla 7.14 (b) significa la direccion de º mas un de-splazamiento· Ê . Sabemosque · Ê no cambiaenningun momentosalvo en· Ê »Ð¾y¹Ñ , por tantojustodespuesdela proposicion ÑÇ»�Ñ Á ²

secumpleque · Ê » ¾�¹ÒÑ Á ¾ , y se puedesustituir la asignacion · Ê » ¾�¹ÓÑ por· Ê »�· ÊÔÁ ¾ , debiendoinicializarel valor de · Ê »Ã° .Siemprequehayavariablesdeinduccion sepuedenhacersustitucionesdeestetipo y eliminartodasmenosuna.

Page 36: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

240 7.8. EJERCICIOS

7.8 EJERCICIOS

1 (0.25ptos)Escribeel pseudocodigo correspondiente,usandola no-tacionquehemosvistoalo largodelcapıtulo,parala implementacionde la generacion de codigo de tresdireccionesmedinatecuadruplosparala construccionif-then-else .

2 (0.25ptos)Escribeel pseudocodigo correspondiente,usandola no-tacionquehemosvistoalo largodelcapıtulo,parala implementacionde la generacion de codigo de tresdireccionesmedinatecuadruplosparala construccion repeat until .

3 (0.25ptos)Escribeel pseudocodigo correspondiente,usandola no-tacionquehemosvistoalo largodelcapıtulo,parala implementacionde la generacion de codigo de tresdireccionesmedinatecuadruplosparala construccionswitch .

4 (0.3 ptos)Supongamosunanueva construccion de los lenguajesdeprogramacion que llamaremosdo-while-do (hacer-mientras-hacer).Estaconstruccion nacede forma natural, como las construccioneswhile-do, do-while queya conoceis. Estaconstruccion surge paraimplementarla ideaenquehaycasosenlos queno sedeseasalir dela iteracion al principio, ni al final de la iteracion, sino a la mitad,despuesdequesehahechociertoprocesamiento.

Porejemploparaimplementarel codigo:dowhiledo

read(X);

while (no final fichero)

process(X);

enddowhiledo

La sintaxisdeestaconstrucciones:

¨p© ÕhÖ�×ÇØhÙlÚÜÛ\ÕhÖ ¨�¹ ×ÝØhÙÞÚÞÛߪ ¨X¹ ÛfàZÕáÕhÖ�×ÇØhÙÞÚÞÛ\ÕhÖ â|ã

Page 37: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 241

dondesehausadoel operador* paraindicarceroo masrepeticiones.Sepide:

® Dibujar el diagramadeflujo deestaconstruccion.® Dibujar la forma del arbol abstractode analisis sintactico queusarıasparasutraduccionacodigode3-direcciones.® Escribir el pseudocodigo de la funcion generar codigo paratra-ducirestetipo desentenciasaunalistadecuadruplos.® Desafortunadamenteningun lenguajecomun de programacionimplementaestaconstruccion. ¿A que creesquesedebeesto?.¿Que construccion(es)usael lenguajeC paraimplementarestaidea?

Page 38: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

242 7.9. EJEMPLODE GENERACION DE CODIGO PARA UNA CALCULADORA USANDOPCCTS

7.9 EJEMPLO DE GENERACION DE CODIGO PARA UNA CAL-

CULADORA USANDO PCCTS

Supongamosunapequenacalculadoraquerealizaroperacionesaritmeticassencillassegun la gramatica:

entrada ä (ecuacion)+

ecuacion ä id = expresion;

expresion ä termino( “+” termino å “-” termino)*

termino ä factor( “*” factor å “/” factor)*

factor ä “(“ expresion“)” å dato

dato ä num å id å - num å - id

Sepideimplementaruntraductorquetraduzcalasexpresionesaritmeticasa codigo de 3-direcciones,implementadomediantecuaduplosde la for-ma (operador, resultado, arg1, arg2) . Los tipos de oper-adoresson:

(ASSIGN,result,arg1,NULL) asignaarg1 a result

(ADD, result,arg1,arg2) sumaarg1,arg2 y lo alamacenaenresult

(SUB,result,arg1,arg2) restaarg1,arg2 y lo alamacenaenresult

(MULT, result,arg1,arg2) multiplicaarg1,arg2 y lo alamacenaenresult

(DIV, result,arg1,arg2) dividearg1,argg2y lo alamacenaenresult

(NEG,result,arg1,NULL) mult. por (-1) arg1,y lo alamacenaenresult

(HALT,NULL, NULL, NULL) final deprograma

Page 39: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 243

Seha implementadola clasecuadruplo(Cuad.h).Seha implementadolaclaseTAC (Three-Address-Code), a partir de unalista de cuaduplosy sehaintroducidoel lugar comoun datoprotegido adicional.Sehaimple-mentadoel metodogenerarcodigoenla claseAST. Ficheroconla especi-ficaciondela gramaticap3.g.

Parala entrada:a=3+2;

b=a*2;

c=a+b+2*6;

d=-1+a;

Obtenemosla salida:

( ENTRADA ( = a ( + 3 2 ) ) ( = b ( * a2 ) ) ( = c ( + ( + ab ) ( * 2 6 ) )) ( = d ( + ( UMINUS 1 ) a ) ) )

Numerodelineasanalizadas6

(ADD,t0,3,2)

(ASSIGN,a,t0,NULL)

(MULT,t1,a,2)

(ASSIGN,b,t1,NULL)

(ADD,t2,a,b)

(MULT,t3,2,6)

(ADD,t4,t2,t3)

(ASSIGN,c,t4,NULL)

(NEG,t5,1,NULL)

(ADD,t6,t5,a)

(ASSIGN,d,t6,NULL)

(HALT,NULL,NULL,NULL)

Numerodecuadruplos12

Page 40: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

244 7.9. EJEMPLODE GENERACION DE CODIGO PARA UNA CALCULADORA USANDOPCCTS

#ifndef

Cu

ad

_h

#define

Cu

ad

_h

#include

<io

stre

am

.h>

#include

<fs

tre

am

.h>

#include

<st

rin

g.h

>

typedef

enum

{EM

PT

Y,A

SS

IGN

,

N

EG

, A

DD

, S

UB

,MU

LT

, D

IV,

HA

LT

} O

pK

ind

;

cla

ss C

ua

d {

pro

tect

ed

:

O

pK

ind

op

;

char

*o

pn

am

e;

char

*re

s;

char

*a

rg1

;

char

*a

rg2

;

p

ub

lic:

Cu

ad

();

Cu

ad

( C

ua

d &

);

C

ua

d(O

pK

ind

, const

char

*,

const

char

*, const

char

*,

const

char

*);

~C

ua

d()

;

O

pK

ind

Ge

tOp

();

void

Pu

tOp

(Op

Kin

d);

char

* G

etO

pN

am

e()

;

void

Pu

tOp

Na

me

(char

*);

char

* G

etR

es(

);

void

Pu

tRe

s(char

*);

char

* G

etA

rg1

();

void

Pu

tArg

1(

char

*);

char

* G

etA

rg2

();

void

Pu

tArg

2(

char

*);

frie

nd

ost

rea

m &

op

era

tor

<<

(o

stre

am

&f,

const

Cu

ad

& c

);

C

ua

d &

op

era

tor

= (

const

Cu

ad

&);

bo

ol o

pe

rato

r==

(const

Cu

ad

&)

const

;

}; #endif

06 m

ay 0

3 18

:43

Pág

ina

1/1

Cu

ad.h

Impr

eso

por

Ele

na D

íaz

Fer

nánd

ez

mar

tes

06 m

ayo

2003

1/1

Cua

d.h

Page 41: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 245

#include

"C

uad.

h"

Cu

ad

::C

ua

d()

{

op

=E

MP

TY

;

o

pn

am

e =

new

char

[st

rle

n("

NU

LL")

+1

]; if

(o

pn

am

e=

=NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(o

pn

am

e,

"N

ULL

");

re

s=new

char

[st

rle

n("

NU

LL")

+1

]; if

(re

s==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(re

s,"

NU

LL")

;

arg

1=

new

char

[st

rle

n("

NU

LL")

+1

]; if

(a

rg1

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(a

rg1

,"N

ULL

");

a

rg2

=new

char

[st

rle

n("

NU

LL")

+1

]; if

(a

rg2

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(a

rg2

,"N

ULL

");

} C

ua

d::

Cu

ad

(Op

Kin

d o

pe

, const

char

*n

am

e,

const

char

*r,

const

char

*a

1,

const

char

*a

2){

o

p=

op

e;

o

pn

am

e=

new

char

[st

rle

n(n

am

e)+

1];

if

(o

pn

am

e=

=NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(o

pn

am

e,

na

me

);

re

s=new

char

[st

rle

n(r

)+1

]; if

(re

s==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(re

s,r)

;

arg

1=

new

char

[st

rle

n(a

1)+

1];

if

(a

rg1

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(a

rg1

,a1

);

arg

2=

new

char

[str

len

(a2

)+1

]; if

(a

rg2

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia" <

< e

nd

l;

strc

py(

arg

2,a

2);

} Cu

ad

::~

Cu

ad

(){

delete

[]

op

na

me

;

delete

[]

re

s;

delete

[]

arg

1;

delete

[]

arg

2;

} Op

Kin

d C

ua

d::

Ge

tOp

() {

return

op

;}

06 m

ay 0

3 19

:03

Pág

ina

1/4

Cu

ad.c

pp

void

Cu

ad

::P

utO

p(O

pK

ind

t)

{

op

=t;

} char

* C

ua

d::

Ge

tOp

Na

me

(){

co

ut

<<

"E

sto

es d

entr

o " <

< o

pn

am

e ;

return

(o

pn

am

e);

} void

Cu

ad

::P

utO

pN

am

e(

char

*s)

{ delete

(op

na

me

);

op

na

me

=

new

char

[st

rle

n(s

)+1

]; if

(o

pn

am

e=

=NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(o

pn

am

e,s

);} char

* C

ua

d::

Ge

tRe

s()

{ return

re

s;} void

Cu

ad

::P

utR

es(

char

*s)

{ delete

(re

s);

re

s =

new

char

[st

rle

n(s

)+1

]; if

(re

s==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(re

s,s)

;}

char

* C

ua

d::

Ge

tArg

1()

{return

arg

1;

} void

Cu

ad

::P

utA

rg1

(char

*s)

{ delete

arg

1 ;

a

rg1

=

new

char

[st

rle

n(s

)+1

]; if

(a

rg1

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(a

rg1

,s);

} char

* C

ua

d::

Ge

tArg

2()

{ return

arg

2;

} void

Cu

ad

::P

utA

rg2

(char

*s)

{ delete

arg

2;

a

rg2

=

new

char

[st

rle

n(s

)+1

]; if

(a

rg2

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(a

rg2

,s);

} ost

rea

m &

operator

<<

(o

stre

am

&f,

const

Cu

ad

& c

){

f<<

"("

<<

c.o

pn

am

e <

< "

," <

< c

.re

s <

< "

," <

< c

.arg

1 <

<

","

<<

c.a

rg2

<<

")"

<<

en

dl;

return

f;

} 06

may

03

19:0

3P

ágin

a 2/

4C

uad

.cp

p

Impr

eso

por

Ele

na D

íaz

Fer

nánd

ez

mar

tes

06 m

ayo

2003

1/1

Cua

d.cp

p

Page 42: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

246 7.9. EJEMPLODE GENERACION DE CODIGO PARA UNA CALCULADORA USANDOPCCTS

Cu

ad

& C

ua

d::

operator

= (

const

Cu

ad

&c)

{ if

(this

!=&

c){

char

*a

uxo

pn

am

e;

au

xop

na

me

=

new

char

[st

rle

n(c

.op

na

me

)+1

];

if

(a

uxo

pn

am

e=

=NULL

) ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia" <

< e

nd

l;

else

str

cpy(

au

xop

na

me

,c.o

pn

am

e);

delete

[]

op

na

me

;

o

pn

am

e=

au

xop

na

me

;

char

*a

uxr

es;

au

xre

s =

new

char

[st

rle

n(c

.re

s)+

1];

if

(a

uxr

es=

=NULL

) ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia" <

< e

nd

l;

else

str

cpy(

au

xre

s,c.

res)

;

delete

[]

res;

res=

au

xre

s;

char

*a

uxa

rg1

;

a

uxa

rg1

=

new

char

[st

rle

n(c

.arg

1)+

1];

if

(a

uxa

rg1

==

NULL

) ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia" <

< e

nd

l;

else

str

cpy(

au

xarg

1,c

.arg

1);

delete

[]

arg

1;

arg

1=

au

xarg

1;

char

*a

uxa

rg2

;

a

uxa

rg2

=

new

char

[st

rle

n(c

.arg

2)+

1];

if

(a

uxa

rg2

==

NULL

) ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia" <

< e

nd

l;

else

str

cpy(

au

xarg

2,c

.arg

2);

delete

[]

arg

2;

arg

2=

au

xarg

2;

op

=c.

op

;

} return

(*this

);} C

ua

d::

Cu

ad

(Cu

ad

& c

) {

o

p=

EM

PT

Y;

op

na

me

=

new

char

[st

rle

n("

NU

LL")

+1

]; if

(o

pn

am

e=

=NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(o

pn

am

e,

"N

ULL

");

re

s=new

char

[st

rle

n("

NU

LL")

+1

]; if

(re

s==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(re

s,"

NU

LL")

;

arg

1=

new

char

[st

rle

n("

NU

LL")

+1

]; if

(a

rg1

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(a

rg1

,"N

ULL

");

a

rg2

=new

char

[st

rle

n("

NU

LL")

+1

]; if

(a

rg2

==

NULL

)

ce

rr <

< "

ER

RO

R r

eser

vand

o m

emor

ia"<<

en

dl;

st

rcp

y(a

rg2

,"N

ULL

");

(*

this

)=c;

}

06 m

ay 0

3 19

:03

Pág

ina

3/4

Cu

ad.c

pp

bool

C

ua

d::

operator

==

(const

Cu

ad

& x

) const

{

if

(o

p!=

x.o

p)

return

(false

); if

(st

rcm

p(o

pn

am

e,x

.op

na

me

)!=

0)

return

(false

); if

(st

rcm

p(r

es,

x.re

s)!=

0)

return

(false

); if

(st

rcm

p(a

rg1

,x.a

rg1

)!=

0)

return

(false

); if

(st

rcm

p(a

rg2

,x.a

rg2

)!=

0)

return

(false

); return

(true

);}

06 m

ay 0

3 19

:03

Pág

ina

4/4

Cu

ad.c

pp

Impr

eso

por

Ele

na D

íaz

Fer

nánd

ez

mar

tes

06 m

ayo

2003

1/1

Cua

d.cp

p

Page 43: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 247

#ifndef

TA

C_

h#define

TA

C_

h

#include

"C

uad.

h"#include

"Ld

ligad

a.h"

cla

ss T

AC

: p

ub

lic d

llist

a<

Cu

ad

> {

//OJO mas que derivar sera una lista de cuadruplos

pro

tect

ed

:

char

*lu

ga

r;

p

ub

lic:

TA

C()

;

~

TA

C()

;

void

Pu

tLu

ga

r(char

*);

char

* G

etL

ug

ar(

void

);

}; #endif

05 m

ay 0

3 18

:08

Pág

ina

1/1

TA

C.h

Impr

eso

por

Ele

na D

íaz

Fer

nánd

ez

mar

tes

06 m

ayo

2003

1/1

TA

C.h

Page 44: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

248 7.9. EJEMPLODE GENERACION DE CODIGO PARA UNA CALCULADORA USANDOPCCTS

#ifndef

AS

T_

h#define

AS

T_

h

#include

"A

ST

Bas

e.h"

#include

"A

Tok

en.h

"#include

"A

Tok

Ptr

.h"

#include

"C

uad.

h"#include

"T

AC

.h"

extern

char

* n

ew

tem

p()

;

cla

ss A

ST

: p

ub

lic A

ST

Ba

se {

pro

tect

ed

: A

NT

LR

To

ken

Ptr

to

ken

;p

ub

lic:

A

ST

(AN

TL

RT

oke

nT

ype

to

k,

char

*s)

{ to

ken

= n

ew

AN

TL

RT

oke

n(t

ok,

s);

} A

ST

(AN

TL

RT

oke

nP

tr t)

{ to

ken

= t; }

void

pre

ord

er_

act

ion

() {

co

ut <

< to

ken

−>

ge

tTe

xt()

<<

" "

; }

void

po

sto

rde

r_a

ctio

n()

{ co

ut <

< to

ken

−>

ge

tTe

xt()

<<

" "

; }

vi

rtu

al

void

pre

ord

er_

be

fore

_a

ctio

n()

{ c

ou

t <

< "

("

; }

vi

rtu

al

void

pre

ord

er_

afte

r_a

ctio

n()

{ c

ou

t <

< "

)"

; }

vi

rtu

al

void

po

sto

rde

r_b

efo

re_

act

ion

() {

co

ut <

< "

(";

} vi

rtu

al

void

po

sto

rde

r_a

fte

r_a

ctio

n()

{ c

ou

t <

< "

)";

}

vi

rtu

al

int

typ

e()

{

return

to

ken

−>

ge

tTyp

e()

; }

char

*g

etT

ext

() {

return

to

ken

−>

ge

tTe

xt()

; }

void

po

sto

rde

r()

{ A

ST

*tr

ee

= th

is;

A

ST

*d

ow

n,*

rig

ht;

while

( tre

e!=

NULL

) {

d

ow

n=

(AS

T *)

tre

e−

>d

ow

n()

; rig

ht=

(AS

T *

)tre

e−

>rig

ht(

);

if

( d

ow

n !=

NULL

)

tre

e−

>p

ost

ord

er_

be

fore

_a

ctio

n()

;

if

( d

ow

n!=

NULL

)d

ow

n−

>p

ost

ord

er(

); tr

ee

−>

po

sto

rde

r_a

ctio

n()

;

if

( d

ow

n!=

NULL

)tr

ee

−>

po

sto

rde

r_a

fte

r_a

ctio

n()

;

tr

ee

= (

AS

T *)

rig

ht;

}

}

void

pre

ord

er(

){

A

ST

*tr

ee

= th

is;

while

( tre

e!=

NULL

) {

if

( tre

e−

>d

ow

n()

!=

NULL

) {

tre

e−

>p

reo

rde

r_b

efo

re_

act

ion

();

};

tr

ee

−>

pre

ord

er_

act

ion

();

if

( tre

e−

>d

ow

n()

!=NULL

){

AS

T *d

;d

= (

AS

T *

) tr

ee

−>

do

wn

();

d−

>p

reo

rde

r();

tre

e−

>p

reo

rde

r_a

fte

r_a

ctio

n()

;

}

07 m

ay 0

3 13

:01

Pág

ina

1/4

AS

T.h

tr

ee

= (

AS

T *

) tr

ee

−>

rig

ht(

); }

}

void

ge

ne

ra_

cod

igo

(TA

C &

ta

c);

}; void

AS

T:: g

en

era

_co

dig

o(T

AC

& ta

c){ A

ST

*d

ow

n,*

rig

ht;

A

ST

*tr

ee

=th

is;

d

ow

n=

(AS

T *)

tre

e−

>d

ow

n()

; rig

ht=

(AS

T *

)tre

e−

>rig

ht(

); switch

(

tre

e−

>ty

pe

())

{

case

TK

N_

EN

TR

AD

A: {

T

AC

au

x1;

d

ow

n−

>g

en

era

_co

dig

o(a

ux1

); ta

c.co

nca

ten

ar(

au

x1);

rig

ht=

(AS

T *)

do

wn

−>

rig

ht(

);

while

(rig

ht!=

NULL

) {

TA

C a

ux;

rig

ht−

>g

en

era

_co

dig

o(a

ux)

;ta

c.co

nca

ten

ar(

au

x);

rig

ht=

(AS

T *

)rig

ht−

>rig

ht(

); }

C

ua

d c

(HA

LT

,"H

ALT

","

NU

LL",

"N

ULL

", "

NU

LL")

; T

AC

cu

ad

;

if

(cu

ad

.In

sert

ar(

c)=

=fa

lse

)ce

rr <

< "

Err

or a

l ins

erta

r" <

< e

nd

l; ta

c.co

nca

ten

ar(

cua

d);

break

; }

case

TK

N_

AS

IGN

:{

T

AC

au

x1, a

ux2

; d

ow

n−

>g

en

era

_co

dig

o(a

ux1

);

((

AS

T *

) d

ow

n−

>rig

ht(

))−

>g

en

era

_co

dig

o(a

ux2

); C

ua

d c

(AS

SIG

N,"

AS

SIG

N",a

ux1

.Ge

tLu

ga

r(),

au

x2.G

etL

ug

ar(

),"

NU

LL")

; T

AC

cu

ad

;

if

(cu

ad

.In

sert

ar(

c)=

=fa

lse

)ce

rr <

< "

Err

or a

l ins

erta

r" <

< e

nd

l; a

ux1

.co

nca

ten

ar(

au

x2);

a

ux1

.co

nca

ten

ar(

cua

d);

ta

c.co

nca

ten

ar(

au

x1);

break

; }

case

TK

N_

MA

S: {

T

AC

au

x1, a

ux2

;

char

*te

mp

; d

ow

n−

>g

en

era

_co

dig

o(a

ux1

); ((

AS

T *

)do

wn

−>

rig

ht(

))−

>g

en

era

_co

dig

o(a

ux2

); te

mp

= n

ew

tem

p()

; ta

c.P

utL

ug

ar(

tem

p);

fr

ee

(te

mp

); C

ua

d c

(AD

D,"

AD

D",

tac.

Ge

tLu

ga

r(),

au

x1.G

etL

ug

ar(

),a

ux2

.Ge

tLu

ga

r())

; T

AC

cu

ad

;

if

(cu

ad

.In

sert

ar(

c)=

=fa

lse

)ce

rr <

< "

Err

or a

l ins

erta

r" <

< e

nd

l; a

ux1

.co

nca

ten

ar(

au

x2);

au

x1.c

on

cate

na

r(cu

ad

); t

ac.

con

cate

na

r(a

ux1

);

break

; }07

may

03

13:0

1P

ágin

a 2/

4A

ST

.h

Impr

eso

por

Ele

na D

íaz

Fer

nánd

ez

mié

rcol

es 0

7 m

ayo

2003

1/1

AS

T.h

Page 45: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

TEMA 7. GENERACION DE CODIGO INTERMEDIO. OPTIMIZACION 249

case

TK

N_

MU

LT

: {

T

AC

au

x1,

au

x2;

char

*te

mp

;

do

wn

−>

ge

ne

ra_

cod

igo

(au

x1);

((

AS

T *

)do

wn

−>

rig

ht(

))−

>g

en

era

_co

dig

o(a

ux2

);

tem

p =

ne

wte

mp

();

ta

c.P

utL

ug

ar(

tem

p);

fre

e(t

em

p);

C

ua

d c

(MU

LT

,"M

ULT

",ta

c.G

etL

ug

ar(

),a

ux1

.Ge

tLu

ga

r(),

au

x2.G

etL

ug

ar(

));

T

AC

cu

ad

;

if

(cu

ad

.In

sert

ar(

c)=

=fa

lse

)ce

rr <

< "

Err

or a

l ins

erta

r" <

< e

nd

l;

au

x1.c

on

cate

na

r(a

ux2

); a

ux1

.co

nca

ten

ar(

cua

d);

ta

c.co

nca

ten

ar(

au

x1);

break

;

}

case

TK

N_

ME

NO

S:

{

TA

C a

ux1

, a

ux2

; char

*te

mp

;

do

wn

−>

ge

ne

ra_

cod

igo

(au

x1);

((

AS

T *

)do

wn

−>

rig

ht(

))−

>g

en

era

_co

dig

o(a

ux2

);

tem

p =

ne

wte

mp

();

tac.

Pu

tLu

ga

r(te

mp

); f

ree

(te

mp

);

Cu

ad

c(S

UB

,"S

UB"

,ta

c.G

etL

ug

ar(

),a

ux1

.Ge

tLu

ga

r(),

au

x2.G

etL

ug

ar(

));

T

AC

cu

ad

;

if

(cu

ad

.In

sert

ar(

c)=

=fa

lse

)ce

rr <

< "

Err

or a

l ins

erta

r" <

< e

nd

l;

au

x1.c

on

cate

na

r(a

ux2

); a

ux1

.co

nca

ten

ar(

cua

d);

ta

c.co

nca

ten

ar(

au

x1);

break

;

}

case

TK

N_

DIV

: {

T

AC

au

x1,

au

x2;

char

*te

mp

;

do

wn

−>

ge

ne

ra_

cod

igo

(au

x1);

((

AS

T *

)do

wn

−>

rig

ht(

))−

>g

en

era

_co

dig

o(a

ux2

);

tem

p =

ne

wte

mp

();

ta

c.P

utL

ug

ar(

tem

p);

fre

e(t

em

p);

C

ua

d c

(DIV

,"D

IV",

tac.

Ge

tLu

ga

r(),

au

x1.G

etL

ug

ar(

),a

ux2

.Ge

tLu

ga

r())

;

TA

C c

ua

d;

if

(cu

ad

.In

sert

ar(

c)=

=fa

lse

)ce

rr <

< "

Err

or a

l ins

erta

r" <

< e

nd

l;

au

x1.c

on

cate

na

r(a

ux2

); a

ux1

.co

nca

ten

ar(

cua

d);

ta

c.co

nca

ten

ar(

au

x1);

break

;

}

case

TK

N_

UM

INU

S:

{

TA

C a

ux1

; char

*te

mp

;

do

wn

−>

ge

ne

ra_

cod

igo

(au

x1);

te

mp

= n

ew

tem

p()

;

tac.

Pu

tLu

ga

r(te

mp

);

fre

e(t

em

p);

C

ua

d c

(NE

G,"

NE

G",

tac.

Ge

tLu

ga

r(),

au

x1.G

etL

ug

ar(

),"

NU

LL")

;

TA

C c

ua

d;

if

(cu

ad

.In

sert

ar(

c)=

=fa

lse

)ce

rr <

< "

Err

or a

l ins

erta

r" <

< e

nd

l;

au

x1.c

on

cate

na

r(cu

ad

);

tac.

con

cate

na

r(a

ux1

);

break

;

}

case

TK

N_

NU

M:{

ta

c.P

utL

ug

ar(

tre

e−

>g

etT

ext

());

break

;

}

case

TK

N_

ID:

{

tac.

Pu

tLu

ga

r(tr

ee

−>

ge

tTe

xt()

);

07 m

ay 0

3 13

:01

Pág

ina

3/4

AS

T.h

break

;}

default

: {

co

ut

<<

"E

rror

" <

< e

nd

l;}

}

} #endif

07 m

ay 0

3 13

:01

Pág

ina

4/4

AS

T.h

Impr

eso

por

Ele

na D

íaz

Fer

nánd

ez

mié

rcol

es 0

7 m

ayo

2003

1/1

AS

T.h

Page 46: GENERACION´ DE CODIGO´ INTERMEDIO. …informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2005/tema7.pdf · 4 Generacion´ de codigo´ para expresiones y sentencias de control:

250 7.9. EJEMPLODE GENERACION DE CODIGO PARA UNA CALCULADORA USANDOPCCTS

#h

ea

de

r<<

#in

clu

de

<io

stre

am

.h>

#in

clu

de

<m

ath

.h>

#in

clu

de

"A

To

ken

.h"

typ

ed

ef

AN

TL

RC

om

mo

nT

oke

n A

NT

LR

To

ken

;#

incl

ud

e "

MiP

ars

er.

h"

#in

clu

de

"C

ua

d.h

"#

incl

ud

e "

TA

C.h

"e

xte

rn in

t n

line

as;

>>

<<

#in

clu

de

"D

LG

Le

xer.

h"

#in

clu

de

"P

Bla

ckB

ox.

h"

#in

clu

de

"A

ST

.h"

tem

pla

te c

lass

dlli

sta

<C

ua

d>

;te

mp

late

cla

ss I

ter_

dlli

sta

<C

ua

d>

;

int

nlin

ea

s=0

;in

t n

tem

p=

0;

TA

C li

sta

_co

d;

cha

r *

ne

wte

mp

(){

cha

r *r

es=

NU

LL

;re

s=n

ew

ch

ar

[20

];sp

rin

tf(r

es,

"t%

d",

nte

mp

);n

tem

p+

+;

retu

rn(r

es)

;} vo

id a

sce

nd

en

te(T

AC

& l)

{ I

ter_

dlli

sta

<C

ua

d>

j;

int

con

t =

0;

f

or

(j=

l.In

icio

();

j.Va

lido

();

j++

)

{co

ut

<<

j.D

ato

();

con

t++

;}

co

ut

<<

"N

um

ero

de

cu

ad

rup

los

" <

< c

on

t;} in

t m

ain

(){

AS

TB

ase

*ro

ot=

NU

LL

;P

ars

erB

lack

Bo

x<D

LG

Le

xer,

MiP

ars

er,

AN

TL

RT

oke

n>

p(s

tdin

);

p.p

ars

er(

)−>

en

tra

da

(&ro

ot)

;co

ut

<<

en

dl <

< "

Nu

me

ro d

e li

ne

as

an

aliz

ad

as

" <

< n

line

as

<<

en

dl;

asc

en

de

nte

(lis

ta_

cod

);} >

>

// O

pe

rad

ore

s e

spe

cia

les

#to

ken

TK

N_

PA

"\(

"#

toke

n T

KN

_P

C "

\)"

#to

ken

TK

N_

MA

S "

\+"

#to

ken

TK

N_

ME

NO

S "

\−"

#to

ken

TK

N_

MU

LT

"\*

"#

toke

n T

KN

_D

IV "

/"

07 m

ay 0

3 12

:59

Pág

ina

1/2

p3.

g#

toke

n T

KN

_A

SIG

N "

="

#to

ken

TK

N_

PT

OC

OM

A "

;"#

toke

n T

KN

_U

MIN

US

#to

ken

TK

N_

EN

TR

AD

A

#to

ken

TK

N_

NU

M "

[0−

9]+

"#

toke

n T

KN

_ID

"[a

−zA

−Z

][a

−zA

−Z

0−

9]*

"#

toke

n "

\n"

<<

skip

();

nlin

ea

s++

;>>

#to

ken

"[\

\t]

" <

<sk

ip()

;>>

#to

ken

BE

GIN

_C

OM

ME

NT

"/\

*"

<<

for

(; ;

){

a

dva

nce

();

wh

ile (

(ch

!=’*

’) &

& (

ch!=

EO

F))

ad

van

ce()

;

if

(ch

==

’*’) {

ad

van

ce()

;w

hile

(ch

==

’*’) a

dva

nce

();

if (c

h=

=’/’

) b

rea

k;

}

if (c

h=

=E

OF

){

err

std

( "F

ou

nd

EO

F in

sid

e a

co

mm

en

t" )

;

b

rea

k;

}

} ad

van

ce()

;sk

ip()

;>

>

cla

ss M

iPa

rse

r {

en

tra

da

: <

< #

0=

#(#

[TK

N_

EN

TR

AD

A,"

EN

TR

AD

A"]

, N

UL

L);

>>

(

c:e

cua

cio

n )

+

<<

AS

T *

raiz

; ra

iz=

(A

ST

*)#

0;

ra

iz−

>p

reo

rde

r();

ra

iz−

>g

en

era

_co

dig

o(lis

ta_

cod

);>

>;

ecu

aci

on

: T

KN

_ID

TK

N_

AS

IGN

^ e

xp T

KN

_P

TO

CO

MA

!;

exp

: t

erm

( T

KN

_M

AS

^ te

rm | T

KN

_M

EN

OS

^ t

erm

)* ;

term

: f

act

or

( T

KN

_M

UL

T^

fact

or

| T

KN

_D

IV^

fa

cto

r)*

;

fact

or

: T

KN

_P

A!

exp

TK

N_

PC

! | d

ato

;

da

to :

TK

N_

ID^

| T

KN

_N

UM

^ | T

KN

_M

EN

OS

^ (c

:TK

N_

ID <

<#

0=

#(#

[TK

N_

UM

INU

S,"

UM

INU

S"]

,#c)

;>>

| d

:TK

N_

NU

M <

<#

0=

#(#

[TK

N_

UM

INU

S,"

UM

INU

S"]

,#d

);>

>)

; }

07 m

ay 0

3 12

:59

Pág

ina

2/2

p3.

g

Impr

eso

por

Ele

na D

íaz

Fer

nánd

ez

mié

rcol

es 0

7 m

ayo

2003

1/1

p3.g