&
216758&&,Ï1'(81'(385$'253257$%/('(&Ï',*2
)
81&,21(6'(/$%,%/,27(&$
(
-(03/2'(862'(/'(385$'25
José L. A jona Fe nández, José M. P ie o Pé ez, R. Co chuelo Gil
Dp o. de Lenguajes y Sis emas In o má icos
Facul ad de In o má ica y Es adí ica
Uni e sidad de Se illa
Web: h p://www.lsi.us.es
En es e cua o a ículo e emos las unciones que componen la biblio eca que cons i uye el
depu ado , e emos cual es el signi icado de cada una de es as unciones y cuando se aconseja su
uso. Pa a inaliza e emos pa a un pequeño ejemplo el compo amien o del depu ado .
)XQFLRQHVGHODELEOLRWHFDGHGHSXUDFLyQ
Cómo se comen o en el segundo de los a ículos, el depu ado de código es á cons i uido po
una biblio eca ANSI C. Pues aho a es el momen o de comen a las unciones necesa ias pa a hace
que el p og ama sea au odepu able. Además de gene a los s abs, el compilado debe de in e cala
en el código C gene ado, llamadas a las u inas del depu ado . En es e apa ado de alla emos el
signi icado de cada una de es as unciones que el compilado iene que inse a .
Los p o o ipos de las u inas que suminis a la biblio eca, son las siguien es:
oid debug_ini (cha * ich_s abs);
oid debug_link (cha *id, oid *di );
oid debug_open (cha *nomb e_ambi o);
oid debug_close ( oid);
oid debug_end ( oid);
oid debug_ ace (unsigned num_linea, cha * ich_ uen e);
Comen a emos aho a el sen ido de cada una de ellas:
½
GHEXJBLQLW
Es la u ina de inicialización del depu ado , es deci , se lee el iche o de los s abs, y se
inicializan odas las a iables in e nas usadas po el mismo. Sin una llamada a es a u ina, nada
unciona á en el depu ado . Po lo an o se á la p ime a unción que se ejecu a á de la lib e ía y del
p og ama uen e. Como pa áme o de en ada se le pasa el nomb e del iche o donde es án
almacenados los s abs.
La in o mación de s abs, después de analiza léxica y sin ác icamen e el iche o de s abs,
se á almacenada en o ma de á boles, o ganizada en ablas de símbolos (Una abla de símbolos pa a
cada ámbi o). Es deci , end emos en cada abla de símbolos una en ada po cada elemen o del
p og ama y pa a cada uno de es os elemen os almacena emos en o ma de á bol la in o mación de
depu ación (s ab).
½
GHEXJBOLQN
Pe mi e asocia a una a iable, cons an e o pa áme o una di ección de memo ia. Es necesa io que
se le asigne una di ección a odos es os obje os pa a que el depu ado conozca su posición en
memo ia y pueda abaja con ellos (calcula exp esiones, modi ica alo es, ...). Lo que ha íamos
se ía ac ualiza en la abla de símbolos co espondien e un campo que ha ía e e encia a la di ección
de ese elemen o. Si no se usa co ec amen e es a unción, el depu ado accede ía a posiciones de
memo ia que no se co esponde al obje o que es amos es udiando, lo que p o oca ía e ec os
imp edecibles.
El luga co ec o pa a coloca las llamada a
GHEXJBOLQN
es, den o de cada ámbi o, an es de
la p ime a llamada a la unción
GHEXJBWUDFH
pa a ese ámbi o y despúes de la llamada a
GHEXJBRSHQ
1.
Los pa áme os, pa a pode llama la son los siguien es: en p ime luga la cadena de
ca ác e es que iden i ica a ese obje o, seguidamen e se le da á la di ección de memo ia en la que se
encuen a.
½
GHEXJBRSHQ
Se u iliza pa a especi ica al depu ado que se ab e un nue o ámbi o. En ella lo que hacemos
es apila in o mación sob e dicho ámbi o en la pila de ablas de símbolos in e na del depu ado .
Es a ca ac e ís ica nos pe mi i á sopo a el anidamien o es á ico2 que poseen algunos lenguajes.
Como pa áme o acep a la cadena que iden i ica al ámbi o en el iche o de s abs.
½
GHEXJBFORVH
Cie a el ámbi o ac ual, po lo an o es necesa io llama a es a unción cada ez que se sale
de un ámbi o. En ella desapilamos la in o mación ace ca de ese ámbi o que apilabamos cuando se
llamó a la u ina con
GHEXJBRSHQ
.
El pa áme o que oma, es la cadena de ca ac e es que hace e e encia al nomb e del ámbi o
del que se es á saliendo.
½
GHEXJBHQG
Llamada que se ealiza al inal del p og ama y su obje i o es únicamen e libe a la memo ia
ocupada po las es uc u as in e nas del depu ado .
½
GHEXJBWUDFH
Es la llamada que se enca ga de la aza del p og ama, es deci , se enca ga á de decidi si se
iene que pa a el p og ama en ejecución pa a que el usua io pueda in oduci algún comando o si
1 El lec o pod ía pensa en hace las llamadas a
GHEXJBOLQN
en o o luga , po ejemplo, an es de hace la llamada a
GHEXJBRSHQ
, pe o en ese caso end íamos p oblemas a la ho a de depu a unciones ecu en es. Además si aún no se
ha abie o el ámbi o, ¿Cómo se encuen a el símbolo?.
2 El anidamien o es á ico hace e e encia a la p opiedad que ienen algunos lenguajes de p og amación (cómo PASCAL,
MODULA..), po la que den o de un p ocedimien o ó unción se pueden de ini o os p ocedimien os y unciones,
siendo isibles únicamen e pa a ese ámbi o.
po el con a io iene que segui ejecu ando el p og ama. También se enca ga á de analiza los
comandos del usua io y mos a á el esul ado de la e aluación de dichos comandos.
Veamos aho a un ejemplo comple o y un ejemplo de aza sob e él con el depu ado ya
cons uido:
Con es e ejemplo p e endemos cons ui la unción de Eule : “
'DGR XQ Q~PHUR HQWHUR
PD RUTXHFHUR$ODIXQFLyQGH(XOHUGHYXHOYHHOQ~PHURGHHQWHURVSRVLWLYRVLQIHULRUHVD$ TXH
DGHPiVVRQSULPRVFRQ$
”. Pa a sabe si dos núme os son p imos, nos basa emos en la siguien e
p opiedad: “
'RVQ~PHURVVRQSULPRVHQWUHV FXDQGRVXPi[LPRFRP~QGLYLVRUHVODXQLGDG
”. Pa a
implemen a la unción máximo común di iso usa emos el algo i mo de Euclides.
A con inuación mos amos el p og ama que hace lo an e io en PASCAL (Eule .pas):
1: PROGRAM FUNCION_DE_EULER;
2:
3: VAR nume o:INTEGER;
4:
5: FUNCTION Mcd(p,q:INTEGER):INTEGER;
6: VAR es o:INTEGER;
7: BEGIN
8: REPEAT
9: BEGIN
10: es o:= p MOD q;
11: p:=q;
12: q:= es o;
13: END;
14: UNTIL es o=0;
15: mcd:=p;
16: END;
17:
18: FUNCTION Eule (x:INTEGER):INTEGER;
19: VAR i,con ado :INTEGER;
20: BEGIN
21: con ado :=0;
22: FOR i:=1 TO x-1 DO
23: IF Mcd(x,i)=1 THEN
24: con ado :=con ado +1;
25: Eule :=con ado ;
26: END;
27:
28: BEGIN
29: WRITELN(’ NUMERO - FUNCION DE EULER’);
30: WRITELN;
31: nume o:=81;
32: WRITELN(nume o,’ - ’,Eule (nume o));
33: END.
El iche o de s abs que end ía que gene a el compilado se ía (Eule .s b):
[PASCAL_MAIN]
WRITELN "R "
nume o "Vi"
Mcd "Ri"
Eule "Ri"
[Mcd]
p "Pi"
q "Pi"
es o "Vi"
[Eule ]
x "Pi"
i "Vi"
con ado "Vi"
El iche o de código C, con las llamadas a la biblio eca del depu ado inse adas se ía (Eule .c):
#include <s dio.h>
#include "debug.h"
in nume o;
oid PASCAL_MAIN( oid);
in Mcd(in ,in );
in Eule (in );
oid main ( oid)
{
debug_ini ("eule .s b");
PASCAL_MAIN();
debug_end();
e u n;
}
oid PASCAL_MAIN( oid)
{
debug_open("PASCAL_MAIN");
debug_link("nume o", &nume o);
debug_ ace(29,"eule .pas");
p in (" NUMERO - FUNCION DE EULER");
p in (" n");
debug_ ace(30,"eule .pas");
p in (" n");
debug_ ace(31,"eule .pas");
nume o=81;
debug_ ace(32,"eule .pas");
p in ("%d - %d",nume o,Eule (nume o));
p in (“ n”);
debug_ ace(33,"eule .pas");
debug_close();
e u n;
}
in Mcd(in p,in q)
{
in es o;
debug_open("Mcd");
debug_link(" es o",& es o);
debug_link("p",&p);
debug_link("q",&q);
do {
debug_ ace(8,"eule .pas");
debug_ ace(10,"eule .pas");
es o= p % q;
debug_ ace(11,"eule .pas");
p = q;
debug_ ace(12,"eule .pas");
q = es o;
} while ( es o!=0);
debug_ ace(15,"eule .pas");
debug_close();
e u n p;
}
in Eule (in x)
{
in i,con ado ;
debug_open("Eule ");
debug_link("i",&i);
debug_link("con ado ",&con ado );
debug_link("x",&x);
debug_ ace(21,"eule .pas");
con ado = 0;
o (i=1;i<=(x-1);i++)
{
debug_ ace(22,"eule .pas");
debug_ ace(23,"eule .pas");
i (Mcd(x,i)==1)
{
debug_ ace(24,"eule .pas");
con ado = con ado + 1;
}
}
debug_ ace(25,"eule .pas");
debug_close();
e u n con ado ;
}
Vamos a usa el depu ado :
Depu ado simbólico de código po able. Ve sión 1.1
Copy igh (C) 1998. José Manuel P ie o Pé ez y José Luis A jona Fe nández
Tu o : Ra ael Co chuelo Gil.
Es e p og ama iene sin ningún ipo de GARANTIA;
pa a ob ene más de alles eclea 'show w'.
Es g a ui o y se e pe mi e y ag adece que lo
edis ibuya bajo cie as condiciones;
eclea 'show c' pa a más de alles.
* Ejecu emos en p ime luga algunas ins ucciones:
29: WRITELN(' NUMERO - FUNCION DE EULER');
(eule .pas:29)? nex
NUMERO - FUNCION DE EULER
30: WRITELN;
(eule .pas:30)? nex
31: nume o:=81;
(eule .pas:31)? nex
32: WRITELN(nume o,' - ',Eule (nume o));
* Vamos a cambia el alo del núme o al que se le calcula la unción de Eule :
(eule .pas:32)? wa ch nume o
(En e o) 81
(eule .pas:32)? se nume o = nume o - 71
(eule .pas:32)? wa ch nume o
(En e o) 10
* ¿Po qué línea íbamos?
(eule .pas:32)? line
32: WRITELN(nume o,' - ',Eule (nume o));
* ¿Qué es el obje o Eule ?
(eule .pas:32)? wha is Eule
Ru ina que de uel e En e o
* En emos en la unción Eule
(eule .pas:32)? nex
21: con ado :=0;
* Vamos a ob ene un poco más de in o mación:
(eule .pas:21)? wha is i
Va iable de ipo En e o
(eule .pas:21)? wha is x
Pa ame o de ipo En e o
* Nos pa a emos en la úl ima i e ación del bucle FOR exis en e en el cue po de la unción
* Eule :
(eule .pas:21)? b eak #22 i==x-1
(eule .pas:21)? b eak
Lis a B eakpoin s [eule .pas].
* linea #22
1: (i==(x-1))
(eule .pas:21)? un
22: FOR i:=1 TO x-1 DO
* Veamos que e dade amen e es la úl ima i e ación:
(eule .pas:22)? wa ch i
(En e o) 9
(eule .pas:22)? wa ch x-1
(En e o) 9
* En emos en Mcd:
(eule .pas:22)? nex
23: IF Mcd(x,i)=1 THEN
(eule .pas:23)? nex
8: REPEAT
* Veamos que es lo que de uel e la unción Mcd:
(eule .pas:8)? b eak #15
(eule .pas:8)? un
15: mcd:=p;
(eule .pas:15)? wa ch p
(En e o) 1
*Po an o se iene que i po la ama e dade a del condicional IF que es á en la unción
* Eule :
(eule .pas:15)? nex
24: con ado :=con ado +1;
* Exac amen e, aho a a po el esul ado inal!
(eule .pas:24)? un
10 - 4