Está en la página 1de 45

RESU M EN DEM A KLEN GU AJ ESY COM P I LA DORES( P rimerCuatrimes tre)

Autor :Ar ielNa der ar ielnader @gmail.com


DefinicionesIniciales
Loslenguajesdeprogramacintienentresaspectosfundamentales:
Sintaxis:Es elconjunto de reglas queespecifican la composicin del programaapartirde letras,dgitos y
otroscaracteres.Estononosdicenadaacercadelsignificadodecadasentencia,soloindicasiunasentencia
determinadaesvlidadentrodellenguajeono.Estacompuestapordoselementos:
o Lxica.
o Gramtica.
Semntica: especifica el significado de un programa escrito de forma vlida bajo las reglas de sintaxis.
Definencualeselefectodecadaunadelassentenciasyelprogramacompleto.
Pragmtica:Partedelestudiodeloslenguajesquesededicaatodoloquetienequeverconlascuestionesde
construccin.Implementacin,velocidad,versiones,etc.

Alfabeto

Sintaxis

Elementosdel
Lenguaje(Tokens)

Semntica

Sentencias,
Programas

Sobre el conjunto de caracteres del alfabeto, podemos aplicarle reglas de sintaxis para obtener los elementos del
lenguajevlidos.Ejemplosdeelementossonlapalabrawhile,lasvariables,lasconstantes,lapalabraint,etc.A
esteconjunto,seleaplicanlasreglasdesemnticaparadefinirlassentenciasylosprogramasvlidosparaellenguaje.

BindingyVar ia bles
El binding o ligadura es el momento exacto en el que conoce un atributo o propiedad de un elemento de cierto
lenguaje. Se entiende por elemento de lenguaje a variables, identificadores, constantes, funciones, procedimientos,
etc. De esta forma, el binding de una variable es el concepto que define el momento en el que se conoce una
propiedad determinadade unavariable(esdecir, el momento preciso enel que unapropiedadde unavariable est
definida).Elbindingesunconceptocentralenladefinicindelasemnticadeloslenguajesdeprogramacin.
Cada variable tiene un nombre y este es utilizado para que pueda ser referenciada. Las variables tienen cuatro
atributosquepodemosestudiarentrminosdebinding:
Tipo:Eslaespecificacindelconjuntodevaloresquepuedetenerunavariable,juntoconlasoperacionesenlasque
puedeintervenir.Cuandosecreaunlenguaje,sedefinenungrupodetiposdedatosdelosquepuedeserunavariable
(ej:int,char,bool,etc).Enalgunoslenguajeselprogramadorpuededefinirnuevostipos.
Lostipospuedenenlazarse:
Estticamente: por ejemplo, en Cunavariable definidacomoint varsiempreser int. Estose defineen
tiempodecompilacin.
Dinmicamente: por ejemplo, en un compilador de BASIC determinado una variable definida como Dim
varpuede en un momento albergar un valor numrico y mas tarde un string, esto hace que el tipo de la
variablecambie.Otroejemploocurreen el lenguajeAPL.As,eltipovaadependerdelflujodeejecucin
delprograma.
Valor: Es el contenido de la variable en un determinado momento. Se representa codificado por medio de bits y,
segneltipodelavariable,esarepresentacintieneunsignificadodistinto.Estevalorpuedesermodificadoporuna
operacindeasignacin.
Losvalorespuedenenlazarse:

Estticamente:paraelcasodelasconstantessimblicas,elvalornuncacambiaalolargodelaejecucin.Por
ejemplo,constintvar=3.Estoseestableceentiempodecompilacin.
Dinmicamente:Eselcasodecualquiervariablecomnquepormediodeunaasignacinsuvalorcambia.
Todoestodependedelflujodeejecucin.
Alcance:Eselrangodeinstruccionesdelprogramaenelcualesconocidalavariable.
Elalcancepuedeenlazarse:
Estticamente:Enestecaso,estaperfectamentedefinidocualesinstruccionespuedenaccederalavariableal
momentodelacompilacin.EjemploenC:
{
intx=0
x=x+1
}
y=x

Estecdigodaerrorporquelavariablexnoexisteenelmomentodeasignarlaalavariabley.Podramosdecir,
queelalcancedelavariablepuededelimitarseconterminalesdelaestructuralxicadelprograma(esdecir,las
llaves{}).
Dinmicamente:Paraesteenlace,elalcancesedefineenelmomentodelaejecucindelprograma.Ejemplo
enGWBASIC:
10:
20:
30:
40:
50:

A=10
INPUTX
IFX>0THENGOTO50
B=7
C=A+B

LoqueocurreacaesquelavariableBpuedeserconocidaonoenlalnea50dependiendodelvaloringresado
por teclado en la lnea 20. Si el usuario ingresa 1 el flujo de programa pasa por 40 y la variable B es
dimensionadaen memoria. Perosi el usuario ingresa 1,entraen el IF y este hace unsalto a lalnea50 detal
formaquenuncasedimensionaen memorialavariableByen lalnea50intentautilizarlasinantescrearlalo
queresultaenunerrordeejecucin.
Almacenamiento/TiempodeVida:Eselmomentoenelcualunreadememoriaesasignadaalavariableparaque
puedacontenerunvalor.
Elalmacenamientopuedeenlazarse:
Estticamente:enesteenlace,seconocelaposicindememoriaqueocuparacadavariablealmomentodela
compilacin ya que al inicio de ejecucin se reserva toda la memoria necesaria total. Lenguajes como
FORTRAN y COBOL trabajan de esta forma. Por ejemplo, la variable precio al momento de compilar
siempreocuparaladireccin03AF6x0enlamemoria.Estonopermitelarecursividadyaquenopuedotener
dosvariablesprecioalmismotiempoyaquehacenreferenciaalamismaceldadememoria.
Dinmicamente:Lamayoradeloslenguajesnodefinenellugarfsicodesusvariableshastatantonoestel
programaenejecucinyelbloquequecontengalavariablenoseaactivado.Deestaformaseaprovechamas
lamemoriaysepermitelarecursividad.
Entonces,podemosdecir queun bindinges est ticosiest establecidoa ntesdelmomento dela ejecucin del
pr ograma ynopuedeser cambia domastarde,yqueesdin micosiseestableceentiempodeejecucinypuede
ser cambiadodeacuer doaalgunasr egla sespecificada spor ellenguaje.
Atr ibutodelBindingdeVar ia ble
Valor
Tipo
Alcance
Almacenamiento

Est tico
Constantes
Mayora
Mayora
FORTRAN,COBOL

Dinmico
Mayora
APL,LISP,J,SMALLTALK
BASIC,APL,J
Mayora

ClasificacindelosLengua jesdeProgr amacin


Loslenguajesseclasificanentresgrandesgrupossegnlossiguientescriterios:
Sitienealmacenamientoesttico: LENGUAJ EESTATICO
Sitienealmacenamientodinmico:
o Sitienetipoyalcanceestticos:LENGUAJ ETIPOALGOL/ORIENTADOALAPILA
o Sitienetipooalcancedinmico:LENGUAJ EDINAMICO
ModelosdeEjecucin
Existendosmodelos:
Compilada: toma un programa escrito en un determinado lenguaje y lo traduce a otro lenguaje, sea este
directamente ejecutable o no. Es decir, no necesariamente el lenguaje resultante se puede ejecutar
directamenteporunaCPU.Ej:elEXEquegeneraunprogramaenC++oelcdigoILde.Net.
Interpretada: el interprete toma un programa escrito en determinado lenguaje y ejecuta cada instruccin
directamente.
Noexisteunlenguajequeutilice100%unodelosmodelosperolamayoradeloslenguajestipoAlgolseacercanal
modelocompiladoylamayoradeloslenguajesdinmicosseacercanalmodelointerpretado.

UsodeMemor ia
LenguajesEstticos:Lamemoriaqueelprogramanecesitaesreservadaantesdeliniciodelaejecucin.Cada
variabletieneunaposicinprefijadaenlamemoriaymantienesuespaciodurantetodoeltiempoqueseest
ejecutandoelprograma.Estoslenguajesnopermitenrecursin.
o Tipo:esttico
o Alcance:esttico
o Almacenamiento:esttico
Ejemplos:COBOL,FOLTRAN.
Estos lenguajes hacen una asociacin rgida entre el nombre de la variable y la direccin de memoria que
ocuparn. Por ejemplo, la variable precio es reemplazada por la direccin 59A0F al compilarse. Estos
programasdebenejecutarsesiempreenelmismolugardememoriayesporestoquesiempresesabecuanta
memoriaocupan.
Programa
ejecutable
Tamaofijo

datos

N ose u sa

Sitenemoslasiguienteasignacindondeseutilizan3variablesenteras:
A=B+C

Elcompiladortraducelasvariablesaunadireccinfijaenmemoria:
AF123
BAB11
C1234
Entoncescompilalaasignacinalsiguientecdigoasembler:
MOVAX,AB11
ADD1234,AX
MOVF123,AX
LenguajesDinmicos:Tienenunusodememoriaimpredecibles.Permitenlarecursividad
o Tipo:dinmico
o Alcance:dinmico
o Almacenamiento:dinmico
Ejemplos:LISP,PROLOG,APL,SNOBOL4.
Enestoslenguajesunavariablepuedecambiardetipotansoloconrecibirunaasignacindeunvalordistinto
altipooriginalquecontena.Porejemplo,sepuedecomenzarasignandoalavariableprecioconunvalorde
10ymasadelantealamismavariableasignarleelstringdiez.Estoprovocauncambiodetipodedatodela
variable.De esto podemosdeducirque entiempo de compilacin,no sepuede determinarque operaciones
estnpermitidasparaciertavariable,yaquealcompilarlaoperacinprecio/5nosabemossiestavariable
vaaserINTEGERoSTRING(enelprimercasosepermiteladivisin,enelsegundono).
Para implementar algo asi, necesitamos tener punteros al descriptor de la variable precio dentro de la
TABLADESIMBOLOS.Estatablaesunlistadodedescriptoresquecontienenentreotrascosas,elnombre
de la variable (si, el nombre que se le da en el cdigo, en este caso precio), el tipo(si es INTEGER,
STRING,etcenestemomento)yunpunteroalsectordelHEAPdondeseencuentranlosdatosdelavariable.
El HEAP es un sector de memoria dedicado a contener los valores, clases y estructuras de las variables
dinmicas(profundizaremosmasadelanteenestosconceptos).
Algo para destacar es que por lo general, los lenguajes estticos y de pila se compilan mientras que los
dinmicos se interpretan.Esto quiere decirque necesitan deun programa interprete queest ejecutandoen
memoriaparaserejecutados.
Intrprete
Programa
semitraducido

Tablade
smbolos
punteros

HEAP

Datos
dispersosen
memoria

Sitenemoslasiguienteasignacindondeseutilizan3variablesenteras:
A=B+C
Elinterpretetraducirlaasignacinaunaseriedeoperacionescomolassiguientes:

o
o
o
o
o

BuscarenTabladeSmbolosaB
BuscarenTabladeSmbolosaC
Llamarrutinadesumaenteros
BuscarenTabladeSmbolosaA
AlmacenarelvalorresultanteenA

LenguajesbasadosenPila/TipoALGOL:Nosepuedeasegurarelusodememoriadelosprogramasdeeste
tipo,perosepuedepredecir.ElusodememoriasigueunadisciplinaLIFO(tipocomounapila).
o Tipo:esttico
o Alcance:esttico
o Almacenamiento:dinmico
Ejemplos:ALGOL,C,PASCAL,ADA,MODULA.
Lasvariablesnotienenpredefinidoel lugarexactodondeserncontenidasenmemoria,envezdeeso,cada
variabletienefijounoffsetdesde elbloquequelecorresponda.Estebloqueescomounsegmentodedatos
asociadoaunaunidaddeejecucin(funcin,procedimientoobloquedecdigo)ynotieneunlugarfijoen
memoria.Graciasaesto,permitenlarecursividad.Porejemplo,lafuncinsumar()seejecutaenunlugarXen
memoria. Para esto, se genera un bloque asociado a dicha funcin donde estarn contenidas cada variable
declaradadentrodelamisma.Entonces,lavariableprecio,queestdeclaradaenlafuncin,esreemplazada
al compilar por un OFFSET fijo desde el comienzo de dicho bloque. De esta forma, si la misma funcin
sumar() se llama a si misma, un nuevo bloque se reserva en otro sector de memoria y la nueva variable
preciotendrelMISMOOFFSETencadaejecucinperolaBASEdelBLOQUEserdistintapermitiendo
poder ser diferenciadas. A este bloque se lo llama REGISTRO DE ACTIVACION. Hablaremos de este
conceptomasadelante.
Programa
ejecutable
Puedeque
todoel
programa
noentreen
memoria

datos
frontera
variable

Unida doBloque
Se define como un conjunto de instrucciones delimitadas de forma explicita donde se permite declarar variables
locales.Lasinstruccionesdentrodelbloqueconocenypuedenreferenciaralasvariablesquealldentrosedeclaran,
perounavezqueelbloquefinaliza,estasvariablesdejandeexistirynosonreconocidasporelrestodelprograma.
Clasificacin:
Annimos: No tienen un nombre, simplemente se entra en el debido al flujo de instrucciones, en otras
palabras,laejecucinllegaallugardondeseencuentradeclarado.Debidoaquenopuedeserllamado,noes
recursivo.
Con Nombre: Tienen nombre, son funciones, procedimientos, etc. Son invocados por una instruccin y
puedenserrecursivos.
Ejemplos:
EnCelbloqueencerradoentre{}esunbloqueannimo:
.....
{
.....
.....
.....
}
.....

EnC,lasfuncionessonbloquesconnombre.
voidfuncion(){
.....
.....
.....
}

EnPascal,losprocedimientossonbloquesconnombre.
Procedureprocedim()
Begin
.....
.....
.....
End

PeroenPascalnoexistenlosbloquesannimosyaque,apesardeexistirelpardeinstruccionesbegin/end,
dentrodeellosnosepermitendeclararvariables.
Begin
.....
.....
.....
End

EsimportanterepasarladefinicindeUnidadoBloqueparasabercuandoestamoshablandodeunoycuandono.En
loscuatrocasosanteriores,ladelimitacindelbloqueeraexplicita,peroenelltimonosepermitedeclararvariables
dentroyestohacequenoseaconsideradobloque.

RegistrodeActivacin
Losregistrosdeactivacinsonunaporcindememoriareservadaparalosdatosquemanipulaunaunidadobloque
enejecucin.Cuandoenelprogramasellamaaunafuncin,inmediatamentesereservaenmemoraelespaciodonde
contendrlasvariableslocalesdelafuncin,losparmetrosdeentradaydesalidaytodosaquelloselementosquese
necesitenparasuejecucin.Cuandoestafuncinconcluyesuejecucin,seprocedealiberarlamemoriaqueocupael
registrodeactivacinyseretornaalbloquellamador.Cadaunidadenejecucintieneunregistrodeactivacin.
Supongamos la secuencia de llamados de los siguientes bloques A B C. Entonces diagramemos lo que va
ocurriendoacadamomento:
1) Enmemoriaestalojadoel cdigo delprograma. ComoA est ejecutando tambinse tieneen memoria el
registrodeactivacindeAcontodassusvariableslocales.
Programa
ejecutable
Reg.Act.A

2) LuegoAllamaaB,conlocualelregistrodeactivacindeBescargado.
Programa
ejecutable
Reg.Act.A
Reg.Act.B

3) YluegoBllamaaC.

Programa
ejecutable
Reg.Act.A
Reg.Act.B
Reg.Act.C

4) FinalmenteCretornayseeliminaenmemoriasuregistrodeactivacin.
Programa
ejecutable
Reg.Act.A
Reg.Act.B

5) LomismoparaBcuandoretorna.
Programa
ejecutable
Reg.Act.A

EstodemuestraclaramentequelosregistrosdeactivacintienenuncomportamientodetipoLIFO(LastInputFirst
Output)ydeahdelnombredelenguajesorientadosalapila.Sedicequecuandoelregistrodeactivacindeuna
unidadsecarga,adquieredireccionamiento.
Comohabamosdicho,cadavariableseremplazaporunoffsetfijoenelmomentodelacompilacin,cuyabaseviene
dadaporladireccindecomienzodelregistrodeactivacinquelacontiene.Estabaseesguardadageneralmenteenel
registro BP (o EBP). Entonces supongamos que tenemos las siguientes variables y que el compilador le dio esas
distanciasdeoffsetqueseaclaranenelcuadro:
Variable
Z
X
Y

Offset
10
20
30

LainstruccinZ=X+Ysecompiladelasiguientemanera:
MOV
ADD
MOV

R1,[BP+20]
R1,[BP+30]
[BP+10],R1

#SecargaenelregistroR1elvalordeX
#SesumaalregistroR1elvalordeY
#SealmacenaenZelvalorresultante

Esos offset son asignados al momento de la compilacin y quedan fijos en el cdigo del programa. De esta forma
podemos ver claramente que el nombre de la variable no queda disponible en el momento de ejecucin en los
lenguajesdetipoPila.EstosoloocurreenloslenguajesDinmicos.
CadenaDinmica
Antes de explicar este concepto, vamos a explicar la problemtica. En cada momento, el programa mantiene al
registroBPapuntandoalabasedelregistrodeactivacinactivo.Cuandoseproduceunllamadoaotrobloque,antes
de realizar el salto al cdigo correspondiente, se debe apuntaral nuevo registro de activacin. Este nuevo registro
estarcontiguoalregistroanteriorconlocual,paraapuntaralnuevoseledebesumaralBPeltamaodelregistro
anterior.Lasinstruccionesnecesariasparahacerestolasconstruyeelcompiladoryaqueconoceeltamaodelregistro
deactivacinactual.
ADD

BP,(TAMAOR.A.ACTUAL)

#SesumaeltamaodelR.A.Actual.

Masadelante,conlaejecucindelprogramallegaelmomentoderetornardeunafuncin.Loquesedeberealizaren
esemomentoesvolveratrselBP,esdecir,apuntaralregistrodeactivacinanterior.Peroelproblemaesqueeneste
caso, una funcin no puede saber por quien ha sido llamada, con lo cual, no sabra a cuanto restarle al BP. Para
solucionar esto, el compilador reserva en unlugarfijode cada registro deactivacin la direccin del registrode la
unidadque lollamo.
Estecomportamientogeneraunasucesindepunterosquevadesdeelregistrodeactivacinactivohastaelprimero,
pasandoportodosdentrodelapiladellamadas.AestacadenadepunterosselellamaCADENADINAMICA.
Entonces,ampliamosel cdigodelllamadoconloexplicadoanteriormente:

MOV
ADD
MOV
....
....
....
MOV

R7,BP
BP,(TAMAOR.A.ACTUAL)
[BP+4],R7

#Guardaenunregistrocualquiera,elvaloractualdeBP.
#Sesumaeltamao.Estogeneracambiodecontexto
#GuardaelvalordelBPanteriorenelR.A.actual,posicin4
#Seejecutaelcdigodelafuncinllamada

BP,[BP+4]

#VuelvoaapuntaralBPanterior

El compilador decide a que offset fijova a guardar elpunteroBPanterior, y lo respetapara todos los registrosde
activacin(enesteejemplodecdigo,eloffsetesde4).
AcontinuacinrealizamosunarepresentacindelacadenadinmicaparalasecuenciadellamadosABQal
momentodeejecutarQ.Omitiremoselcdigodelprogramaparasimplificareldibujo,einvertiremoselsentidodela
memoria.

R.A.deQ

BPActual

R.A.deB
R.A.deA

Eneldibujoseveclaramentecomocadaregistrodeactivacintieneenunoffsetfijounpunteroalregistroanterior
formandounacadenadepunteros,yelBPactualapuntandoalregistroactivo.
EstructuradeUnidades
Los lenguajes de tipo Algol tienen una estructura que tiene por objetivo poder dividir el cdigo en unidades y
controlarelmbitodelasvariables.Estoesunanidamientoestticodeunidades,lasdefineelprogramadorynovaria

luego de la compilacin. Las unidades pueden estar anidadas hacia adentro o independientes. Esto puede ser
representadoconlassiguientesimgenes:
A
B
C

A
D
B

EstructuradeUnidades
E

ArboldeAnidamiento
C

F
D
G

EnlaprimerfigurasemuestraunprogramaquetieneunaunidadprincipalA.EstecontienedosunidadesByE.Asu
vez,BcontienelaunidadCyestecontieneaD.Porotrolado,launidadEcontienelasunidadesFyG.Estamisma
estructurapuederepresentarseconelrboldelasegundafigura.
Encadaunidadsepuedendeclararvariables.UnavariabledeclaradaenlaunidadAtienenivel0,unadeclaradaenel
B o E tiene nivel 1 y ascon lasdems unidades, lanotacinparadescribirelnivelde anidacin de una unidad es
nivel(U)paralaunidadU.Cadaunidadpuedemanipularlasvariablesquesedeclaranenellademaneralocalylas
variablesquesedeclaranenunidadesdondeestncontenidasdemaneraglobal.Porejemplo,unavariabledeclarada
enBeslocalaByglobalaCyD.Enelcasoqueunavariabletengaelmismonombrequeotraglobalalaunidad,se
refierealavariablelocalsinteneraccesoalaglobal.Estoquieredecirquelavariablelocalenmascaraalavariable
global.
Elrboldeanidamientoesunaestructuraqueconstruyeelcompiladoralmomentodecompilar,lautilizaparatalfin
yunavezqueterminoelprocesodecompilacinladestruye.
Ahorabien,supongamosunprogramaconlasiguienteestructura:
A
B

intz
F

inty

z =x+y

C
intx
H

Esteno eslenguaje C.Vemos la estructura y destacamos que en la unidad A sedeclarala variablez, enlaC la
variablex,enlaGlavariabley,mientrasqueenlaunidadJseoperacondichasvariables.
Si las variables fuerandeclaradas enla unidadJ, la operacin de suma seriasencillade compilar yaquese debera
reemplazarcadaunaconel[BP+offset]comosemostranteriormente.Perolacuestinesqueestasvariablesnose
encuentranubicadasenelregistrodeactivacinactual,conlocualobligaalprogramaabuscarlasenlosanteriores.
Paratal fin, eldiseadordel compiladordebeestableceruna regla dealcance yseguir dicha regla al compilar. Un
ejemploseria:Busquelasvariablesenelentornolocal,sinoestnahbusqueenlaunidadpadreyassucesivamente.
Paraello,debemossaberaquedistanciaestacadavariable(dentrodelrboldeanidamiento)segnlaunidaddondese
encuentralaoperacin.Paraestecasotenemos:

Variable
Z
X
Y

Arcos
3
2
1

El concepto de arco es la cantidad de saltos atrs que debe hacer para encontrar la variable dentro del rbol de
anidacin.VemosqueparazdesdelaunidadJsedebepasarporG,CyAparaencontrarla,paraxporGyCy
paraysoloporG.Hayquetenerencuentaquecadavariabledentrodesuregistrodeactivacintieneunoffsetfijo,
conlocualhayquetenerencuentalasdoscuestionesalahoradecompilar,eloffsetylosarcos.Vamosaescribirun
pseudocdigoenassemblerquedecmosecompilaralasumaymasadelantelocompletaremos:
MOV
ADD
MOV

R1,2arcos+[BP+20]
R1,1arco+[BP+30]
3arcos+[BP+10],R1

#SecargaenelregistroR1elvalordeX
#SesumaalregistroR1elvalordeY
#SealmacenaenZelvalorresultante

CadenaEsttica
Comovemos,paraobtenerel lugardememoriadeunavariableseutilizanlosarcos.Paraesto,elcompiladorarma
una estructurapara implementarlas bsquedasque realizen elrbolde anidamientopero que en ejecucin yano
tiene.Estoesunacadenadepunterosdondecadaregistrodeactivacinapuntaalabasedesupadre.Estacadenase
llamaCADENAESTATICA.Entoncescadaregistrodeactivacintienealmacenadounpuntero(enunoffsetfijo)
queapuntaalregistrodeactivacinpadredentrodelaestructurasdelasunidades.
Paralasiguientesecuenciadellamadosconlaestructuraanteriormentevista,semuestranlospunteros:
ABCHGJ

R.A.deJ
R.A.deG

BPActual

R.A.deH
R.A.deC

CadenaEstticaCadenaDinmica
R.A.deB
R.A.deA

Entonces, para obtener la variable x desde J dijimos que necesitaba dos arcos, esto es mover dos a travs de la
cadenaestticayaunoffsetde20esencontrada(dentrodelregistrodeactivacindeC).

10

Bueno,ahorasi,podemosescribirelcdigoassemblerdelasumaejecutadaenelmduloJasumiendoqueelpuntero
delacadenaestticaseencuentraenunoffsetfijodedosdentrodelregistrodeactivacin.
MOV

R4,BP

#GuardaelBPenunregistrocualquieraparanoperderlo

MOV
MOV
MOV

BP,[BP+2] #BajadosvecesenlacadenaestticaparaencontraraX
BP,[BP+2]
R1,[BP+20] #GuardaenelR1elvalordeX(offsetde20dentrodesuregistrodeactivacin)

MOV

BP,R4

MOV
ADD

BP,[BP+2] #BajaunavezenlacadenaestticaparaencontrarY
R1,[BP+30] #LesumaaR1elvalordeY(offsetde30dentrodesuregistrodeactivacin)

MOV

BP,R4

MOV
MOV
MOV
MOV

BP,[BP+2] #BajatresvecesenlacadenaestticaparaencontraraZ
BP,[BP+2]
BP,[BP+2]
[BP+10],R1#GuardaelresultadoenZ(offsetde10dentrodesuregistrodeactivacin)

#VuelvealcontextodelaunidadJ

#VuelvealcontextodelaunidadJ

Aclaraciones:
EllenguajeCnotieneanidacindeunidades,solotiene2niveles:
A

ElpunterodecadenaestticadelaunidadpadreAapuntaasimismo.
Cada unidaden lacadena esttica apuntaal padrequese llam porltima vez.Es decir, parala secuencia
ABABeldiagramaeselsiguiente:

R.A.deB

BPActual

R.A.deA

CadenaEstticaCadenaDinmica
R.A.deB
R.A.deA

Paraelcasodelosllamadosentreunidades,unafuncinesglobalparasimismayparalasrestantesfuncionessalvo
queseasupadre.Esnecesariohablardelavisibilidadentrefunciones.Supongamosquetenemosestaestructura:
A
B

F
C

11

Lasunidadesseconsiderandeclaradasenlaunidadqueespadre.Deestaforma,enAsedeclaranlasunidadesByC,
enBlasDyEyenClaF.Deestaforma,deducimosquelaunidadApuedellamaralaunidadBporqueeslocalen
A.Ahorabien,siestoyejecutandoenlaunidadBeintentounallamadaalaunidadC,elcompiladornovaaencontrar
en primera instancia a dicha unidad en el entorno local, as que seguir la cadena esttica segn indica laregla de
alcancehastaencontrarla,conlocual,bajahastaAyencuentradeclaradalaunidadC.Observequesolosehizouna
bajadaatravsdelacadenaesttica,loquesignificaqueesGlobaldeDistancia1.Lalgicaeslamismaparaelcaso
dequeDquierallamaraC,peroladistanciaes2,asqueCconrespectoaDesglobaladistancia2.Enelcasodeuna
llamadarecursiva,siEquierellamaraE,alcompilarnovaaencontrarladeclaracindeEensuentornolocalasque
bajarunoporlacadenaestticayloencuentraenB,conlocualestallamadaesglobaldedistancia1(siemprequees
recursivaesdedistancia1).YsiBintentallamaraF?Estecasonoesposibleyelcompiladorarrojarunerrorporque
alnoencontraraFensuentornolocalbajahastaAytampocoloencuentraperonopuedebajarmasyaqueestamos
enelnodoraz.
Resumiendocadacaso:

ABeslocal(L)
BCesglobaldedistanciauno(G1)
DCesglobaladistanciados(G2)
EEesglobaldedistanciauno(G1oRderecursiva),todoslosllamadosrecursivossondeestacategora
BFnosepuederealizar

Paraayudarnosalintentarsaberqueunidadpuedellamaracualotra,secreaunamatrizdellamados:

A
B
C
D
E
F

A
R
G2
G2
G3
G3
G3

B
L
R
G1
G2
G2
G2

C
L
G1
R
G2
G2
G2

R
G1

G1
R

Estamatriznolacreaelcompilador,soloesunaayudaparanosotrosalintentarestudiareltema.
Ahoraquesabemosqueunidadpuedellamaracualotra,podemosaclararcomoesqueseconstruyenlospunterosde
la cadena esttica. Bsicamente, el principio que se sigue es que la cadena esttica se forma siguiendo la misma
cadenaestticapreconstruida.Veamosunejemplo,conlasiguientesecuenciadellamados:
ABCFC
1)Comienzala ejecucin deA, en memoriase encuentra unnico registro deactivacin.Acontinuacineldibujo
(porrazonesprcticasnodibujaremoslacadenadinmica).

CadenaEsttica

R.A.deA

BPActual

2)AB:Alencontrarelllamado,elcompiladorescribelassentenciasquedimensionanelregistrodeactivacinde
B.Luegodeello,vuelveaapuntaralR.A.deAyconsultaelrboldeanidamiento.ComoencuentraqueBeslocala
A,tomaladireccindeBPdeAylaguardaenelpunterodecadenaestticadeB.

12

R.A.deB
CadenaEstticaBPActual
R.A.deA

3)BC:Alencontrarelllamado,elcompiladorescribelassentenciasquedimensionanelregistrodeactivacinde
C.Luegodeello,vuelveaapuntaralR.A.deByconsultaelrboldeanidamiento.ComoencuentraqueCesglobal
a distancia 1 con respecto a B, entonces baja una posicin en la cadena esttica hasta el R. A. de A y copia esa
direccinqueapuntaaeseR. A.enelpunterodecadenaestticadeC.

R.A.deC

CadenaEsttica

BPActual

R.A.deB
R.A.deA

4)CF:Alencontrarelllamado,elcompiladorescribelassentenciasquedimensionanelregistrodeactivacinde
F.Luegodeello,vuelveaapuntaralR.A.deCyconsultaelrboldeanidamiento.ComoencuentraqueFeslocala
C,tomaladireccindeBPdeCylaguardaenelpunterodecadenaestticadeF.

R.A.deF

BPActual

R.A.deC

CadenaEsttica

R.A.deB
R.A.deA

5)FC:Alencontrarelllamado,elcompiladorescribelassentenciasquedimensionanelregistrodeactivacinde
C.Luegodeello,vuelveaapuntaralR.A.deFyconsultaelrboldeanidamiento.ComoencuentraqueCesglobala
distancia 2 con respecto a F, entonces baja dos posiciones en la cadena esttica hasta el R. A. de A y copia esa
direccinqueapuntaaeseR.A.enelpunterodecadenaestticadeC.
R.A.deC
R.A.deF
R.A.deC

CadenaEsttica

R.A.deB
R.A.deA

13

BPActual

Loimportanteadestacarentodoesteprocedimientoesquesegnlacantidaddedistanciaqueunaunidadseaglobala
otra es igual a la cantidad de arcos que se debebajar desde el R. A. de la unidad llamadora a travs de la cadena
estticapreconstruidaparaobtenerqueRA.sedebealmacenarenelpunterodecadenaestticadelR.A.delaunidad
llamada.
AcontinuacinsepresentalaimplementacindeesteprocedimientoencdigoassemblerparalallamadaF Cy
suponiendoqueelpunterodecadenaestticaesta3yeldecadenadinmicaesta4.

MOV

R6,BP

#GuardaelBPqueapuntaaCenunregistrocualquieraparanoperderlo

MOV

BP,[BP+4]

#Bajaalbloquedelllamador(esF)

MOV
MOV

BP,[BP+3]
BP,[BP+3]

#Bajadosvecesatravsdelacadenaesttica.EstoesasiporqueCesglobal
#adosdeF.Sifueraglobala1,elcompiladorsoloponeunasoladeestas
#sentencias.Sifueralocal,nopondraninguna.

MOV

[R6+3],BP

#ComohabamosguardadoenR6elpunteroalbloquellamado,lopodemosutilizarde
#baseparasumarleeloffsetdondeseencuentraelpunterodecadenaesttica,
#yenelguardarleelpunteroalaunidadA(queeslaactual).

MOV

BP,R6

#Vuelvoaapuntaralbloquellamadoparacontinuarlaejecucin

Porltimovamosaaclararundetalle.SabemosquelaunidadBpuedellamaralaC,peroloquehayquesaberesque
nopuedeaccederasusvariables.EstoesporqueparaqueBaccedadebeirhaciaatrsunavezporlacadenaesttica
paraencontrarelregistrodeactivacindeAqueesdondeestdeclaradaC.PoresoBaccedeallamaraCperono
puedeaccederasusvariables,porquenuncallegaapararsesobresuregistrodeactivacin(perosiaccedealregistro
deA,poresopuedeversusvariablesyladeclaracindelaunidadC).

Clasificacindelasvariables:
Yaque conocimos la clasificacin de los lenguajes de programacin, ahora vamos a clasificar las variables con el
mismocriterio.
Est tica s: tienen lugar y tamao fijo en toda la ejecucin del programa. Se encuentran en el cdigo en una
posicinabsolutaenmemoria.Porlogeneralnoseencuentranenlosregistrosdeactivacin.Sonpropiasdelos
LenguajesEstticoscomoCobolyFoltran.
Semiestticas:tienenlugarvariableendistintasejecucionesytamaofijo.SonpropiasdelosLenguajesbasados
enlaPila.Elregistrodeactivacinquelascontienevariadelugar,peroloquenovariaeseloffsetdelavariable
dentrodelmismo.
Unarreglodelmitesfijosesdeestetipo.Porejemplo:intv(10to20)
Elcompiladorubicaestavariableenelregistrodeactivacin,sabedondeempiezaydondeterminaporquetiene
loslmitesespecificadosalmomentodeladefinicin(almacenatodosloselementosdelarraydeformacontigua).
Estosemuestraenlasiguienteimagenparaelarraydelejemploanterior

v10

IniciodeRA

OffsetdeV

v11

v12

...

OffsetdeV(12)

14

V20

Almomentodecompilarunaccesoaunelementodelarray,elcompiladorgeneraunafrmulaparacalcularel
offset del elemento solicitado. Supongamosque sehaceunaasignacin comolasiguiente: v(i) = 2.Primero el
compiladoraveriguaeloffsetconlaformula
Dv(i)=Dv+(i10)*TE

Donde:
Dv:eseloffsetdondecomienzanlosvaloresdelarraydentrodelregistrodeactivacin.
Dv(i):eseloffsetdelelementoquequeremoscalcular.
i:eslavariablequeelprogramadorutilizcomondicedeacceso.
10:esellmiteinferiorenladeclaracindelarray.
TE:eseltamaodelelementoenposicionesdememoria.Porej,siesintpuedeser2bytes,float4bytes,etc.
Todos los elementos de la frmula son conocidos en tiempo de compilacin ya que el tipo es fijo, como asi
tambinloslmitesdelvector.Esporesoqueelcompiladorgeneralasinstruccionesembebidasenelcdigopara
obtener el offsetDv(i)cada vezqueel programadorhace referenciaaun elemento del array.En elregistrode
activacinlonicoquehayguardadosonlosvaloresdeloselementosdelarray.

Otravariablesemiestticaesunamatriz.Porejemplo:inty(10to20,30to40)
Haydosmanerasdeguardarunamatrizenmemoriadentrodelregistrodeactivacin.Ellenguajedebeestipular
unadelasformasyguardartodassusmatricesdeesaforma.Enambasseguardademaneralinealycontigua.Las
formasson:
1. Almacenamientoporcolumnas:Sealmacenaprimerolalneadeelementosquevandesdeel
primer elemento hasta el ltimo de la primer columna, luego se almacena desde el primer
elementohastaelltimodelasegundacolumna,yassucesivamente.
PrimerColumna

IniciodeRA

y10,30

OffsetdeY

y11,30

y12,30

SegundaColumna

y20,30

...

y10,31

...

y20,31

OffsetdeY(12,30)

2. Almacenamiento por filas: Se almacena primero la lnea de elementos que van desde el
primerelementohastaelltimodelaprimerfila,luegosealmacenadesdeelprimerelemento
hastaelltimodelasegundafila,yassucesivamente.

PrimerFila

IniciodeRA

y10,30

OffsetdeY

y10,31

y10,32

SegundaFila

y10,40

...

OffsetdeY(12,30)

15

y11,30

...

y11,40

Enestoscasos, ocurrelo mismoqueen los vectores, los lmitessonfijos y los tipos deelementoquecontiene
tambin,porlotantoelcompiladorembebeunafrmuladeacceso.Estafrmuladependedecmosealmacenela
matriz.

Paraalmacenamientoporcolumna,eslasiguiente:
Dy(i,j)=Dy+[[(j30)*(2010+1)]+(i10)]*TE

Paraalmacenamientoporfila,eslasiguiente:
Dy(i,j)=Dy+[[(i10)*(4030+1)]+(j30)]*TE

Donde:
Dy:eseloffsetdondecomienzanlosvaloresdelamatrizdentrodelregistrodeactivacin.
Dy(i,j):eseloffsetdelelementoquequeremoscalcular.
i:eslavariabledefilaqueelprogramadorutilizcomondicedeacceso.
j:eslavariabledecolumnaqueelprogramadorutilizcomondicedeacceso.
10:esellmiteinferiordefilaenladeclaracindelamatriz.
20:esellmitesuperiordefilaenladeclaracindelamatriz.
30:esellmiteinferiordecolumnaenladeclaracindelamatriz.
40:esellmitesuperiordecolumnaenladeclaracindelamatriz.
TE:eseltamaodelelementoenposicionesdememoria.Porej,siesintpuedeser2bytes,float4bytes,etc.
Porejemplo,siqueremosaccederalelementoy(12,30)conalmacenamientoporcolumnas,laecuacinnosdalo
siguiente:
Dy(i,j)=Dy+[[(j 30)*(2010+1)]+(i 10)]*TE
Dy(12,30)=Dy+[[(3030)*(2010+1)]+(1210)]*TE
Dy(12,30)=Dy+[[(0)*(11)]+(2)]*TE
Dy(12,30)=Dy+[2]*TE

Otro ejemplo, si queremos acceder al elemento y(12, 30) con almacenamiento por filas, la ecuacin nos da lo
siguiente:
Dy(i,j)=Dy+[[(i 10)*(4030+1)]+(j 30)]*TE
Dy(12,30)=Dy+[[(1210)*(4030+1)]+(3030)]*TE
Dy(12,30)=Dy+[[(2)*(11)]+(0)]*TE
Dy(12,30)=Dy+[22]*TE

En cada caso, si multiplicamos el resultado por el tamao en posiciones de memoria del elemento y a eso lo
sumamosaladireccininicialdelamatrizencontramoselelemento.
Existenlenguajesqueverificanqueloslmitesqueescribeelprogramadoralaccederaunelementoseencuentren
enelrangoconlosquefuedeclaradolamatriz.Porejemplo,unaccesodey(5,8)noseravlidoenlenguajesque
controlanellmitecomoPASCALyADA,sinembargoseratotalmentevlidoenlenguajescomoC.Esecontrol
delmitesserealizamedianteinstruccionesembebidasenelcdigo:
If(i<limiteInferior1)
Error
If(i>limiteSuperior1)
Error
If(j<limiteInferior2)
Error
If(j>limiteSuperior2)
Error

Observe queloslmites del matrizno se encuentranalmacenados en memoria, sinoqueestnembebidos en el


cdigocomoconstantes.Estotambinocurreparalosvectores.

16

Semidin mica s:sondetamaoylugarvariableendistintasejecuciones.Sololosarreglosconlmitesvariables


caen dentro de esta categora. Una vez que se crea el registro de activacin no cambia, por ejemplo, un array
declaradocomox[2..n,3..m]donden y msonvariablesglobalesqueyatienenunvalorantesdequelaunidad
quecontieneestadeclaracinseallamada.Entonces,endiferentesejecucionesnymtendrndistintosvaloresy
por consecuencia el arreglo tendr distinto tamao, pero una vez creada este tamao no cambia. El arreglo es
dimensionadoenelmomentodecrearelregistrodeactivacin.
Este tipo de estructuras tienen un descriptor, que contiene los valores de los lmites ya que deben estar en
memoriaporquealnoserconstantesnosepuedenembeberenelcdigo(noseconocensusvaloresalmomento
delacompilacin).Estoslmitesseguardanenundescriptor(juntoaltamaodelaestructurayunpuntero)del
cual se puede decir que se comporta como una variable semiesttica. Este puntero indica el lugar donde se
encuentranlosdatosdelarreglo.Estosdatosseubicanalfinaldelregistrodeactivacinyaquealserdetamao
variable,primerodebenubicarselasvariablessemiestticasportenerunoffsetfijorelativoalcomienzodelR.A.
Observeelgrficoacontinuacin:
DatosdelArreglo

(otrasvariables)
Descriptor

Paracompilarunaccesoalarreglo,semanejacomoconlosarreglossemiestticos(embebiendolafrmula)pero
envezdedejarlosvaloresdeloslmitescomoconstantes,utilizalosvaloresalmacenadoseneldescriptor.
LenguajescomoADAtienenestetipodevariables,peronoeselcasodellenguajeC.
Din micas:el lugares variable y eltamaocambiaen cualquier momento luego de tener asignadoespaciode
almacenamientoparalavariableencuestin.El contenidodevalordeestasvariablesnoestnenelregistrode
activacin,encambio loquesi estesunpunteroqueapuntaaunsectordememoriallamadoHEAPdondese
almacenanestetipodeestructuras.Sedividenendostipos:

o Annimas: EnC,sondeclaracionescomolasiguiente:
int*puntero
puntero=malloc(50)

Lavariablepunteroessemiesttica,seencuentraenelregistrodeactivacinycomosesabe,esun
puntero a una estructura de tipo dedato int. Cuandose realizael malloc, el compilador reserva 50
posicionesen elHEAPyhacequelavariablepunteroapunteaestaestructura(queeslavariable
annima). Es el usuario el que se encarga del HEAP, pide y devuelve memoria de forma explicita
comovimosenelcdigodeejemplo.

HEAP

R.A.
50

Puntero

Variablesemiesttica

Variabledinmicaannima

17

o Connombr e:EnAlgol68,soncosascomoesta:
Flexvar(1:0)ofint
var=(1234)
var=(12)
var=(123)

En este cdigo se declara un arreglo de enteros y en cada asignacin se le da distinta cantidad de


valores(encada unase redefine eltamaodelvector).Enel registro deactivacin seencuentraun
descriptorqueentreotrascosastieneunpunteroalHEAPdondeseencuentranlosvaloresdelarreglo.
Ladiferenciaconelanterioresqueestacoleccindevalorestienenombreyseadquierememoriaen
formaimplcitacuandoselomanipula.

HEAP
R.A.
var

Descriptor

Variablesemiesttica

Variabledinmicac/nombre

RecordemosqueelHEAPseencuentraenelmismobloquequelosregistrosdeactivacin.
Ejecutable
Registrosde
Activacin

HEAP

EnlenguajeC,soloexistenvariablessemiestticasydinmicasannimas.EnADAsoloexistenvariables
semiestticas,dinmicasannimasyvariablessemidinmicas.

Super din micas: Sonlasvariablesdinmicasdeloslenguajesdinmicos.Obviamentecambiandetipodurantela


ejecucin. En los lenguajes dinmicos no existe el registro de activacin, sino una tabla de smbolos y estas
variablesestnincluidasenlpormediodeundescriptor,queentreotrascosastieneelnombredelavariablecon
laquesereferenciaenelcdigoyunpunteroalHEAPdondeseencuentraelvalordelamisma.
Elerrordequereroperarvariablesdedistintotiposoloocurreenejecucinporquelostipodevaloresquetienen
lasvariablesdependendelaejecucin.
Valeaclararquetodosloslenguajesgeneranunatabladesmbolosentiempodecompilacinparapodergenerar
elcdigo,perolosnicoslenguajesquetienentabladesmboloenmemoriamientrasejecutansonlosdinmicos.

18

ProblemasconPunteros
Como vimos, dentro del registro de activacin puede haber punteros hacia otras estructuras como pueden ser a
variables semiestticas, semidinmicas, descriptores que apunten a estructuras en el HEAP, etc. Alguno de estos
punteros son generados por el compilador sin que el programador sepa de su existencia, pero otros punteros son
creados por el programador y es ah donde se presentan los inconvenientes. A continuacin diagramamos lo
anteriormenteexpuesto:

Datosde
variables
semidinmicas

Registrode
Activacin

Descriptoresde
variables
dinmicascon
nombre

HEAP

Descriptoresde
variables
semidinmicas
Variables
semiestticas

Lasflechaspunteadassonpunterosqueelcompiladorconstruyeyqueelprogramadornopuedever.Conestetipode
punterosnosurgenproblemasyaquesonadministradosporelprogramadeformatransparenteparaelprogramador.
Lasflechasconlnearepresentanpunterosadministradospor elprogramador.Eselcasode:
Punterosqueapuntanaotravariablesemiesttica. Ej:
inta=5
int*p
p=a

VariablesdinmicasannimasquetienenunpunteroreferenciandoaunbloquededatosenelHEAP.Ej:
int*puntero
puntero=malloc(50)

Punterosqueapuntanavariablessemidinmicas.
Elmotivoporelcualseproducenproblemasconestegrupodepunterosesporqueelprogramadorpuedehaceruna
malaadministracindelosmismos.Veamoslosproblemasquepuedensurgir:
ConflictodeTipos
Engeneral,elpunteropuedeapuntaracualquiertipodevariablesalvoqueellenguajenolopermita.Elcaso
clsico de este conflicto se d en el lenguaje PL/I. Existe un tipo de dato del puntero que se le otorga al
declararlo.Luegoaesepunterolepuedodarunadireccindeunavariableenteraodeunaconcomaflotante.
Mas adelante endeterminado punto del programa no puedo determinar si ese punteroapuntaa que tipode
datoporqueestodependedelflujodeejecucindelprograma.Elcdigodeejemplo:
DeclarePPointer
DeclareAFixedBase

19

DeclareBFloatBase
P:=Addr(A)
P:=Addr(B)

La mayora de los lenguajes exige que se defina el tipo de dato al que apunta el puntero y lo controla en
tiempodecompilacin.
PunterosColgados
Eneste casoelprogramadormanipulalospunterosdetal formaqueluegode tomarunbloque dedatos, lo
liberadejandounpunterosealandolazonaquefueliberada.EjenC:
p=malloc(100)
q=p
free(p)

Enesteejemplo,sereserveunbloquede100bytes,luegoseasignaelpunteroqparaqueapunteaesebloque
yfinalmenteseliberaelbloquedejandoalpunteroqapuntandoalazonadondeyanoest.
Otrocasotpicodeesteproblemasedebealtiempodevidadelospunteros.Sitengounpunteroglobalylos
datossonlocales,cuandoseterminalaunidadestosdatosyanosernvlidos,sinembargoelpunteroseguir
apuntandoaesazona.EjenALGOL:
ProcZ1
intx
refintpx
ProcZ2
inty
refintpy
Px:=x//mismombito(globales):ok
Py:=x//alretornar,elpunterodesapareceperomantengolosdatos:ok
Px:=y//alretornar,pierdolosdatosyelpunteroquedacolgado:mal
Py:=y//mismombito(locales):ok
...
...
...

Deloscuatrocasosqueseexplicaenelcdigo,eltercerosufredeproblemasdepunterocolgadoyaqueal
terminar la ejecucin de la unidad Z2, la variable y deja de ser direccionable pero el puntero sigue
apuntando a la zona de memoria donde se encontraba. En ALGOL ese cdigo dara error de compilacin
porquecontrolaqueenasignacionesdepunterosqueelqueestalaizquierdatengaunmenoroigualalcance
queelqueestaladerecha.Peroenotroslenguajes,estonosecontrola,permitiendoelproblemadepunteros
colgados. Es fcil esquematizar los punteros susceptibles de tener esteproblema, son los que apuntan a un
datoqueseencuentraenunregistrodeactivacinsuperior.

B
A

Garbage
EstoocurrecuandohayunbloquededatosenelHEAPdelcualseperdisupunteroyporlotantonohay
formadeaccederal(porlogeneralocurrenconvariablesdinmicasannimas).EjemploenC:

20

p=malloc(100)
q=malloc(200)
p=q

Primeroreserv100bytesapuntadosporp,luegoreservotros200apuntadoporqyfinalmentehiceque
papuntealos200bytesreservadosen la segundalnea, dejndomeinaccesiblelos100reservados en la
primera.Notengootropunteroapuntandoalbloqueperdidoporlotantoesinaccesible.

LenguajesdeProgramacinySistemasOperativos
Cadaunodeestoselementosnoesindependientedelotro.Unoafectaalotroyviceversa.Vamosaestudiarcadatipo
deSistemaOperativoycomofuncionanlaejecucindeloslenguajesencadacaso.

SistemaOperativoconParticionesFijas
EnestosSistemaselprogramacorreenunaparticinfijadememoriaquenovariaalolargodeltiempo.Ellenguaje
poneloselementosenmemoriaenelsiguienteorden:

Ejecutable
Variablesestticas
Lapiladeregistrosdeactivacin
ElHEAP

Comosabemos,lapilaescompacta,crececoncadallamadoaunaunidadydecrececuandoseretornadelllamado.En
cambioelHeapesunbloquededatosdesordenado,quecontienehuecoslibresyquecrecedemaneramasrpidaque
lapila.Ejemplodeporqueocurreesto:
p=malloc(100)
q=malloc(200)

free(p)

libre

200

100

libre

200

libre

p=malloc(150)

150

200

libre

z=malloc(40)

150

200

libre 40

Enelejemplovemoscomodetantopedirydevolvermemoriadedistintotamaoquedanhuecosenelmedio.Existen
muchaspolticasdeasignacindememoriaparaelementosenelHeapperonoentraremosendetalle(enelejemplo
utilizamos First Fit, podrahaber sido unaBest Fit o cualquier otra). El Heap se va acercando a lazona donde se
encuentralapilayalmismotiempodesperdiciandomemoria.
EsquemadememoriaparalenguajestipoAlgolySistemasOperativosconparticionesfijas:

Ejecutable

Variables
Estticas

Reg.
Act.1

Reg.
Act.2

Reg.
Act.3

Usado1

21

Libre1

Usado2

Libre2

Usado3

Usado4

Aquserepresentalaparticinfijadelamemoriadondeestcontenidoelprograma.Sobrelaizquierdaseencuentra
el ejecutable, lasvariablesestticas y lapilade registros deactivacin, a laderecha se ubica elHeap. Existen dos
estructurasquesonutilizadasparamantenerlosespaciosusadosyloslibresdelHeap.
Lista de usados: Dentro de las variables estticas se encuentra un puntero al primer bloque de usados del Heap.
Luego, dentro de cada bloque de usado hay una lista enlazada donde cada uno apunta al siguiente dentro de la
cadena(enelgrficoestrepresentadoporlasflechasslidas).
Listadelibres:DentrodelasvariablesestticasseencuentraunpunteroalprimerbloquedelibresdelHeap.Luego,
dentrode cadabloque de librehayuna listaenlazadadondecada unoapunta alsiguiente dentrode lacadena(en el
grficoestrepresentadoporlasflechaspunteadas).
Almomentodereservarunbloqueparausarlo,ellenguajereservaM+Ncantidaddebytes,dondeMeslacantidad
solicitadaporelprogramadoryNeslacantidaddebytesqueocupaunpuntero,yaqueenelbloquedebecontenerse
elpunteroalsiguienteusado.
Elmallocrecorrelacadenadelibresyleasignaunbloquequenoestsiendousadoparaocupar.Vanavegandoporla
listadesdeelfondohacialazonadelapilaenbuscadelacantidaddebyteslibressolicitada(enelcasodefirstfit).
El freepasa unbloqueusado a la cadena delibres y recompone la listaenlazada.Dos libres contiguos sejuntan y
quedanagrupados.
Estospunterossontotalmentetransparentesparaelprogramador,losadministraellenguajedentrodelasllamadasde
pedidoyliberadodememoria.
ElverdaderoconceptodeGarbage(basura)consisteenquealgunodelosbloquesdeusadosquevimosenelejemplo
no tiene un puntero que lo referencie dentro de la pila de registros de activacin y a su vez (obviamente) est
contenidodentrodelacadenadeusados.Enesecaso,estamosenpresenciadefragmentacinygarbage.

EsquemadememoriaparalenguajesdinmicosySistemasOperativosconparticionesfijas:

Interprete

Programa

TabladeSmbolos

Usado1

Libre1

Usado2

Libre2

Usado3

Usado4

Enestoslenguajesnoexistenlascadenasdelibresyusados(noexistemallocyfreetampoco).Loqueexisteesuna
tabla de smbolos que contiene la referencia hacia el sector de Heap donde se encuentra los datos del bloque
propiamente dicho. Los movimientos en el Heap tienen que ver mas con cambios de tipos (por ejemplo, que una
variablepaseaserdeunnuevotipomasgrandequeelanterior).
El programador no ve los punteros, solo ve las variables. Cada bloque usado tiene su puntero desde la tabla de
smbolos,larelacinesunoauno.ContodoestosededucequenoexisteelGarbagecomoenelcasoanterior,solo
hayfragmentacin.
Por lo general, estos tipos de lenguajes implementan un Garbage Collector que se encarga solo de compactar la
memoriaparaeliminarbloqueslibresenmediodebloquesusados.Estoestransparenteparaelprogramador.

GarbageCollectorenLenguajesDinmicos
Acontinuacinseexplicaelalgoritmoqueejecuta:

22

Elinterpreterevisalatabladesmbolosmirandolospunterosyeligeelqueapuntealadireccinmasaltade
memoria
Sepreguntasiestalfondodelaparticinfija
o Siloest,simplementelamarcacomoyarevisada
o Sinoloest,correalfondoelbloquededatos,obviamentesinpisarotrosbloquesqueseencontraran
masatrs.Lamarcacomoyarevisada
Vuelvearealizarlaoperacinsoloqueignorandolosbloquesyarevisadosyhastaquenoquedeningunosin
revisar.
Estealgoritmoseejecutaenelmomentoespecificadoporeldiseadordellenguajesegndiversoscriteriosqueeste
puedaadoptar.Paraelprogramadorresultaimpredecible.Existenlenguajesquepermitenejecutarelprocesoconun
llamadoaunafuncin.

GarbageCollectorenLenguajesTipoAlgol
Acontinuacinseexplicaelalgoritmoqueejecutaparalaeliminacindegarbage:
Recorrelalistadeusadosyacadaunolecolocaunamarca.
Luegorecorretodoslospunterosqueseencuentren enlapiladeregistrosdeactivacinyparacadabloque
apuntadoborralamarcaquepusoenelprimerpaso.Tambinsefijaenaquellospunterosqueseencuentran
contenidosencadaunodelosbloquesalosqueleborralamarca,con locual,siunbloqueusadonotiene
punteroenlapilaperositienepunteroenotrobloquedeusadosquedaincluidoenestepaso.
Recorrelacadenadeusadosliberandolosbloquesqueconservanlamarca.
Mientras que el primer y el tercer paso son sencillos, el segundo es muy complicado. Obliga al lenguaje a tener
controldetodoslospunterosquemanejaelusuario.
Otracomplicacines que en el segundopaso,el algoritmo tiene que recorrer los bloquesylospunteros dedichos
bloquesquesongeneradosporelusuario.Estasestructuraspuedenserrboles,listas,grafos,etc.Porlogeneral,estos
tiposdealgoritmosestnasociadosconllamadasrecursivasyesonecesitamuchamemoriaparaejecutar.Justamente,
elgarbagecollectorseejecutacuandofaltamemoriaconlocualesunproblema.Sinembargo,sediseounalgoritmo
que realiza esta tarea y no necesita ser recursivo. El algoritmo tiene tres punteros y con ellos va avanzando y
retrocediendodentrodelaestructura.Enprimerainstanciahacequelostrespunterosapuntenunoacadanodocomo
figuraacontinuacin.
A

Puntero1

Puntero2

Puntero3

H
M

Luego,avanzaconelpuntero2alnodoHperoantesdoyvueltaelpunteroquetieneBparaqueapunteaA.Estoes
porquesinoluegonovaatenercomovolveraAunavezqueterminalarecorridadeestarama.

23

Puntero1

Puntero2

Puntero3

H
M

Hacelomismoconelpuntero1.

Puntero1

Puntero2

Puntero3

H
M

Ydeestaformavarecorriendocadanodoyrealizandolasmarcas.Elmotivoporelcualdavueltalospunterosdela
mismaestructuraesparapodervolverdandopasoshaciaatrsynonecesitarmuchospunteros,esdecir,aprovechalos
punterosqueyatienelaestructura.Alirvolviendorestituyelospunterosdelaestructuraoriginal.
Ademsdeeliminarelgarbage,tambinsedebecompactarelHeap.Pararealizaresto,elGCdebebuscarcadabloque
usadoyporcadaunotienequerealizarelalgoritmoqueseexplicanteriormenteenbuscadepunterosqueapuntena
dichobloqueparapoderrefrescarlos.Estoesdeuncostocomputacionalaltsimoaunquepuedeimplementarse.
Por lo general, no existen implementaciones de garbage collector en lenguajes de tipo Algol debido a los
inconvenientes que fuimos describiendo. En vez de eso, algunos lenguajes utilizan una tcnica conocida como
contador dereferencia. Esta tcnica consisteen asignarle a cadabloqueusadoun valorqueindica la cantidadde
referenciasqueapuntanadichobloque.Siseleagregaotrareferencia,elcontadorpasaaser2,siluegose lequita
unareferenciavuelvea1ycuandoelbloqueyanotengareferenciasequedaen0yeseliminadodelalistadeusados.
Porejemplo,tenemosdospunterosapuntandoaunbloquecadauno:

24

Luegoseejecutat=q:
1

q
t

Luegop=q:
0

q
t

Elbloquedearribaesdescartadoyaquesucontadordereferenciasestenceroylamemoriaesliberada.
Estealgoritmoessencillo,rpidoyeficienteperotieneunproblemayesquenofuncionabienconlistascirculares.
Supongamoslosiguiente:

2
1

Observequeloselementostienenunpunterodentrodesuestructuraqueapuntaaotrodeloselementosdelalista.A
suvez,tenemosunpunteropqueapuntaaunodeloselementosyporelcuallaestructuraesaunaccesibleparael
programador.Siluegoeliminamoselpunterop,laestructuranosquedadelasiguientemanera:
1
1

25

En este momento la estructura ya no es accesible para el programa que se est ejecutando, pero sin embargo los
elementosnoseeliminandelamemoriaporquecadaunotieneunareferenciaapuntndole.Elalgoritmofallacuando
haygrafos.Estonopasaparaestructuratiporbolyaquelarazessoloapuntadaporelpunterodeusuarioysiestese
elimina,larazquedaenceroytambinseelimina.Estoocasionaeldesalojoencascadadeloselementosrestantes.

SistemaOperativoconSegmentos
Enestecaso,elsistemaoperativoleentregaalprogramaunsegmentodememoriaelcualelprogramanopuedesalir
deah.Enelcasodeloslenguajesestticos,nohayproblemasyaquealconocersecuantamemoriasenecesitasele
dajustolaquenecesitaynohaydesperdicios.ParalenguajesdeTipoAlgolyDinmicosnosesabecuantamemoria
necesitar un programa de antemano, entonces el Sistema Operativo deja que lo defina el mismo programa. Por
ejemplo, los EXEs de Windows tienen una cabecera en donde se incluye entre otras cosas el tamao de memoria
necesitadoparaejecutarelprograma.Peroelcompiladortampocopuedepredecircuantoespaciovaanecesitarpara
ejecutar,asi quenecesitaque el programador seloindique. Loscompiladorestienen una opcindonde sele puede
indicarcuantamemoriapediralSistemaOperativocuandosevayaaejecutar.Siesaopcinnoesutilizada,siempre
existeunvalorpordefectoqueelcompiladorutilizayqueesunmontobastantegeneroso,loqueimplicaquesigue
habiendoperdidadememoria(fragmentacininterna).
Existen SistemasOperativosqueentregan diferentestiposde segmentosalosprogramas (segmentos decdigo,de
datosydepila).Enesecaso,leentregaacadaprogramaunsegmentoparaelcdigo,otroparalasvariablesestticas,
otroparalapilayotroparaelHeap.Enestoscasosdesapareceelenfrentamientodeespacioentrelapilayelheap,
peroahoraestosdosvanalucharcontraeltopedelsegmento(permanecelamismaproblemtica)ysigueexistiendo
lafragmentacininterna.

SistemaOperativoconPaginacinyMemoriaVirtual
En este caso, el Sistema Operativo entrega segmentos fijos muchsimo mas grandes al programa ya que estos son
paginadosypuedenalmacenarseeneldiscosinoseutilizan.Losproblemassonlosmismosperoaltenermasespacio
difcilmentelapilayelheapsechoquen.Lafragmentacininternapodraversecomomuchomasgrandeperoelcaso
esqueaquellaspginasquenoseanaccedidasporel programavanaestarenmemoriavirtual(discorgido)conlo
cualnosedesperdicialamemoriaprincipal.Lomismoocurreconlaspginasdondehayagarbage,nosonaccedidasy
permanecen en el disco. El programador puede cometer muchas equivocaciones, generando garbage pero no es
problemayaqueestosestnmitigados.

NotasobreObjetos
Hastaahoranohablamosnadadeestetema.LosObjetostienenlamismaspropiedadesquelasvariablesencuantoa
la ubicacin y elaccesoa los mismospara lenguaje de Tipo Algol.Para lenguajes Dinmicos, se encuentranen la
tabladesmbolos.Ladiferenciaestenquemientrasunavariablesolotienedatos,elobjetotienedatosypunterosa
losmtodosqueimplementa:
Datosde
Variable

Datosde
Objeto
Mtodo1
Mtodo2
Mtodon

26

Losobjetosdelenguajesmasmodernostienenunatabladedespachocomnparainstanciasdelamismaclasedonde
seencuentranlospunterosalosmtodos:

Datosde
Objeto
ProaTabla

TabladeDespacho
Mtodo1
Mtodo2

Datosde
Objeto

Mtodon

ProaTabla

ConcurrenciayHebrasdeEjecucin

SabemosqueunSistemaOperativopuedemanejarconcurrencia,unejemplodeestoesUNIX.Tambinsabemosque
existenlenguajesqueejecutantareasconcurrentes,porejemploADA.Estasdoscuestionessonbiendiferentes,porun
ladoestlaconcurrenciaquemanejaelSistemaOperativo(tienelacapacidaddeadministrarejecucionesparalelasde
diversosprocesos)ylaquemanejaelLenguaje(poseeestructuraseinstruccionesquepuedeusarelprogramadorpara
administrar de forma paralela diversas tareas de un mismo programa). Estas cuestiones se presentan y pueden
coordinarentrelasdos.Veamoscadaunodelosambientes:

Sistema Operativo sin concurrencia / Lenguaje sin concurrencia: Obviamente, no existe la concurrencia en
estesistema.

SistemaOperativoconconcurrencia/Lenguajesinconcurrencia:Existelaconcurrenciaadministradaporel
S. O. El lenguaje cree que l solo est corriendo en el procesador mientras que el S. O. conmuta entre
procesosindependientes.

SistemaOperativosinconcurrencia/Lenguajeconconcurrencia:Existelaconcurrenciaadministradaporel
lenguaje. Este es el que implementa los mtodos de sincronizacin y lo que se conmuta es entre
procedimientosdelmismoprograma.

SistemaOperativoconconcurrencia/Lenguajecon concurrencia:Dentrodeestacategorapuededarsedos
situacionesdistintas:

o El Sistema Operativo y el Lenguaje no se conocen: Esto significa que uno no sabe que el otro es
concurrente.ExistendoscolasdeCPU,unalamanejaelS.O.(dondeseconmutaporproceso)yla
otraelLenguaje(dondeseconmutaporprocedimientodentrodelprograma).Cuandounprogramaes
seleccionadode lacola delistospara ejecutar,este es elque indica queprocedimiento es elque se
ejecutar en ese ciclo. Tambin se manejan prioridades independientes (el S.O. no reconoce
prioridades entre los procedimientos de un proceso) y de esta forma no se pueden evaluar en
conjunto.

o El Sistema Operativo y el Lenguaje se conocen: El lenguaje descansa en el S. O. para la


implementacin de la cola de listos. El S.O. conmuta entre procedimientos (hebras) del mismo

27

procesoanalizandosusprioridades.EnestepuntoesdondeelS.O.empiezaaconoceracercadelas
caractersticasdelosprocesosqueejecuta.

Teniendoconcurrencia,unprogramadejadeserlineal,conlocualunasecuenciadellamadoscomolasqueveamos
antespuedeserdelasiguientemanera:
CFM
AB
DRO
P

Conestasituacin,yanosepuedeutilizarunapilacomolaestbamosutilizandoantesporquepierdesucarcterde
LIFO.Siarmamoslapiladellamadascomolohacamosantes,seriaalgocomolosiguiente:

R.A.deO

R.A.deP

R.A.deM
R.A.deF

R.A.deR

R.A.deC

R.A.deD
R.A.deB
R.A.deA

Pararealizaresto,elcompiladoralmacenaenunsectordistintoyalejadodelamemoriaacadaregistrodeactivacin.
ConestocadapilapuedechocarconcualquierotraeinclusoconelHeap.PerorecordemosqueenS.O.conmemoria
virtualtenamosmuchoespacioenelsegmentoconlocualnodebemospreocuparnos.
Ejecutable
Pila1

Pila2

Pilan

HEAP

Pararesolverdondeponerlaspilas,elS.O.solicitaqueelprogramaseloindiqueyasuvezestealprogramador.Si
noesindicado,seubicacadapilaenlamitaddelsegmentoquelequededisponible.Esdecir,laprimerpilaadicional
vaairenlamitaddelsegmento,lasegundaenlamitaddelamitad,etc.

28

PasajedeParmetros
Sesabequecuandounaunidadinvocaaotra,lepuedeenviarparmetrosdeentradayrecibirunarespuestaluegode
laejecucin.Paraesto,launidadqueinvocaselellamaunidadllamadoraylaqueesinvocadaselellamaunidad
llamada. La unidad llamadora tiene los parmetros reales a la unidad llamada, la cual define los parmetros
formales.
Clasificacinsegnlasintaxis:
AsociacinPosicional:Cadaparmetrorealseasociaconunoformalsegnlaposicinqueocupan.Dentro
deestacategorasedividenen:
o SinFaltantes:Tienequeserunoauno,nohayfaltantes.Encadallamadoexistelamismacantidadde
parmetrosrealesquedeformales.
o Con Faltantes: Un llamado a una unidad puede no tener especificado todos los parmetros que se
definenenladeclaracinformalDentrodeestosseclasificanen:
FaltantesalFinal:Ellenguajepermitequelallamadaalafuncinnotengalamismacantidad
de parmetros en en la definicin formal pero los que falten son los que se encuentran al
final.Ejemplo:
FuncionA(a,b,c) FuncionA(intx,inty,intz,intw)
La llamada que se encuentra a la izquierda tiene tres parmetros reales mientras que la
declaracindelafuncintienecuatroformales.Elvalorquenosesuministraeseldewyel
lenguajedebeimplementaralgnmtodoparadefinirelvalordeeseparmetrocuandonoes
explicitado.
FaltantesenCualquierLugar:Ellenguajeofreceunaformadeindicarqueparmetrossonlos
queselepasaelvalorycualesno.Ejemplo:
FuncionA(_,_,3) FuncionA(intx,inty,intz)

AsociacinExplicita:Enlallamadaseindicaexplcitamentequevalorrealseasignaaqueparmetroformal.
EjemploenADA:
FuncionA(xas3,yas4) FuncionA(x,y)
Asociacin Annima: La unidad recibe una cantidad variable de parmetros a partir de algn mecanismo
implementadoporellenguaje.
EjemploenC:
intfuncionX(floatb,...)
Estafuncinpuedeserllamadapordiferentesllamadoscomoestos:
FuncionX(55,a)
FuncionX(2,3,8,4)
Unejemplodeestoeselprintf.
Ejemplo:
printf(Valores:%d,%d,a,b)

29

Losparmetrospuedentenerunvalorpordefectosiesqueenlallamadanoselepasavalor.
Ejemplo:
intFuncion(intx,inty,floatz=0.5)

Clasificacinsegnlasemntica:
Referencia:Estoconstaenqueelcompiladorselarebuscaparaquecadaunodelosparmetrosrealessean
referenciadosenelcuerpodelaunidadllamadacuandolosparmetrosformalessonutilizados.Parasermas
claros,cuandounaunidadAllamaaunaunidadB,secreaelregistrodeactivacindeBperonosereserva
lugarparalosvaloresdelosparmetrosformales,sinoquecuandolaunidadutiliceaunodeellosenrealidad
tendrunaccesoalregistrodeactivacindeAdondeseencuentranlosparmetrosreales.
Nombre:Elcompiladorreemplazalosparmetrosformalesporlosrealestextualmenteenlafuncinllamada.
EstolousaAlgolyhoydiaenlasMacro.
Copia: En este caso, en el registro de activacin de la unidad llamada existe el espacio dedicado a los
parmetrosformales.Esteseclasificaenlossiguientes:
o Copia Valor: El compilador en cada invocacin genera las instrucciones necesarias para copiar el
valordelosparmetrosrealesdentrodelespaciodealmacenamientodelosparmetrosformalesenel
registrodeactivacinllamado.Estoocurrealprincipiodelllamado.
Ejemplo:
A(a,b)B(x,y)

Elcompiladorcreaestasinstruccioneselmomentoantesderealizarelsaltoalanuevaunidad:
x=a
y=b
Call....

o Copia Resultado: Realiza exactamente lo contrario, asignando los valores resultantes sobre los
parmetrosrealesalfinalizarlaejecucindelaunidadllamada.
Ejemplo:
A(a,b)B(x,y)

Elcompiladorcreaestasinstruccioneselmomentoantesderealizarelretornoalaunidadllamadora:
a=x
b=y
Return....

o CopiaValor/Resultado:Realizaambascosas.
EllenguajeCsolotienepasajeporCopiaValoryhayquedestacarquenotienepasajeporreferencia.Estoavecesse
confundeporqueenestelenguajeloquesepermiteespasarunadireccindeunavariableporCopiaValor.Perola
direccindeesavariableseencuentraalmacenadaenelregistrodeactivacindelaunidadllamada.
EjemplodeEjecucinconDiferentesPasajes
Vamos a ejecutar mentalmente el siguiente programa escrito en un lenguaje ficticio y obtener el resultado final de
cadaunadelasvariablesinvolucradas:

30

intelem
inta(1..2)
procedurepasaje(intx)
a(1)=6
elem=2
x=x+3
endpasaje
procedureMain()
a(1)=1
a(2)=2
elem=1
pasaje(a(elem))
endMain

Por Refer encia:Alejecutarelllamadoapasaje,aestaunidadseleestpasandoladireccinfsicadelelemento1del


array.Poresodentrodelamisma,lasrefrenciasaa(1)yxdesembocanenlamismaceldadememoria,con lo
cualprimeroseleasigna6yluegoselesuma3guardndolaenelmismolugar.
Resultado:
A(1)
9

A(2)
2

Elem
2

Por Nombre:Elcompiladorgeneraelreemplazotextualdelosparmetrosquedandoasi:
procedurepasaje(intx)
a(1)=6
elem=2
a(elem)=a(elem)+3
endpasaje

Conlocual,enlatercerinstruccinutilizalacelda2delarrayyaqueenmedioselemodificaelvaloraelem.
Resultado:
A(1)
6

A(2)
5

Elem
2

Por Copia Va lor : Simplemente la x es una variable independiente que se aloja en el registro de activacin de la
unidadllamadayalaqueselecopiaelvalorpasadocomoparmetro.
Resultado:
A(1)
6

A(2)
2

Elem
2

Por Copia Va lor /Resultado:Pasalomismoqueenelanteriorconladiferenciaquealfinalizarelprocedimientoel


valordexescopiadoaladireccindelavariablequeseutilizcomoparmetrodeentrada(enestecasoa(1)).
Resultado:
A(1)
4

A(2)
2

Elem
2

31

EvolucindelPasajedeParmetros
AlprincipiocuandosecreoelcompiladordeFoltranquisieronquelospasajesdeparmetrossehaganporreferencia.
Elproblemasurgecuandoaunprocedimientoqueselepaseunaconstantecomoparmetroesteleasigneunvalora
dichoparmetro.Ejemplo:
FuncionX(8,a)

FuncionX(x,y)
....
....
....
x=6
EndFuncionX

Enelejemplovemoscomoelparmetrorealconelquesellamaalafuncinesun8mientrasquedentrodelcuerpo
delamismaseleasignaunvaloralparmetroformalx.Nohaydondeguardaresevaloryaqueelparmetrofueuna
constante.Estoprovocalaimposibilidaddepasarconstantesoexpresionesporreferencia.
Mastarde secreo Algolpero este no uso pasajeporreferencia. Lo que usofueelpasaje por nombres. Pero a este
mtodoleocurraelmismoproblema.Veamosunejemploconexpresiones:
FuncionX(b+3,a)

FuncionX(x,y)
....
....
....
x=6
EndFuncionX

Elcompiladorreemplazatextualmentelaasignacinpararesolverelllamadoyquedaasi:
FuncionX(x,y)
....
....
....
b+3=6
EndFuncionX

Nosepuederealizarlaasignacin,sigueteniendoproblemas.Poresocrearonelmtodoporcopias.
ADAesunlenguajequemanejatodosestosmtodosylohaceatravsdesusintaxis:
FuncionX(inA,inB,outC,inoutD)

Enestecasolasintaxisdirigealasemntica.

CompatibilidadyConversinentreTiposdeDatos

Cuando tenemos una asignacin a = b pueden ocurrir dos cosas diferentes dependiendo del tipo de lenguaje de
programacindondeseejecute:
Lenguaje Dinmico: la variable a pasa a ser del mismo tipo que la variable b y ambas referencian al
mismodato.
LenguajeTipoAlgol:eltipodedatodelavariablebdebetenerformadetransformarsealtipodedatodela
variablea.
De aca en mas, todo lo que digamos va a aplicar a los lenguajes de Tipo Algol. Si la sentencia anterior a = b
compila,sedicequeambostiposdedatossoncompatibles.Existendostiposdecompatibilidad:

32

Nombre:Serefiereacuandolostiposdedatossonincompatiblestansolocontenerdistintonombre.Ejemplo
enADA:
typerealesisnewfloat
A:reales
B:float

A+B Errordecompilacin

Elprogramaanteriornocompilaporquelasvariablessondedistintotipoapesarqueendefinitiva,realeses
enrealidadunfloat.
Estructura: Se refiere cuando los tipos de datos son incompatibles solo si tienen estructuras diferentes
(cantidaddebitsysignificadodelosmismos).EjemploenC:
typedeffloatreales
realesA
floatB

A+B okyseejecuta

Si bien lostiposde datos parecen ser diferentes,son compatibles porque ambostienen elmismo tamao y
cadaunodesusbitssignificanlomismo(esdecir,lamismaestructura).

Comovimos,CtienecompatibilidadporestructuramientrasqueADApornombre.PorquelosdiseadoresdeADA
lohicieronasi?Parapoderdiferenciarvaloresqueconceptualmenteseandistintos.Ej:
typedolarisnewfloat
typepesosisnewfloat
A,B:dolar
C,D:pesos
E,F:float
A=C+E
Errordecompilacin
E:=float(A+dlar(C)) Realizalastransformacionesexplcitamente,estoestpermitido

EstohaceaADApocoescribibleperomuylegible.
Existendostipodeconversionesentretipos:
Implcitas:Sonlasqueelcompiladorgeneraautomticamentecuandoaunavariabledeuntiposeleasigna
otradeuntipocompatible.
Explcita:Elprogramadorescribeestasconversionesdentrodelasexpresiones.

Notaaparte:ADAtienetiposderivados.Porejemplo:
Subtypeeurosisfloat
Subtypeedadisfloatrange0..110

Estos secomportan igualque unfloatporque esunsubtipo,se puedesumarfloatyedad. Si en medio de la


ejecucin,unavariabledetipoedadsevaderango,se arrojaunerroroutofrange.
ConversionesImplcitasenAlgol(Coerciones)
Voiding:EnAlgoles posible definiruna variable detipo Void (nulo).Estasvariablessirven paradescartar
resultadosdefunciones.EstetipodedatosnoesequivalentealpunteroaVoiddeC.

33

voidx
x:=2//Elvalornosealmacenaenningnlado
x:=Fun(2,a)//EnAlgolnosepodaignorarelretornodeunafuncinsalvoconvoid

Widening: Esta es una conversin de tipos donde el valor se ensancha. Por ejemplo, una variable int se
transformaenunreal.
reala
intb
a:=2//Lasdoslneascontienenwidening
a:=b

Rowing:diferentesautoresdicendistintascosasacercadeestetipodeconversin,perovamosaexplicaruna
deellas.LosarreglosenAlgolsellamanrows,yconstadelaasignacindeunvaloralarreglodemaneraque
todosloselementosdelarregloseinicialicencondichovalor.
[4:20]intz
z:=4
//todosloselementosdezadquierenelvalor4

Uniting:UnauninenAlgolesunavariablequepuedetenermasdeuntipo.Ejemplo:
union(int,real)w

Supongamos que los int ocupan2bytes y los real 4 bytes, entonces la estructuraw ocupar al menos 5
bytes.Estosedebeaquelaestructuratieneespacioparaguardarelmasgrandedelosvaloresyunbytemas
paraindicarquetipoestguardandoacadamomento.Esecamposellamadiscriminante.
w:=4

Conestaasignacinlaestructuratomarelvalor4coneltipodedatoint.Estosignificaqueelvalorocupar
2bytes,dejandootros2bytessinusoyeldiscriminanteindicarqueseestalmacenandounint.
w:=6.5

Estotambinesvlidoyconestaasignacinlaestructuratomarelvalor6.5coneltipodedatoreal.Esto
significa que el valor ocupar los 4 bytes del campo de valor y el discriminante indicar que se est
almacenandounreal.
ConestoellenguajeproveeciertodinamismoentipodevariablesenunlenguajetipoAlgolperoesostipos
estnsujetosalosquesedefinienladeclaracin.
Peroexisteunproblemacuandoseutilizaunavariabledeestetipoaladerechaenunaasignacin:
intz
union(int,real)w
...
z:=w

Esto no compila porque el compilador no puede asegurar que w tenga el tipo int en ese momento para
asignrseloaz.Parasolucionarestetemaseinventelconceptodeclusuladeconformidad.Estaesuna
estructuradedecisinqueseejecutaconsultandoeldiscriminanteenlavariabledeunin.Ej:
casewin:
whenwint:z:=3*w+h
whenwreal:m:=7.1*w
esac

34

Dependiendodeltipo devalorse ejecuta una delasasignaciones o cualquier otra instruccin queseponga


bajo la clusula When. De esta forma el compilador acepta la asignacin y asi Algol asegura que las
unionessonseguras.

Desproceduring:Paraveresteconceptoprimerodebemosexplicarlosiguiente.Ejemplo:
procxx(...)...
procyy(...)...

Puedodeclararunprocedimientosinindicarsusinstrucciones:
proctmp

Entonces,puedohacerlossiguiente:
tmp:=xx//Elprocesostmpahoraeselmismoquexx

Enestemomentosiinvocoatmpelprocesoqueseejecutaeseldeclaradoenxx.Tambinpuedohacer:
xx:=yy
yy:=tmp

Estoseimplementadefiniendoatodoslosprocedimientoscomounpunteroalasinstrucciones.Estosehizo
asi porque siempre se busc hacer programas genricos. En C se hizo lo mismo pero con los punteros a
funciones.Estoeslanocininicialdeloquedespusfuelaherenciaenprogramacinorientadaaobjetos.
Cuandoenlaasignacintengounprocedimientoaladerechayunavariablenumricaalaizquierda,envez
de asignar el procedimiento a otra variable, este se ejecuta y retorna un valor. La accin de ejecutar el
procedimientoenvezderetornarsudireccinsellamaDesproceduring.Ejemplo:
inta
a:=xx(...)

Losprocedimientosseejecutansitienenunavariablealaizquierdadelaasignacin.

Desreferencing: Para ver este concepto primero debemos explicar lo siguiente. Vamos a declarar las
siguientesvariablesenAlgol:
inta
intb
refintc
refintd
refrefinte
refrefintf

Enelcdigoanteriorsedeclarandosvariablesdetipoint,dosvariablesquesonunpunteroaunintyotras
dosque son unpunteroa unpunteroaunint.Acavemos el mismocdigo peroen lenguaje Cparaque se
entiendamejor:
inta
intb
int*c
int*d
int**e
int**f

Grficamentesepuederepresentarlasvariablesanterioresdelasiguientemanera:

35

int

int

refint

int

refint

int

refrefint

refint

int

refrefint

refint

int

Algol definequecada variablerepresenta ladireccindonde se encuentraeldato.Como vemos, a y b


apuntan directamente al dato en memoria, es decir, para referenciar su valor el programa realiza una sola
bsquedaenmemoriaparaobtenerlo.Enelcasodecyd,lasvariablesrepresentanladireccindeuna
celdadememoriaquecontieneladireccindeldatofinal.Paraobtenerdichovalor,elprogramarealizados
accesosamemoria,primeroparabuscarelvalordelpunteroyconesevalorrealizaunsegundoaccesopara
obtenereldato.Lasvariableseyfsonpunterosapunterosdeint,asiquerealizantresaccesosamemoria
paraobtenereldato.
Algol tiene la particularidad de definir que en una asignacin, la parte derecha debe rebuscrsela para
devolvereltipodevalorqueestsolicitandolaparteizquierda.Porejemplo,sitenemosa:=...loquehaya
aladerechadebedevolverunint,sitenemosc:=....debedevolverunareferenciaaintysitenemose:=
...debedevolverunareferenciaaunareferenciadeint.
Veamosejemplos:
o Asignacionesqueesperantipoint:
Enestasasignacioneslavariablealaizquierdaesadetipoint,estosignificaqueelvaloresperado
esunvalordetipoint.
a:=b
Comobqueestalaizquierdatambinesunint,loquehaceelcompiladoresbuscaren
memoriaelvalorde byasignrselo a lavariablea. Se dicequeesta asignacinhace1
desrefer encingporqueparaobtenerelvalordebhaceunabsquedaenmemoria(besla
direccindedichovalor).Notequeelaccesoamemoriaparaguardarenvalorenanoes
tenidoencuenta.
a:=c
Lavariablecesunpunteroaunint.Entonces,comoselepideunvalordeintloquehaceel
compiladoresbuscarenmemorialareferenciayluegoconellabuscarelvalordefinitivode
tipoint.Estohacedosaccesosamemoriaporlotantosedicequehay 2desr efer encing.
a:=e
Delamismaformaqueelanterior,sesolicitaunintylanicaformaconeesrealizarlos
tresaccesosamemoriaquenosllevanaencontrardichovalor.Hace3desr eferencing
o Asignacionesqueesperanunadireccinauntipoint:
En estas asignaciones la variable a la izquierda es c de tipo ref int, esto significa que el valor
esperadoesunadireccinquecontengaunvalordetipoint.
c:=a
HabamosdichoqueenAlgollasvariablesrepresentanlaspropiasdireccionesenmemoriade
susvalores.Enestaasignacin,comocesperaporunadireccindeunint,esadireccinya
estembebidaenaconlocualnonecesitairamemoriaparabuscarladireccindelvalor.
Porlotantonohaydesrefer encing.

36

c:=d
Lavariabled contieneun puntero a int. Paraobtener su valor sedebeaccederamemoria
conlocualserealiza1desr efer encing.
c:=e
Lavariableecontieneunpunteroaunpunteroaint.Comosoloseesperaunpunteroaint,
el compilador lo quehace esprimero acceder a memoria paraobtenerel primerpunterode
e el cual contiene la direccin de otro puntero y al cual accede para obtener su valor y
devolverloac.Sondosaccesosamemoria,conlocualhay 2desr efer encing.
o Asignacionesqueesperanunadireccindeunadireccinauntipoint:
Enestasasignaciones la variableala izquierda ese de tipo ref refint,esto significa que el valor
esperadoesunadireccinquecontengaladireccindeunvalordetipoint.
e:=a
Esta asignacin es imposible y arroja error de compilacin. Esto se debe a quea es una
direccindeunintynohayformadedevolverleunpunteroapunterodeint.
e:=c
En este caso, la variable c en el cdigo ya es la direccin de una celda que contiene un
punteroaint.Conlocual,siledamosaeesamismadireccinquecontienelavariablec
encajaperfectoenloquepide.Porlotantonohaydesrefer encing.
e:=f
Seaccedeamemoriaunavezparaobtenerelvalorquecontieneladireccinapuntadaporla
variablefyseloasignaene.Hace 1desr efer encing.
La idea de Algol era matar la diferencia entre la direccin de un valor y el contenido del mismo. Esto dio
confusinalosprogramadores.ApartirdeAlgolloslenguajesmodernostienenundesreferencingimplcito.
Porejemplo,escribamoslasmismasasignacionesenlenguajeC:
o Asignacionesqueesperantipoint:
a=b
1desr eferencing
a=*c
2desr eferencing.
a=**e
3desr eferencing
o Asignacionesqueesperanunadireccinauntipoint:
c=&a
Nohaydesr efer encing
c=d
1desr eferencing
c=*e
2desr eferencing.
o Asignacionesqueesperanunadireccindeunadireccinauntipoint:

37

e=&c
Nohaydesr efer encing
e=f
1desr eferencing
El operador & suprime el desreferencing implcito en C. Por ejemplo, en la asignacin c = &a si no
agregamoseloperador,elcompiladorloqueharaesbuscarelvalorquecontienelavariableaenvezde
darlesudireccinac.Algoparecidoocurreconlosoperadores*quesonnecesariosincluirlosparaagregar
desreferencingalaasignacinademsdelqueyaserealizaimplcito.
Valeaclararquetodo estoesasiporqueellenguaje Cno construye automticamente las instruccionespara
queelvalordevueltoenlapartederechadelaasignacinencajeconlaparteizquierdacomopasaenAlgol.
Uncasoparticular:Sitengo lavariableedelejemplo yquieroalterar laceldaqueapuntadirectamenteal
valorint:
e

refrefint

refint

int

Quieromodificaresta

Deboponerlosiguiente:
(refint)e:=....

Estohacequeseomitaundesreferecing.EstaoperacinesllamadaCASTINGenAlgol(peronoeslomismo
queelcastingdelenguajeC).

ControldePrecisin
Elresultadodeciertasexpresionesdeunprograma puedendependerdelaformaquetieneelmismoderepresentarlos
valoresdecomaflotante.Ejemplo:
floatx
x:=0.1
if(x*10.0==1.0)
thenprintQuebien!
elseprintQuemal!

Para saber que es lo que se imprime en pantalla al ejecutar el programa se debe saber el tipo de aritmtica del
lenguaje.Existendosformasdeestructurarundatoencomaflotante:IEEEyBCD.EnlenguajeC,sepuedecompilar
conlabibliotecaSTDLIB(utilizaIEEE)yelresultadodelprogramadaraquemal,mientrasquesisecompilacon
CBDLIB (utiliza BCD) muestra que bien. En Pascal siempre se utiliza IEEE por lo tanto devuelve Que mal.
Vemoslosformatos:
IEEE:Eldatotienevarioscampos:signo,mantisayexponente.Ensimpleprecisintiene32bits(1designo,
23demantisay8deexponente.Endobleprecisinson64bits(1designo,52demantisay11deexponente).
Esteformatoesaptopararealizaroperacionesmatemticasrpidasyescompactoperotieneunproblema,al
ser una representacin binaria existen ciertos nmeros que son peridicos pero en decimal no lo son. Por
ejemplo,endecimal el0.1esexactoyenbinarioese mismonmero esperidico.Poreso,enelcdigode
ejemplo,cuandoserealizalaoperacinx*10.0,altener0.1estonodaexactosinounnmeroperidico
quealcompararsecon1.0alprogramaleresultadistinto.
BCD:DelassiglasBinaryCodeDecimal,esteformatotienelaparticularidaddeguardarcadadgitodecimal
concuatrobits.Porejemplo,elvalor13.6enBCDestarepresentadoporlasiguientecadenadebits:

38

00010011.0110
Estohacequeelformatorepresentefielmentelosnmerosdecimalesyaqueel0.1noesperidico,sinouna
fiel representacindel mismo. La contrade estoesque los valores ocupan mas espacio dealmacenamiento
(simplede32bitsydoblede80bits)yquelasoperacionesmatemticassonmuchomaslentas.
Para profundizar sobre IEEE decimos por ejemplo que 5 * 1/5 no nos d 1 como pensamos, porque el 1/5 es
peridicoenbinario.
Algunoslenguajesylosformatos:
CobolusaBCDporquenecesitaexactitud.
FortranusunPreIEEE.
Cusaambas.
PascalusaunaIEEE.
ADAusaambasperodirigidoporlasintaxis.Ejemplo:
typePesosisnewfloatdelta0.01
EstoindicaqueelfloatsemanejaconBCDcon2dgitosaladerechadelacoma.Esdecir,elvalor
12.30y12.31soncontinuosinmediatos,noexistenadaentreellos.
typePesos2isnewfloatdelta0.001
A:Pesos
B:Pesos2
A=A+Pesos(B)/B=B+Pesos2(A)
Tengoqueconvertirparasumar.
Sinopongolodedelta,elfloatsemanejaenIEEE.

BNF
BackusNormForm esun lenguajededefinicindesintaxisdelenguajes(un meta lenguaje).En1957Backuscreo
FoltranyusoBNFparacrearlo.DesdeesemomentoloslenguajessedefinenutilizandoBNF.
ElementosutilizadosparadefinirunlenguajeenBNF:
FlechadeDefinicin():Lafechaaladerechasignificaestadefinidocomo.Seusadelasiguientemanera:
ABdondeAeselobjetoqueestadefiniendo,yBescomosedefineeseobjeto.
Entidades No Terminales: < y > son caracteres que encierran entidades No Terminales. Por ejemplo, esto es una
entidad no terminal: <ASIGNACION>. Todas las entidades no terminales necesitan ser definidas por medio de la
flechadedefinicinquevimosenelitemanterior.
EntidadesTerminales:Sonlossmbolosdelalfabeto.NodebenserdefinidospormediodellenguajeBNF.Ejemplos
deelementosterminalessonelpunto,lacoma,laletraa,todoslosdgitos,etc.
Podemosusarel|(pipe)parasimplificarvariasreglasquedefinenalamismaentidadnoterminal.

VamosadarunejemplodeunasentenciaBNFquedefineuntokenvlido:
<DIGITO>0|...|9
<LETRA>a|...|z
<VARIABLE><LETRA>|<VARIABLE><LETRA>|<VARIABLE><DIGITO>

39

Conestasreglasloquequeremoshaceresdefinirqueunavariablepuedeserrepresentadaporunaseguidilladeletras
ydgitosperoconlarestriccindequenopuedecomenzarconundgito.
LaprimerregladefinealaentidadnoterminalDIGITOcomocualquieradelosdgitosdel0al9(estassonentidades
terminalesynonecesitamosdefinirlas).
LasegundaregladefinealaentidadnoterminalLETRAcomocualquieradelasletrasdelaaalazminsculas
(estassonentidadesterminalesynonecesitamosdefinirlas).
Con laltima regla(que en realidad son tres reglas separadas por pipes que definen la misma cosa) definimos a la
entidadnoTerminalVARIABLE.Enelprimer casonosdicequeunavariablepuedesersimplementeunaletra.En
los otros dos casos nos dice que una variable puede ser lo que conocemos como variable y adems una letra o un
dgitofinal.Estonosdaunaideadeanidamientoentrereglas.Porejemplo:
Veamossilavariablenum4esvlida:
Lanesuna<LETRA>,asiqueporahoratenemos:
<LETRA>um4
Una<LETRA>esuna<VARIABLE>segndicelatercerregla,asiquetenemos:
<VARIABLE>um4
Si tomamos <VARIABLE>u por la cuarta regla sabemos que una <VARIABLE> es tambin una
<VARIABLE><LETRA>,ycomouesuna<LETRA>entoncesnosquedalosiguiente:
<VARIABLE>m4
Sirepetimoslaoperacinanteriorperocon<VARIABLE>m,tenemoslosiguiente:
<VARIABLE>4
Y la ltima regla nos dice que <VARIABLE><DIGITO> tambin es una <VARIABLE> asi que, como 4 es un
<DIGITO>nosquedalaentidadnoTerminalcomoresultado:
<VARIABLE>

Pudimospartirdeltextooriginalyverificamosqueesetextorepresentaalaentidad<VARIABLE>dentrodenuestro
lenguajedefinidoporlasreglasanteriormentevistas.Estetextoentoncesesvlidodentrodenuestroprograma.
Veamossilavariable 8yesvlida:
El8esun<DIGITO>asiquetenemos:
<DIGITO>y
Comoyesuna<LETRA>tenemos:
<DIGITO><LETRA>
Nohayreglaquedefinamasqueesto,asiquenopudimosllegaraladefinicinde<VARIABLE>porlotanto8y
noesunavariablevlidaparanuestrolenguaje.
Arboldeparsing:Esunaestructuraqueserealizaparacomprobarsiunaexpresinestacorrectamenteescritasegn
lasreglasBNFdadas,esdecir,seutilizaparaquedadounprogramaescritoendeterminadolenguajeylasreglasBNF
quecomponensusintaxis,podersabersielprogramaesvlidoono.

Ejemploderboldeparsing:
BNF:
1.
2.
3.
4.

<EXPRESION><EXPRESION>+<TERMINO>
<EXPRESION><TERMINO>
<TERMINO><TERMINO>*<FACTOR>
<TERMINO><FACTOR>

40

5. <FACTOR><VARIABLE>
6. <FACTOR><CONSTANTE>
7. <VARIABLE><VARIABLE><DIGITO>
8. <VARIABLE><VARIABLE><LETRA>
9. <VARIABLE><LETRA>
10. <CONSTANTE><CONSTANTE><DIGITO>
11. <CONSTATE><DIGITO>
12. <DIGITO>0|...|9
13. <LETRA>a|...|z
Teniendoestasreglas,hacemoselrboldeparsingparaverificarsilasiguienteexpresinesvalidadentrodenuestro
lenguaje: va+58*r 2+p*3

<EXPRESION>
regla1
<EXPRESION>
regla1
<EXPRESION><TERMINO><TERMINO>
regla2regla3regla3
<TERMINO><TERMINO><TERMINO>
regla4regla4regla4
<FACTOR><FACTOR><FACTOR><FACTOR><FACTOR>
regla5

regla6regla5regla5regla6

<VARIABLE><CONSTANTE><VARIABLE>
regla8regla10regla7
<VARIABLE><CONSTANTE>

<VARIABLE><VARIABLE><CONSTANTE>

regla9regla11regla9regla9regla11
<LETRA><LETRA><DIGITO><DIGITO><LETRA><DIGITO><LETRA><DIGITO>
regla13regla12regla13regla12regla13regla12
va+58*r2+p*3

Elrbolseleedeabajohaciaarriba,cadaelementosevatransformandoenotraentidadnoterminalpormediodela
aplicacin de diferentes reglas hasta llegar a ser una expresin. Como pudimos llegar a <EXPRESION> entonces
sabemosquelasintaxisdeltextodelejemplo,segnelconjuntodereglasBNFdadas,efectivamenteesunaexpresin
bienescrita. Este rbolde parsinges ascendente, estoquiere decirque separte del texto a verificar yse llega a la
entidad Terminal que agrupa todo los conceptos (en este caso <EXPRESION>). A este terminal se lo llama
ENTIDADPRIVILEGIDADAoDISTINGUIDA.
Elrboldeparsingdescendenteencambio, comienzadesdelaentidadprivilegiadaysedesarrollahastaobtenerlas
entidades terminales que componen el texto a verificar. Si hiciramos este rbol para el ejemplo anterior,
comenzaramos escribiendo en lo masaltola entidad <EXPRESION>eiramosaplicandolasmismasreglas desde
arribahaciaabajohastapoderobtenerlaexpresinqueestamosverificandoenelejemplo.
SibienelprincipalobjetivodeBNFesdeterminarsiunprogramaestabienomalescritosegnunasintaxis,tambin
esutilizadoalahoraderesolverelcdigodellenguajeenlasinstruccionesresultantes.Veamosunejemplodeesto.
Tenemoslasiguienteexpresin:2+7*3.Sihacemosprimerolasuma,elvalorresultanteseria27,mientrasquesi
realizamosprimerolamultiplicacinelresultadoes23.

41

SupongamoslasiguienteBNF:

1.
2.
3.
4.
5.
6.

<EXPRESION><EXPRESION>+<TERMINO>
<EXPRESION><EXPRESION> <TERMINO>
<EXPRESION><EXPRESION>*<TERMINO>
<EXPRESION><EXPRESION>/<TERMINO>
<EXPRESION><TERMINO>
<TERMINO><VARIABLE>|<CONSTANTE>

7. .....(paraestamuestrasimplificamosladefinicinde<VARIABLE>y<CONSTANTE>quesonlasmismas
queyamostramosperodebenestarsiempre.Vamosasimplificarlotambinenelrbol).
Hacemoselrboldeparsingparaelejemplo:

<EXPRESION>
regla3
<EXPRESION>
regla1
<EXPRESION>
regla5
<TERMINO><TERMINO><TERMINO>
regla6regla6regla6
2

Comopodemosapreciar,laformulaesefectivamenteunaexpresin.Observeelmomentoqueaplicamoslaregla1,en
esa reglaestamos obteniendo el resultado de2 + 7. Esto es,el compilador genera lasinstrucciones necesariaspara
realizarlasumaantesquelamultiplicacin.ConlaBNFutilizada,tantoeloperadordesuma,resta,multiplicaciny
divisintienenlamismaprecedencia.Entonces,altenerlamisma,seresuelvedeizquierdaaderecha.
Ahora,veamosotraBNFaplicadaalamismaformula:
1. <EXPRESION><EXPRESION>+<TERMINO>
2. <EXPRESION><EXPRESION> <TERMINO>
3. <EXPRESION><TERMINO>
4. <TERMINO><TERMINO>*<FACTOR>
5. <TERMINO><TERMINO>/<FACTOR>
6. <TERMINO><FACTOR>
7. <FACTOR><VARIABLE>|<CONSTANTE>
8. ...
Yhacemoselrboldeparsing:
<EXPRESION>
regla1
<EXPRESION><TERMINO>
regla3regla4
<TERMINO><TERMINO>
regla6regla6
<FACTOR><FACTOR><FACTOR>
regla7regla7regla7
2

42

Al momentode aplicar la regla 4 elcompiladorgenera las instrucciones necesarias para ejecutar lamultiplicacin.
Estaserealizaantesquelasumaapesardequeseencuentramasaladerecha.Aestoselellamaqueeloperadorde
multiplicacintienemasprecedenciaqueeldelasumayvienedadoporlaBNF.Siobservamosestaltima,notamos
quelamultiplicacinyladivisinestnunnivelmasabajoquelasumaylaresta.
Lomismo ocurre con los operadoreslgicos(AND, OR, etc) y los operadores decomparacin (<, >,<=,>=,etc).
Paracontemplarlos,agregamoslassiguientesreglasdeBNFalaanteriorquevimos:
<CONDICION><CONDICION>and<EXPRESION_LOGICA>
<CONDICION><CONDICION>or<EXPRESION_LOGICA>
<CONDICION><EXPRESION_LOGICA>
<EXPRESION_LOGICA><EXPRESION><COMPARADOR><EXPRESION>
<COMPARADOR>==|<=|<|>=|>|!=
Vemoscomo la comparacin deexpresionesest unnivelmas bajoqueel uso delosoperadores lgicos andyor.
Hagamoselrboldeparsingdeunacondicin:
<CONDICION>
<EXPRESION_LOGICA><EXPRESION_LOGICA>
<EXPRESION>
<EXPRESION><EXPRESION><EXPRESION><EXPRESION>
<TERMINO><TERMINO><TERMINO><TERMINO><TERMINO>
<FACTOR><FACTOR><COMPARADOR><FACTOR><FACTOR><COMPARADOR><FACTOR>
2

>

1and5

<8

Deestaforma,seejecutanprimerolasexpresiones(2+2),luegoseejecutalasexpresioneslgicas(4>15<8)ya
ambosresultadosselosprocesacomocondicin(trueandtrue=true).

Dijimosanteriormentequecuandolosoperadoresaritmticostenanlamismaprecedencia,lascuentasseresolvande
izquierdaaderecha.Tambinsabemosqueresolver lacuenta4/2/2deizquierdaaderecharetornaelresultado1
mientras que hacerlo de derecha a izquierda es 4. De que depende que el compilador resuelva las cuentas en un
determinadosentido?
SupongamoslasiguienteBNF:

1. <TERMINO><TERMINO>*<FACTOR>
2. <TERMINO><TERMINO>/<FACTOR>
3. <TERMINO><FACTOR>
4. <FACTOR><VARIABLE>|<CONSTANTE>
5. ...
hacemoselrboldeparcing:
<TERMINO>
<TERMINO>
<TERMINO>
<FACTOR><FACTOR><FACTOR>
<CONSTANTE><CONSTANTE><CONSTANTE>
2

43

Como podemos ver, la primer divisin que se resuelve es 2 / 2. Esto en realidad es porque tuvimos que llevar el
desarrollo del rbol por el lado izquierdo para que nos quede lo siguiente: <TERMINO> / <FACTOR> (en ese
orden).
AhorasupongamosotraBNF:

5. <TERMINO><FACTOR>*<TERMINO>
6. <TERMINO><FACTOR>/<TERMINO>
7. <TERMINO><FACTOR>
8. <FACTOR><VARIABLE>|<CONSTANTE>
5. ...
hacemoselrboldeparcing:
<TERMINO>

<TERMINO>
<TERMINO>
<FACTOR><FACTOR><FACTOR>
<CONSTANTE><CONSTANTE><CONSTANTE>
2

Ahora vemos lo contrario! Se resuelve primero la divisin 2 /4. Esto es porque necesitamos llevar el rbol a una
expresin como la siguiente: <FACTOR> / <TERMINO>. Si procediramos a convertir el lado izquierdo en
<TERMINO> nunca podramos avanzar ya que no hay regla que contemple un <TERMINO> y un signo / a su
derecha.ConestosejemplosestamosviendocomolaBNFinfluyeenelsentidoenelqueseresuelvenlasoperaciones
aritmticas.
Estoltimoquevimosobviamentetambinseaplicaalasumayalaresta,yacualquierparogrupodeoperadores
con la misma precedencia. De hecho, podemos hacer una BNF que resuelva las operaciones de multiplicacin y
divisin de izquierda a derecha y al mismo tiempo que resuelva las operaciones de suma y resta de derecha a
izquierdaenunnivelmayor.
Paraterminar,vamosaincluiralosparntesisennuestraBNF.Veamosestasreglas:
1. <EXPRESION><EXPRESION>+<TERMINO>
2. <EXPRESION><EXPRESION> <TERMINO>

3. <EXPRESION><TERMINO>
4. <TERMINO><TERMINO>*<FACTOR>
5. <TERMINO><TERMINO>/<FACTOR>
6. <TERMINO><FACTOR>
7. <FACTOR><VARIABLE>|<CONSTANTE>
8. <FACTOR><PARENTESIS_ABRE><EXPRESION><PARENTESIS_CIERRA>
9. <PAR_ABRE>(
10. <PAR_CIERRA>)
Comovemos,lasreglas8,9y10nuncalashabamosvisto.Loqueestamoshaciendoesagregndoleunadefinicin
masalaentidad<FACTOR>.Estareglaloquehaceesponercomocontenidodelparntesisunaexpresinytodolo
queelloimplica.Estosignificaqueunaexpresincomplejaentreparntesispuedeserunfactorparaotraoperacin
fueradelossignosdeparntesis.Veamosunejemplorpido:

44

<EXPRESION>
<TERMINO>

<TERMINO>

<FACTOR>

<EXPRESION>
<EXPRESION>
<TERMINO><TERMINO>
<PAR_ABRE><FACTOR><FACTOR><PAR_CIERRA><FACTOR>
(2

La resolucin demuestra que para poder absorber los parntesis con una regla se debe primero resolver lo que se
encuentraentreestosdossmbolosparaqueseauna<EXPRESION>.Unavezquesetieneresueltalaparteinterior,
esto genera un <FACTOR> y todo vuelve a comenzar desde el nivel inferior de anidacin. Gracias a esto, el
compilador resuelve primerola formula matemtica quese encuentra dentrode los parntesis(que esunasuma) y
dejaparaelfinallamultiplicacin(cuandonormalmente,sinoestuvieranlosparntesis,loprimeroqueresolveraes
estaltimaoperacin).

45

También podría gustarte