Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
16
(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)
HEAP
R.A.
var
Descriptor
Variablesemiesttica
Variabledinmicac/nombre
RecordemosqueelHEAPseencuentraenelmismobloquequelosregistrosdeactivacin.
Ejecutable
Registrosde
Activacin
HEAP
EnlenguajeC,soloexistenvariablessemiestticasydinmicasannimas.EnADAsoloexistenvariables
semiestticas,dinmicasannimasyvariablessemidinmicas.
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.
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
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
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
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
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
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