Sei sulla pagina 1di 71

1

Sintaxis y Semntica del Lenguaje - 2010


Sintaxis y Semntica de los
Lenguajes de Programacin
Introduccin a la
Semntica de los
Lenguajes de Programacin
Sintaxis y Semntica del Lenguaje - 2010
Sintaxis y Semntica del Lenguaje
Bibliografa
Programming language concepts
Third edition
Carlo Ghezzi & Mehdi Jazayeri
John Wiley & Sons
1997
2
Sintaxis y Semntica del Lenguaje - 2010
Sintaxis y Semntica del Lenguaje
1 Introduccin
2 Autmata Finito
3 Expresiones Regulares
4 Gramticas Independientes del Contexto
5 Autmatas a Pila
6 Mquina de Turing
7 Semntica
Introduccin a la semntica de los LP.
Binding.
Variables.
Unidades de programas.
Clasificacin de los LP.
Mtodo operacional.
Pasaje de Parmetros.
Sintaxis y Semntica del Lenguaje - 2010
Lenguajes de Programacin
Un lenguaje de programacin (LP) es una notacin
formal para describir algoritmos ejecutables por una
computadora
Un LP posee dos componentes:
Sintaxis
Conjunto de reglas formales que especifican la composicin de
programas a partir de ciertas unidades de construccin
(Caracteres)
Semntica
Especifica el significado de un programa sintcticamente vlido
escrito en el lenguaje
Ghezzi & Jazayeri, 1997
3
Sintaxis y Semntica del Lenguaje - 2010
Introduccin a Semntica
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
Es vlido este programa?
Qu significa?
Cmo hace un compilador para sabe cmo traducir el programa?
Todo LP debe ser definido con el suficiente nivel de detalle para poder
determinar.
Si un programa es vlido (Sintaxis)
Si el programa es vlido, cul es su significado o efecto? (Semntica)
La semntica del LP
(C) nos indica que se
reserva espacio para
un elemento entero
para una variable
denominada i
Significa que se debe
evaluar la expresin i != j,
mientras que esta
expresin sea verdadera
se ejecuta el comando
que lo sucede (if)
Sintaxis y Semntica del Lenguaje - 2010
Binding
Los programas trabajan con entidades
variables,
subprogramas,
sentencias, ...
Estas entidades tienen ciertas propiedades (atributos)
Ejemplo:
una variable tiene:
un nombre, un tipo, un rea de almacenamiento donde se mantiene
su valor
un subprograma tiene:
un nombre, parmetros formales de un cierto tipo, ciertas
convenciones de paso de parmetros
una sentencia tiene:
acciones
Los valores de estos atributos se deben especificar antes de
que la entidad sea procesada Binding
4
Sintaxis y Semntica del Lenguaje - 2010
Binding
Los lenguajes de programacin difieren en:
el nmero de entidades con las cuales pueden trabajar
en el nmero de atributos que se pueden otorgar a las entidades
en el momento en el cual se realiza al binding
Los atributos pueden ser ligados en:
tiempo de definicin/implementacin del lenguaje
tiempo de traduccin (compilacin) del programa
tiempo de ejecucin (run-time) del programa
Sintaxis y Semntica del Lenguaje - 2010
Binding
Los lenguajes de programacin difieren en:
el nmero de entidades con las cuales pueden trabajar
en el nmero de atributos que se pueden otorgar a las entidades
en el momento en el cual se realiza al binding
Los atributos pueden ser ligados en:
tiempo de definicin/implementacin del lenguaje
tiempo de traduccin (compilacin) del programa
tiempo de ejecucin (run-time) del programa
Por ejemplo, en Ada FORTRAN, C, C++, el tipo INTEGER es
asociado en tiempo de definicin e implementacin del lenguaje:
la definicin del lenguaje establece que el tipo INTEGER debe ser
soportado y la implementacin del lenguaje determina el conjunto
de valores que el tipo INTEGER podr contener
5
Sintaxis y Semntica del Lenguaje - 2010
Binding
Los lenguajes de programacin difieren en:
el nmero de entidades con las cuales pueden trabajar
en el nmero de atributos que se pueden otorgar a las entidades
en el momento en el cual se realiza al binding
Los atributos pueden ser ligados en:
tiempo de definicin/implementacin del lenguaje
tiempo de traduccin (compilacin) del programa
tiempo de ejecucin (run-time) del programa
PASCAL provee una definicin del tipo INTEGER, pero permite
al programador redefinirlo:
el tipo INTEGER es ligado a su representacin en tiempo de
implementacin, pero este enlace se puede modificar en tiempo de
compilacin
Sintaxis y Semntica del Lenguaje - 2010
Binding
Los lenguajes de programacin difieren en:
el nmero de entidades con las cuales pueden trabajar
en el nmero de atributos que se pueden otorgar a las entidades
en el momento en el cual se realiza al binding
Los atributos pueden ser ligados en:
tiempo de definicin/implementacin del lenguaje
tiempo de traduccin (compilacin) del programa
tiempo de ejecucin (run-time) del programa
En la mayora de los lenguajes de programacin las variables
son ligadas a su valor en tiempo de ejecucin, y el binding se
puede modificar durante la ejecucin
6
Sintaxis y Semntica del Lenguaje - 2010
Binding
Los lenguajes de programacin difieren en:
el nmero de entidades con las cuales pueden trabajar
en el nmero de atributos que se pueden otorgar a las entidades
en el momento en el cual se realiza al binding
Los atributos pueden ser ligados en:
tiempo de definicin/implementacin del lenguaje
tiempo de traduccin (compilacin) del programa
tiempo de ejecucin (run-time) del programa
Se dice que un binding es
esttico (static) si est establecido antes del momento de la ejecucin
del programa y no puede modificarse ms tarde
dinmico (dynamic) si se establece en tiempo de ejecucin y puede
modificarse de acuerdo a algunas reglas especificadas por el lenguaje
Sintaxis y Semntica del Lenguaje - 2010
Variables
Las computadoras convencionales estn basadas en la nocin de
una memoria principal consistente de celdas elementales, cada una
de las cuales se identifica por su direccin
Los contenidos de una celda conforman su valor
El valor de una celda puede ser ledo y/o modificado
La modificacin implica el reemplazo de un valor con un nuevo valor
Muchos lenguajes de programacin pueden ser vistos como
abstracciones del comportamiento de tales computadoras
convencionales (basados en asignacin)
introducen:
el concepto de variables como una abstraccin de la nocin de las celdas
de memoria
el concepto de sentencias de asignacin como una abstraccin de la
modificacin destructiva de una celda
7
Sintaxis y Semntica del Lenguaje - 2010
Variables
Una variable est caracterizada por una 5-tupla:
<nombre, mbito, tipo, l-value, valor(r-value)>
El nombre es usado para identificar y referirse a las
variables.
Algunos lenguajes permiten que las variables no tengan
nombres (variables annimas)
El nombre de una variable se introduce por medio de una
sentencia especial denominada declaracin
Sintaxis y Semntica del Lenguaje - 2010
Ambito de una Variable
El mbito de una variable es el rango de instrucciones
del programa, dentro del cual la variable es conocida, y
manipulable.
conjunto de instrucciones donde se conoce su nombre
Una variable es visible dentro de su mbito, e invisible
fuera de l.
Las variables pueden ligarse a un mbito en forma
dinmica o esttica.
8
Sintaxis y Semntica del Lenguaje - 2010
Ambito de una Variable
#include <stdio.h>
main() {
int x, y;
scanf(%d %d`, &x, &y);
{
int temp;
temp = x;
x= y;
y= temp;
}
printf(%d %d, x, y);
}
la declaracin de x, y las hace visibles a
travs del programa main
la declaracin de temp la hace visible en el
bloque interno e invisible fuera de l
Bloque interno
Sintaxis y Semntica del Lenguaje - 2010
Ambito de una Variable
El binding esttico de mbito, define el mbito de una
variable en trminos de la estructura lxica de un
programa
Cada referencia a una variable se asocia (de manera esttica) a
una declaracin de variable particular (implcita o explcita)
examinando el texto del programa, sin ejecutarlo.
Las reglas de mbito esttico son
adoptadas por la mayora de los
lenguajes tradicionales como C.
#include <stdio.h>
main() {
int x, y;
scanf(%d %d`, &x, &y);
{
int temp;
temp = x;
x= y;
y= temp;
}
printf(%d %d, x, y);
}
9
Sintaxis y Semntica del Lenguaje - 2010
Ambito de una Variable
El binding dinmico de mbito, define el mbito de una
variable en trminos de la ejecucin de un programa
Generalmente, cada declaracin de una variable extiende sus
efectos sobre todas las instrucciones ejecutadas a partir de la
declaracin, hasta que se declare nuevamente la variable (con
el mismo nombre)
{
/* bloque A */
int x;

}
{
/* bloque C */
x= ;

}
{
/* bloque B */
int x;

}
Sintaxis y Semntica del Lenguaje - 2010
Ambito de una Variable
El binding dinmico de mbito, define el mbito de una
variable en trminos de la ejecucin de un programa
Generalmente, cada declaracin de una variable extiende sus
efectos sobre todas las instrucciones ejecutadas a partir de la
declaracin, hasta que se declare nuevamente la variable (con
el mismo nombre)
{
/* bloque A */
int x;

}
{
/* bloque C */
x= ;

}
{
/* bloque B */
int x;

}
x en el bloque C depende del flujo
de control durante la ejecucin
10
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
Especificacin de
la clase de valores que pueden ser asociados con la variable,
junto con
las operaciones que pueden ser legalmente usadas para crear, acceder
y modificar tales valores.
Cuando se define el lenguaje, un nombre de tipo es generalmente
asociado a una cierta clase de valores y a un conjunto de
operaciones.
Por ejemplo:
el tipo boolean se asocia a los valores true y false y a las operaciones and,
or y not.
Los valores y las operaciones son asociados a una cierta
representacin de mquina cuando se implementa el lenguaje.
Por ejemplo
true podra ser asociado al string de bits 00...001, false a 00...000, y las
operaciones and, or y not podran ser implementadas va instrucciones de
mquina apropiadas que operen sobre los strings de bits que representan a
los booleanos.
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
En algunos lenguajes, el programador puede definir
nuevos tipos por medio de una declaracin de tipo.
Por ejemplo, en C uno puede escribir:
typedef vector int[10];
Esta declaracin establece una asociacin (en tiempo
de traduccin) entre el tipo llamado vector y su
implementacin (un arreglo de 10 integers, cada uno
accesible va un ndice en el subrango 0 a 9).
Como consecuencia de este binding, el tipo vector hereda todas
las operaciones de la representacin de la estructura de datos
(el arreglo); as, es posible, leer y modificar cada uno de los
componentes de un objeto de tipo vector mediante indexado
dentro del arreglo.
11
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
En lenguajes que soportan la definicin de tipos de
datos abstractos no hay un binding por default entre un
nuevo tipo y el conjunto de operaciones;
las operaciones deben ser especificadas como un conjunto de
subprogramas en la declaracin del nuevo tipo. La declaracin
del nuevo tipo tiene la siguiente forma general.
typedef nuevoTipoDeDato {
estructura de datos que representa los objetos de tipo
nuevoTipoDeDato;
procedimientos a ser usados para manipular los objetos
de datos de tipo nuevoTipoDeDato;
};
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
En lenguajes que soportan la definicin de tipos de
datos abstractos no hay un binding por default entre un
nuevo tipo y el conjunto de operaciones;
las operaciones deben ser especificadas como un conjunto de
subprogramas en la declaracin del nuevo tipo. La declaracin
del nuevo tipo tiene la siguiente forma general.
12
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
Los tipos pueden ser asociados a variables de manera
dinmica o esttica.
La solucin esttica es adoptada por la mayora de los
lenguajes tradicionales (Fortran, Cobol, Pascal, C, C++).
En estos lenguajes, el binding entre una variable y su
tipo es generalmente especificado por una declaracin
de variables.
Por ejemplo, en C se puede escribir:
int x, y;
char c;
Este tipo de declaracin permite que las variables sean
protegidas de uso indebido
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
Este tipo de declaracin permite que las variables sean
protegidas de uso indebido
Este tipo de prueba realizado antes de que el programa sea ejecutado se
denomina verificacin de tipo esttica (static type checking) y contribuye a la
deteccin temprana de errores
13
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
Los tipos pueden ser asociados a variables de manera dinmica o
esttica.
La solucin esttica es adoptada por la mayora de los lenguajes
tradicionales (Fortran, Cobol, Pascal, C, C++). En estos lenguajes,
el binding entre una variable y su tipo es generalmente especificado
por una declaracin de variables.
Por ejemplo, en C se puede escribir:
int x, y;
char c;
En algunos lenguajes (como FORTRAN) la primer ocurrencia de un
nuevo nombre de variable se toma como una declaracin implcita.
La ventaja de las declaraciones explcitas est en la claridad de los
programas y en su confiabilidad, porque errores ortogrficos en los
nombres de variables pueden ser fcilmente detectados.
Por ejemplo, en FORTRAN la declaracin de la variable ALPHA, seguida de
una sentencia tal como ALPA=7.3, que intenta asignarle un valor, no sera
detectada como un error; ya que se considera como la declaracin implcita
de una nueva variable (ALPA).
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
Otros lenguajes (LISP, Smalltalk) establen un binding
dinmico entre las variables y su tipo (variables
polimrficas: mltiples formas).
El tipo de variable depende del valor que dinmicamente se le
asocia a la variable
La mayora de los lenguajes ensambladores son
variables de tipado dinmico dado que reflejan el
comportamiento del hardware
Las celdas de memorias y registros contienen strings de bits que
se interpretan como valores de cualquier tipo.
Existen lenguajes de tipado dinmico que una vez
asociado un valor de un tipo ocurre un binding implcito
que permace hasta que se le asigne un nuevo valor
14
Sintaxis y Semntica del Lenguaje - 2010
Tipo de una Variable
Cuando se emplea tipado dinmico se emplea
informacin acerca de los tipos de las variables para
elegir las acciones apropiadas para ejecutar sentencias.
Los lenguajes de programacin que adoptan el binding
dinmico entre variables y tipos son procesados en
forma ms natural por interpretacin.
Generalmente no hay informacin suficiente antes del tiempo de
ejecucin para generar cdigo para la evaluacin de
expresiones que involucren variables de tipo desconocido.
La eleccin entre traduccin e interpretacin en la
implementacin de un lenguaje est fuertemente influenciada
por las reglas de binding entre variables y tipos.
Los lenguajes con binding dinmico estn orientados a la
interpretacin, mientras que los lenguajes con binding esttico
estn orientados a la traduccin.
Sintaxis y Semntica del Lenguaje - 2010
l_value - Tiempo de Vida
l_value de una variable es el rea de almacenamiento asignado a la
variable durante la ejecucin.
El tiempo de vida, o extensin de una variable es el intervalo de
tiempo en el cual un rea de almacenamiento se asocia a la
variable.
Este rea es usada para mantener el valor de la variable (r_value).
Usaremos el trmino objeto de datos (o simplemente objeto) para
denotar conjuntamente el almacenamiento y el valor .
<l_value, r_value>
15
Sintaxis y Semntica del Lenguaje - 2010
l_value - Tiempo de Vida
Este rea es usada para mantener el valor de la variable (r_value).
Usaremos el trmino objeto de datos (o simplemente objeto) para
denotar conjuntamente el almacenamiento y el valor .
<l_value, r_value>
La accin por la cual se reserva un rea de almacenamiento para
una variable, se llama asignacin de memoria (allocation).
En algunos lenguajes, la asignacin es realizada antes del tiempo de
ejecucin (static allocation).
En otros lenguajes, la asignacin se realiza en tiempo de ejecucin
(dynamic allocation) ya sea
mediante pedidos explcitos del programador empleando una sentencia de
creacin o
automticamente al entrar al mbito de la variable.
Sintaxis y Semntica del Lenguaje - 2010
Valor de una Variable (r_value)
El valor de una variable (r_value) est representado en
forma codificada en el rea de almacenamiento
asociada a la variable (l_value).
La representacin codificada es luego interpretada de acuerdo
al tipo de la variable.
Las instrucciones de un programa acceden a las
variables mediante su l_value y posiblemente modifican
su r_value.
Los trminos l_value y r_value se derivan de sentencias
de asignacin
x:= y;
16
Sintaxis y Semntica del Lenguaje - 2010
Valor de una Variable (r_value)
La asociacin entre una variable y el valor mantenido en
su rea de almacenamiento es generalmente dinmica
el valor puede ser modificado por una operacin de asignacin.
Una asignacin tal como b:=a causa que una copia del valor de
a sea guardada en el rea de almacenamiento asociada a b.
(no vlido para LP lgicos y funcionales)
Algunos lenguajes permiten congelar el binding entre
una variable y su valor una vez que se ha establecido.
La entidad resultante se conoce como una constante simblica
definida por el usuario
Por ejemplo, en Pascal
const pi =3.1416
y luego se puede usar pi en expresiones como:
circunferencia:=2*pi*radio
Sintaxis y Semntica del Lenguaje - 2010
Valor de una Variable (r_value)
Algunos lenguajes permiten congelar el binding entre una variable y
su valor una vez que se ha establecido.
La entidad resultante se conoce como una constante simblica definida
por el usuario
Por ejemplo, en ALGOL 68
real pi =3.1416
y luego se puede usar pi en expresiones como:
circunferencia:=2*pi*radio
Pascal y Algol 68 difieren en el momento en el cual se realiza el
binding entre la variable (constante simblica) y su valor.
En Pascal el valor es un nmero o un string de caracteres, y es posible
establecer el binding en tiempo de traduccin.
El traductor puede legalmente sustituir el valor de la constante por su
nombre simblico en el programa.
En Algol 68 (C, Ada) el valor puede ser dado como una expresin que
involucre otras variables y constantes
El binding puede ser solamente establecido en tiempo de ejecucin, cuando
se crea la variable.
17
Sintaxis y Semntica del Lenguaje - 2010
Valor de una Variable (r_value)
Cul es el valor de la variable inmediatamente despus
de que esta es creada?
Hay un nmero de posibles enfoques. Desafortunadamente, la
mayora de las especificaciones de los lenguajes no especifican
la respuesta a esta cuestin, y por lo tanto existen distintas
implementaciones del mismo lenguaje que resuelven el
problema de diferentes formas.
Este hecho hace dificultoso probar que el programa es correcto,
porque la correccin del programa puede depender de la
implementacin. Adems, llevar un programa aparentemente
correcto a una instalacin diferente puede producir errores no
previstos o resultados inesperados.
Sintaxis y Semntica del Lenguaje - 2010
Valor de una Variable (r_value)
Cul es el valor de la variable inmediatamente despus de que
esta es creada?
Una solucin obvia y frecuentemente adoptada es ignorar el problema.
En este caso el string de bits que se encuentra en el rea de
almacenamiento asociada con la variable se considera su valor inicial.
Otra solucin es proveer una estrategia de inicializacin definida por el
sistema
Por ejemplo, los enteros son inicializados a cero, los caracteres a blancos,
etc.
Otra solucin consiste en ver una variable no inicializada como
inicializada con un valor especial no inicializado y evitar cualquier
acceso de lectura para tales variables hasta que se le asigne un valor
significativo.
Esta solucin, que es la ms clara, puede ser lograda de diversas maneras.
Su nica contra puede ser el costo asociado con los chequeos en tiempo de
ejecucin necesarios para asegurar que un valor no inicializado nunca sea
usado en el programa.
18
Sintaxis y Semntica del Lenguaje - 2010
Valor de una Variable (r_value)
En algunos LP el valor de una variable puede ser una
referencia (puntero) a un objeto.
En tales lenguajes, un objeto puede ser accesible va una
cadena de referencias (o camino de acceso) de longitud
arbitraria.
Dos variables comparten un objeto si cada una tiene un camino de
acceso al objeto.
Un objeto compartido y modificado a travs de un camino de
acceso, hace la modificacin conocida para todos los posibles
caminos de acceso.
Compartir objetos se usa para ahorrar almacenamiento, pero puede
llevar a que los programas sean difciles de leer, porque el valor de
las variables puede ser modificado an cuando no sean
referenciadas. Las referencias son el medio principal para acceder
a variables annimas.
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programas (Routines)
Los LP permiten que un programa est compuesto por
un nmero de unidades.
Las unidades de programa pueden ser desarrolladas en una
forma ms o menos independiente y algunas veces pueden ser
traducidas separadamente y combinadas luego de la traduccin.
Las variables declaradas dentro de una unidad son locales a la
unidad. Una unidad puede ser activada en tiempo de ejecucin.
Ejemplos:
los subprogramas en lenguaje de mquina, las subrutinas de
FORTRAN, los procedimientos y bloques de ALGOL 60,
funciones en C y C++.
19
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programas
Al igual que las variables, tienen
nombre, mbito, l-value, r-value.
Una unidad de programa es introducida en un programa mediante
una declaracin de la unidad.
Generalmente, el mbito se extiende desde su declaracin hasta
algn punto de cierre, el cual es determinado esttica o
dinmicamente, dependiendo del lenguaje.
En C el mbito de una funcin se extiende desde su declaracin hasta
el fin de archivo donde la funcin es declarada.
La activacin de una unidad de programa se logra mediante la
invocacin de la unidad (llamada)
nombra a la unidad
especifica los parmetros sobre los cuales la unidad operar.
La llamada a la unidad debe realizarse dentro del mbito de la
unidad de programa.
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programas
Las unidades pueden o no tener nombre.
Los procedimientos en Pascal y C son ejemplos de unidades
con nombre;
los bloques en C son ejemplos de unidades no nombradas.
20
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programas
Las unidades de programa definen un ambiente para las
declaraciones anidadas en la unidad (declaraciones
locales).
Las declaraciones locales slo son visibles dentro de la unidad
Dependiendo de las reglas de mbito del lenguaje, las
unidades de programa puede referir a tems locales y a
no locales (tems no declarados localmente).
Items no locales que son visibles en todas las unidades del
programa se denominan tems globales.
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programas
int suma(int n)
{
int i, s;
s = 0;
for(i = 1; i <= n; ++i)
s = s + i;
return s;
}
Nombre de la unidad (funcin)
Parmetros: tipos de parmetros
Tipo del valor retornado
Signatura de la Unidad
suma: int -> int
21
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programas
Un l-value de una unidad es una referencia al rea de
memoria que almacena el cuerpo de la rutina (segmento
de cdigo).
La activacin causa la ejecucin del cuerpo, que
constituye el r-value que es ligado a la rutina.
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programa
La representacin de una unidad de programa durante
la ejecucin se llama instancia de la unidad y est
compuesta de
un segmento de cdigo
Posee contenido fijo (las instrucciones de la unidad).
un registro de activacin.
Su contenido puede cambiar, contiene toda la informacin
necesaria para ejecutar la unidad, incluyendo los objetos de datos
asociados con las variables locales de una instancia de unidad
particular.
La posicin relativa de un objeto de datos en el registro de
activacin se conoce como su desplazamiento offset.
22
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programa
Una unidad no es una pieza de programa
completamente autocontenida e independiente.
Si es un subprograma, puede ser activado por una llamada al
subprograma ejecutada por otra unidad, a la cual retorna el
control luego de la ejecucin.
El punto de retorno es una pieza de informacin (variable) que debe
ser guardada en el registro de activacin del subprograma en el
momento de la invocacin al mismo.
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programa
Adems las unidades pueden referenciar variables
(variables no locales) distintas de aquellas declaradas
localmente, si las reglas de mbito del lenguaje lo
permiten.
Las variables no locales que pueden ser referenciadas por
cualquier unidad del programa se conocen como variables
globales.
23
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programa
El ambiente de referencia de una instancia de unidad U
consiste en
las variables locales de U,
las cuales son asociadas a objetos almacenados en el registro de
activacin de U (ambiente local)
las variables no locales de U,
las cuales son asociadas a objetos almacenados en los registros de
activacin de otras unidades (ambiente no local).
Dos variables del ambiente de referencia de una unidad
que denotan el mismo objeto de datos son llamadas
alias.
La modificacin de un objeto de datos asociado a una
variable no local se llama efecto colateral.
Sintaxis y Semntica del Lenguaje - 2010
Unidades de Programa
Las unidades pueden a menudo ser activadas
recursivamente
una unidad puede llamarse a s misma ya sea, directa o
indirectamente a travs de otra unidad.
una nueva activacin puede ocurrir antes de la terminacin de una
activacin previa.
Todas las instancias de la misma unidad estn compuestas del
mismo segmento de cdigo pero diferentes registros de
activacin.
En presencia de recursin, el binding entre un registro de activacin
y su segmento de cdigo es necesariamente dinmico.
Cada vez que una unidad se activa, debe establecerse un binding
entre un registro de activacin y su segmento de cdigo para
formar una nueva instancia de unidad.
24
Sintaxis y Semntica del Lenguaje - 2010
Clasificacin de los
Lenguajes de Programacin
Segn el comportamiento en tiempo de ejecucin es
posible identificar tres clases de LP:
Lenguajes esttico
Lenguajes basado en pila
Lenguajes dinmicos
Sintaxis y Semntica del Lenguaje - 2010
Clasificacin de los
Lenguajes de Programacin
Lenguajes esttico
Primeras versiones de Fortran, Cobol
Es posible determinar los requerimientos de memoria de un
programa previo a su ejecucin
Se puede asignar toda la memoria necesaria antes de la ejecucin
del programa
No permiten recursividad
Lenguajes basado en pila
Lenguajes dinmicos
25
Sintaxis y Semntica del Lenguaje - 2010
Clasificacin de los
Lenguajes de Programacin
Lenguajes esttico
Lenguajes basado en pila
Algol 60, lenguajes estilo Algol
No es posible determinar los requerimientos de memoria de un
programa en tiempo de compilacin
Sus requerimientos de memoria son predecibles
Poltica ltimo en entrar primero en salir (LIFO)
Se asigna automticamente espacio a las variables declarada en un
mbito, cuando en tiempo de ejecucin se ingresa a ese mbito
Se libera automticamente ese espacio cuando se sale de ese mbito
Lenguajes dinmicos
Sintaxis y Semntica del Lenguaje - 2010
Clasificacin de los
Lenguajes de Programacin
Lenguajes esttico
Lenguajes basado en pila
Lenguajes dinmicos
LISP, Prolog
No es posible determinar los requerimientos de memoria de un
programa en tiempo de compilacin
No es posible predecir sus requerimientos de memoria
El espacio es dinmicamente asignado (por demanda)
Las variables se denominan dinmicas
El trmino heap se emplea para referenciar a la memoria de
datos.
26
Sintaxis y Semntica del Lenguaje - 2010
Introduccin a Semntica
Todo LP debe ser definido con el suficiente nivel de
detalle para poder determinar.
Si un programa es vlido (Sintaxis)
Si el programa es vlido, cul es su significado o efecto?
(Semntica)
Los programas se ejecutan en computadora, siendo
natural especificar un LP en trmino de los pasos u
operaciones que ejecuta un programa
El significado puede expresarse mediante una asignacin de
cada constructor del lenguaje en un dominio cuya semntica sea
conocida
Sintaxis y Semntica del Lenguaje - 2010
Introduccin a Semntica
Todo LP debe ser definido con el suficiente nivel de
detalle para poder determinar.
Si un programa es vlido (Sintaxis)
Si el programa es vlido, cul es su significado o efecto?
(Semntica)
Los programas se ejecutan en computadora, siendo
natural especificar un LP en trmino de los pasos u
operaciones que ejecuta un programa
El significado puede expresarse mediante una asignacin de
cada constructor del lenguaje en un dominio cuya semntica sea
conocida
Descripcin de cada constructor del LP en lenguaje natural (por ejemplo Espaol)
Informal, ambigo
Semntica operacional
Semntica operacional
case(i) {
switch 1: a= b-a;
break;
while( a>d) {
switch 2: b= c-d;
}
switch 3: c= a-b;
}
case(i) {
switch 1: a= b-a;
break;
while( a>d) {
switch 2: b= c-d;
}
switch 3: c= a-b;
}
27
Sintaxis y Semntica del Lenguaje - 2010
Introduccin a Semntica Formal:
Semntica Axiomtica
Considera al programa como una mquina de estados
Un estado se describe mediante predicados de la lgica de primer
orden
Los constructores del LP se formalizan describiendo cmo su
ejecucin causan un cambio de estado
Regla que relaciona los estados antes (precondicin) y despus
(poscondicin) de la ejecucin del constructor
Un predicado P que debe ser cierto luego de la ejecucin de S se
denomina poscondicin para S
Un predicado Q que debe ser cierto antes de la ejecucin de S y que
garantiza que la ejecucin de S termina y que la poscondicin P es
cierta, se denomina precondicin para S y P
Su principal uso es probar si son correctos los programas
Probar que bajo ciertas restricciones en los datos de entrada, el
programa finaliza en un estado final que satisface las restricciones
especificadas en los datos de salida
Sintaxis y Semntica del Lenguaje - 2010
Introduccin a Semntica Formal:
Semntica Denotacional
Asocia cada constructor del lenguaje con una funcin dsem que
vincula el estado del programa previo a la ejecucin con el estado
del programa posterior a la ejecucin
El estado se representa mediante una funcin mem que vincula el
conjunto de variables ID con su valor
Sea una expresin expr
mem(expr) est definida como error si existe una variable v que
ocurre en expr y mem(v) no est definida
x = expr
mem es la funcin que describe la memoria antes de ejecutar la
asignacin
dsem(x = expr, mem) =
error, si mem(v) no est definida para alguna variable v de expr
mem, mem(y)= mem(y) para todo y x, mem(x)= mem(expr)
28
Sintaxis y Semntica del Lenguaje - 2010
Introduccin a Semntica Formal:
Semntica Denotacional
Asocia cada constructor del lenguaje con una funcin dsem que
vincula el estado del programa previo a la ejecucin con el estado
del programa posterior a la ejecucin
El estado se representa mediante una funcin mem que vincula el
conjunto de variables ID con su valor
If B then L1 else L2
Sea if B then L1 else L2 una sentencia condicional
B es una expresin booleana
L1 y L2 son dos listas de sentencias
dsem(if B then L1 else L2, mem) =
dsem(L1, mem), si mem(B)= true
dsem(L2, mem), si mem(B) true
Sintaxis y Semntica del Lenguaje - 2010
Semntica Operacional
Ghezzi & Jazayeri proponen el empleo de una mquina
abstracta (SIMPLESEM) para describir los efectos de
cada constructor del lenguaje
Se especifica el comportamiento del procesador abstracto que
ejecuta programas escritos en un LP
Cada constructor del LP se ejecuta mediante una secuencia de
operaciones en el procesador abstracto
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
29
Sintaxis y Semntica del Lenguaje - 2010
Semntica Operacional - SIMPLESEM
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C[x], valor almacenado en la celda x de C
D[x], valor almacenado en la celda x de D
x es un l-value, D[x] es su correspondiente r-value
rea de almacenamiento ligado a la
variable durante la ejecucin
valor almacenado en la ubicacin
asociada con la variable
Asignacin: set destino, fuente set 2, D[1] set 1, read set write, D[2]
set D[10], D[1] Direccionamiento indirecto:
Sintaxis y Semntica del Lenguaje - 2010
Semntica Operacional - SIMPLESEM
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
Incrementar ip
Ejecuta los siguientes pasos hasta encontrar una instruccin halt
Ejecutar la instruccin actual
Obtener la instruccin a ser ejecutada (C[ip])
Existen instrucciones que pueden modificar el flujo de control secuencial
jump n
jumpt n, expBooleana
jump 12
jumpt 12, D[5] > D[3]
30
Sintaxis y Semntica del Lenguaje - 2010
Semntica Operacional - SIMPLESEM
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
set
jump
Juegos de instrucciones
Incrementar ip
Ejecuta los siguientes pasos hasta encontrar una instruccin halt
Ejecutar la instruccin actual
Obtener la instruccin a ser ejecutada (C[ip])
halt
jumpt
Sintaxis y Semntica del Lenguaje - 2010
Semntica Operacional - SIMPLESEM
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
set
jump
Incrementar ip
Ejecuta los siguientes pasos hasta encontrar una instruccin halt
Ejecutar la instruccin actual
Obtener la instruccin a ser ejecutada (C[ip])
halt
jumpt
Para que la mquina arranque, se carga un programa
en memoria e ip apunta a la primera instruccin del
programa. Supondremos que SIMPLESEM tiene
instrucciones para las operaciones usuales como +, -,
/, *, >, etc.; requeridas por la mayora de los LP.
31
Sintaxis y Semntica del Lenguaje - 2010
set
jump
halt
jumpt
Semntica Operacional
Ghezzi & Jazayeri proponen el empleo de SIMPLESEM para
describir los efectos de cada constructor del lenguaje
SIMPLESEM es simple, es fcil de comprender cmo trabaja y cules
son los efectos de ejecutar sus instrucciones
Su semntica es conocida de manera intuitiva
La semntica de LPs puede describirse mediante reglas que
especifiquen cmo traducir cada constructor del lenguaje en una
secuencia de instrucciones en SIMPLESEM
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
Sintaxis y Semntica del Lenguaje - 2010
C1: Un ejemplo simple
(lenguaje esttico)
Sea C1, subconjunto de C, el cual posee slo tipos simples de datos y no tiene
funciones.
Los datos manipulados por C1 se conocen en tiempo de compilacin (valores
enteros, de punto-flotantes, arrays de tamao fijos y estructuras).
El programa consiste de una rutina principal (main()) donde se definen las
declaraciones de dato y el conjunto de sentencias que manipulan estos datos.
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
32
Sintaxis y Semntica del Lenguaje - 2010
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
ip
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
Sintaxis y Semntica del Lenguaje - 2010
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
33
Sintaxis y Semntica del Lenguaje - 2010
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
Sintaxis y Semntica del Lenguaje - 2010
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
34
Sintaxis y Semntica del Lenguaje - 2010
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
Sintaxis y Semntica del Lenguaje - 2010
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
35
Sintaxis y Semntica del Lenguaje - 2010
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
Sintaxis y Semntica del Lenguaje - 2010
C1: Un ejemplo simple
(lenguaje esttico)
Celda reservada para i
Celda reservada para j
main {
int i, j;
get(i, j);
while(i != j)
if(i > j)
i -= j;
else
j -= i;
print(i);
}
36
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
Sea C2, subconjunto de C. Un programa en C2
consiste de:
- Un conjunto de declaraciones de datos (datos
globales)
- Un conjunto de definiciones de rutinas. Las
rutinas no se pueden invocar recursivamente, no
se pasan parmetros y no devuelven valores
- Una rutina principal (main()) donde se definen
sus declaraciones de dato y un conjunto de
sentencias. La rutina principal no se pude invocar
desde otras rutinas
int i= 1, j= 2, k= 3;
alpha() {
int i= 4, l= 5;

i+=k+l;

};
beta() {
int k= 6;

i= j+k;
alpha();

};
main {

beta();

}
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para la
unidad i

las variables pueden ser creadas antes de la ejecucin, perduran durante toda la
ejecucin del programa (variables estticas). El mbito de una variable est
limitado a la unidad en la cual es declarada
Cada unidad est asociada con un registro de activacin
que puede ser reservado antes de la ejecucin
37
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para la
unidad i

Para cada variable local


el espacio de almacenamiento requerido es fijo
es conocido en tiempo de traduccin
no puede ser cambiado durante la ejecucin de la unidad
(asignacin esttica)
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para la
unidad i

Las unidades pueden acceder a variables globales


Estas variables pueden ser vistas como pertenecientes a un registro de
activacin provisto por el sistema, global a todas las unidades del programa
38
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para la
unidad i

Un programa debe pasar por un proceso de tres pasos de transformacin


antes de ser ejecutado
Compilacin, cada unidad se traduce separadamente sin conocimiento de las
otras unidades (compilador)
Todas las sentencias son traducidas a lenguaje de mquina de SIMPLESEM, pero todas
las referencias a memoria son indicadas como un par (nombre de unidad, desplazamiento)
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para la
unidad i

Un programa debe pasar por un proceso de tres pasos de transformacin


antes de ser ejecutado: Compilacin,
Enlace (link) de las unidades que componen el programa (linker)
Todas las unidades son asignadas a posiciones de memoria especficas y por lo tanto las
referencias a memoria son trasladadas a direcciones de memoria especficas
39
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para la
unidad i

Un programa debe pasar por un proceso de tres pasos de transformacin


antes de ser ejecutado: Compilacin, Enlace, y
Carga, cargar el programa en la memoria de SIMPLESEM y hacer que ip
apunte a la primera instruccin del programa (cargador)
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para
la unidad i

La primer posicin (desplazamiento 0) de cada registro de activacin (RA) est


reservada para un puntero de retorno. Para una instancia de la unidad i, el
puntero de retorno contendr la direccin de la instruccin que deber ser
ejecutada luego de terminar con la unidad i.
La informacin restante en el RA es para las variables locales.
(el registro de activacin tambin debe contener informacin acerca de los parmetros)
40
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
registro de
activacin para la
unidad que llama
registro de
activacin para la
unidad llamada
La primer posicin (desplazamiento 0) de cada registro de activacin (RA) est
reservada para un puntero de retorno. Para una instancia de la unidad i, el
puntero de retorno contendr la direccin de la instruccin que deber ser
ejecutada luego de terminar con la unidad i.
La informacin restante en el RA es para las variables locales.
(el registro de activacin tambin debe contener informacin acerca de los parmetros)
D
Memoria
0
1
2
.
.
.
m
C
0
1
2
.
.
.
n
segmento de
cdigo de la
unidad que llama
segmento de
cdigo de la
unidad llamada
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para
la unidad i

La primer posicin de cada registro de activacin (RA) est reservada para un


puntero de retorno
La informacin restante en el RA es para las variables locales
Durante el proceso de traduccin de una unidad, se van reservando posiciones
consecutivas del RA de la unidad para las variables locales a medida que se van
encontrando las declaraciones de variables
Los offsets son asociados estticamente a las variables. Cada referencia a una
variable es un par (nombre de unidad, desplazamiento)
Es posible traducir cada
referencia a una variable a
una direccin de memoria, sin
requerir el nombre de unidad?
(en tiempo de traduccin, en
tiempo de carga)
41
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para
la unidad i

Similarmente, cada instruccin tambin puede ser referenciada usando un par:


(nombre de unidad, desplazamiento de la instruccin dentro del segmento de
cdigo)
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
m
C D
ip
Memoria
Procesador
0
1
2
.
.
.
n
0
1
2
.
.
.
n
0
1
2
.
.
.
m
0
1
2
.
.
.
m
segmento de
cdigo para la
unidad 1
segmento de
cdigo para la
unidad 2
segmento de
cdigo para la
unidad i
registro de
activacin para
variables globales
registro de
activacin para la
unidad 1
registro de
activacin para
la unidad i

En tiempo de enlace, cuando todas las unidades de programa son combinadas


por el linker, se puede comenzar asignando unidades a memoria una a la vez.
El linker ubica segmentos de cdigo en la memoria de cdigo y RA en la
memoria de datos.
Si el RA de la unidad i se asigna a la memoria a partir de la posicin 1024, la posicin de
datos referenciada por (i,6) podra ahora ser direccionada como D[1030]
Notacin:
d[i,j] posicin j del RA i
c[i,j] instruccin en el
desplazamiento j
del segmento i
&X donde X es d[i,j] o c[i,j],
indica la direccin
de X
42
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
Llamada y retorno a procedimientos
Llamada al procedimiento P
set &d[P,0], ip + 1
una llamada se traduce en dos instrucciones
jump &c[P,0]
Almacenar la direccin de la prxima instruccin (ip) en el
punto de retorno del RA de la unidad P (en la posicin 0 del
RA de P, d[P,0])
Transferir el control a la unidad P. Reemplazar el contenido
del puntero de instruccin (ip) con la primera instruccin de la
unidad P (&c[P,0])
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
Llamada y retorno a procedimientos
Llamada al procedimiento P
set &d[P,0], ip + 1
jump &c[P,0]
set m, ip + 1
m es la direccin asignada al RA de P
jump n
n es la direccin asignada al segmento de cdigo de P
43
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
Llamada y retorno a procedimientos
Retorno de un procedimiento P
jump d[P,0]
jump D[m]
m es la direccin asignada al RA de P
Reemplazar el puntero de instruccin (ip) con el punto de
retorno del RA de la unidad P (en la posicin 0 del RA de P,
d[P,0])
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
int i= 1, j= 2, k= 3;
alpha() {
int i= 4, l= 5;

i+=k+l;

};
beta() {
int k= 6;

i= j+k;
alpha();

};
main {

beta();

}
rea global
i d[global, 0]
j d[global, 1]
k d[global, 2]
alpha
PRalpha d[alpha, 0]
i d[alpha, 1]
l d[alpha, 2]
beta
PRbeta d[beta, 0]
k d[beta, 1]
main
- no posee punto de retorno, dado que no puede ser invocado
- no posee ninguna variable local
Compilacin
44
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
int i= 1, j= 2, k= 3;
alpha() {
int i= 4, l= 5;

i+=k+l;

};
beta() {
int k= 6;

i= j+k;
alpha();

};
main {

beta();

}
rea global
i d[global, 0]
j d[global, 1]
k d[global, 2]
alpha
PRalpha d[alpha, 0]
i d[alpha, 1]
l d[alpha, 2]
beta
PRbeta d[beta, 0]
k d[beta, 1]
alpha:
c[alpha,0]: set &d[alpha,1], 4
c[alpha,1]: set &d[alpha,2], 5

set &d[alpha,1],
d[alpha,1]+
d[global,2]+
d[alpha,2]

jump d[alpha,0]
beta:
c[beta,0]: set &d[beta,1],6

set &d[alpha,0], ip+1


jump &c[alpha,0]

jump d[beta,0]
main:

set &d[beta,0],ip+1
jump &c[beta,0]

Compilacin
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
int i= 1, j= 2, k= 3;
alpha() {
int i= 4, l= 5;

i+=k+l;

};
beta() {
int k= 6;

i= j+k;
alpha();

};
main {

beta();

}
rea global
i d[global, 0] D[0]
j d[global, 1] D[1]
k d[global, 2] D[2]
alpha
PRalpha d[alpha, 0] D[3]
i d[alpha, 1] D[4]
l d[alpha, 2] D[5]
beta
PRbeta d[beta, 0] D[6]
k d[beta, 1] D[7]
Enlazado
45
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
int i= 1, j= 2, k= 3;
alpha() {
int i= 4, l= 5;

i+=k+l;

};
beta() {
int k= 6;

i= j+k;
alpha();

};
main {

beta();

}
alpha: (inicio direccin 50)
c[alpha,0]: set &d[alpha,1], 4 set 4,4
c[alpha,1]: set &d[alpha,2], 5 set 5,5

set &d[alpha,1],
d[alpha,1]+
d[global,2]+
d[alpha,2] set 4,D[4]+D[2]+D[5]

jump d[alpha,0] jump D[3]


beta: (inicio direccin 100)
c[beta,0]: set &d[beta,1],6 set 7,6

set &d[alpha,0], ip+1 set 3, ip+1


jump &c[alpha,0] jump 50

jump d[beta,0] jump D[6]


main: (inicio direccin 0)

set &d[beta,0],ip+1 set 6, ip + 1


jump &c[beta,0] jump 100

Enlazado
Sintaxis y Semntica del Lenguaje - 2010
C2: Otro ejemplo simple
(lenguaje esttico)
int i= 1, j= 2, k= 3;
alpha() {
int i= 4, l= 5;

i+=k+l;

};
beta() {
int k= 6;

i= j+k;
alpha();

};
main {

beta();

}
Ejecucin
46
Sintaxis y Semntica del Lenguaje - 2010
Ejercicio
int x, y;
swap(){
int temp= x;
x= y;
y= temp;
}
ordenar() {
if(x>y)
swap();
}
main(){
get(x, y);
ordenar();
print(x,y);
}
Traduccin
x d[global,0]
y d[global,1]
PRswap d[swap,0]
temp d[swap, 1]
PRordenar d[ordenar,0]
c[swap,0]: set &d[swap,1], d[global,0]
c[swap,1]: set &d[global,0], d[global,1]
c[swap,2]: set &d[global1,], d[swap,1]
c[swap,3]: jump d[swap,0]
c[ordenar,0]: jumpt &c[ordenar,3], d[global,0] <= d[gloabl,1]
c[ordenar,1]: set &d[swap,0], ip+1
c[ordenar,2]: jump &c[swap,0]
c[ordenar,3]: jump d[ordenar,0]
c[main,0]: set &d[global,0], read
c[main,1]: set &d[global,1], read
c[main,2]: set &d[ordenar,0], ip+1
c[main,3]: jump &c[ordenar,0]
c[main,4]: set write, d[global,0]
c[main,5]: set write, d[global,1]
c[main,6]: halt
Sintaxis y Semntica del Lenguaje - 2010
Ejercicio
int x, y;
swap(){
int temp= x;
x= y;
y= temp;
}
ordenar() {
if(x>y)
swap();
}
main(){
get(x, y);
ordenar();
print(x,y);
}
47
Sintaxis y Semntica del Lenguaje - 2010
Ejercicio
int v[10];
int i, j;
swap(){
int temp= v[i];
v[i]= v[j];
v[j]= temp;
}
ordenar() {
for(i=0; i<10; i++)
for(j=i+1; j<10; j++)
if(v[i]>v[j])
swap();
}
main(){
for(i=0; i<10; i++)
get(v[i]);
ordenar();
for(i=0; i<10; i++)
print(v[i]);
}
Sintaxis y Semntica del Lenguaje - 2010
Ejercicio
int rfact=1;
int n;
fact(){
int i;
for(i=1; i<=n; i++)
rfact= rfact * i;
}
main(){
get(n);
fact();
print(rfact);
}
48
Sintaxis y Semntica del Lenguaje - 2010
C3: Soportando Funciones Recursivas
Sea C3, un lenguaje que incluye a C2, donde
las funciones pueden retornar un valor y
soporta funciones recursivas
(directas o indirectas)
Sintaxis y Semntica del Lenguaje - 2010
C3: Soportando Funciones Recursivas
49
Sintaxis y Semntica del Lenguaje - 2010
C3: Soportando Funciones Recursivas
Sintaxis y Semntica del Lenguaje - 2010
C3: Soportando Funciones Recursivas
50
Sintaxis y Semntica del Lenguaje - 2010
C3: Soportando Funciones Recursivas
n d[global,0]
PRfact d[fact,0]
LDfact d[fact,1]
loc d[fact,2]
c[main,0]: set &d[global,0], read
c[main,1]: jumpt &c[main,11], d[global,0]<0
c[main,2]: set 1,D[1] + 1
c[main,3]: set D[1], ip + 4
c[main,4]: set D[1]+1, D[0]
c[main,5]: set 0, D[1]
c[main,6]: set 1, D[1] + S
c[main,7]: jump &c[fact,0]
c[main,8]: set 1, D[1]-1
c[main,9]: set write, D[D[1]]
c[main,10]: jump &c[main,12]
c[main,11]: set write, 0
c[main,12]: halt
PRmain d[main,0]
LDmain d[main,1]
Sintaxis y Semntica del Lenguaje - 2010
C3: Soportando Funciones Recursivas
n d[global,0]
PRfact d[fact,0]
LDfact d[fact,1]
loc d[fact,2]
c[fact,0]: jumpt &c[fact,12], d[global,0]<=1
c[fact,1]: set D[0]+2, d[global,0]
c[fact,2]: set &d[global,0], d[global,0]-1
c[fact,3]: set 1, D[1] + 1
c[fact,4]: set D[1], ip + 4
c[fact,5]: set D[1]+1, D[0]
c[fact,6]: set 0,D[1]
c[fact,7]: set 1, D[1] + S
PRmain d[main,0]
LDmain d[main,1]
c[fact,8]: jump &c[fact,0]
c[fact,9]: set 1, D[1] - 1
c[fact,10] set D[0]-1, D[D[0]+2] * D[D[1]]
c[fact,11]: jump &c[fact,13]
c[fact,12]: set D[0]-1, 1
c[fact,13]: set 1, D[0]
c[fact,14]: set 0, D[D[0]+1]
c[fact,15]: jump D[D[1]]
51
Sintaxis y Semntica del Lenguaje - 2010
C3: Soportando Funciones Recursivas
Sintaxis y Semntica del Lenguaje - 2010
C4: Soportando Estructuras de Bloque
Sea la familia de lenguajes C4 que incluye a
C3,
C4 permite declaraciones locales en
sentencias compuestas
C4 soporta la definicin de rutinas anidadas
Una estructura de bloque (unidad de programa)
permite controlar el mbito de variables, definir
su ciclo de vida, y dividir el programa en
unidades mas pequeas
Dadas dos unidades, estas pueden ser
disjuntas o estar anidadas.
52
Sintaxis y Semntica del Lenguaje - 2010
C4
Sea la familia de lenguajes C4 que incluye a
C3,
C4 permite declaraciones locales en
sentencias compuestas
{
<lista_de_declaraciones>;
<lista_de_sentencias>
}
el espacio de memoria es enlazado a la
variable x cuando se ingresa al bloque donde
es declarada.
el enlace es removido cuando se sale del
bloque
Sintaxis y Semntica del Lenguaje - 2010
C4
el espacio de memoria es enlazado a la variable x cuando se ingresa
al bloque donde es declarada.
el enlace es removido cuando se sale del bloque
Definicin esttica del
Registro de Activacin
Asignacin dinmica del
espacio de memoria
cuando se ingresa al
bloque que contiene a la
variable
53
Sintaxis y Semntica del Lenguaje - 2010
C4
La estructura de bloque se puede representar
mediante un rbol de anidamiento esttico
(SNT static nesting tree)
bloque 1
bloque 2 bloque 5
bloque 3 bloque 4
Sintaxis y Semntica del Lenguaje - 2010
C4
Sea la familia de lenguajes C4 que
incluye a C3,
C4 permite declaraciones locales en
sentencias compuestas
C4 soporta la definicin de rutinas
anidadas
54
Sintaxis y Semntica del Lenguaje - 2010
C4
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
Desde donde puede ser invocada f3?
No es visible en f1 ni en main, slo puede
invocarse desde f2
Una llamada a f3 desde f2 es una llamada local
(llama a una rutina declarada localmente)
Dado que f3 est contenido en f2, f3 puede ser
llamada desde f3 (llamada a una rutina
declarada no localmente, ya que f3 es
declarada en la rutina exterior f2)
x, y, z, f1(), main()
Sintaxis y Semntica del Lenguaje - 2010
C4
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
Desde donde puede ser invocada f2?
No es visible en main, slo puede invocarse
desde f1
Una llamada a f2 desde f1 es una
(llamada local)
Tambin puede llamarse desde f2 y desde f3
(llamadas no locales)
Desde un bloque es posible acceder a
variables locales y no locales
x, y, z, f1(), main()
55
Sintaxis y Semntica del Lenguaje - 2010
C4
Sintaxis y Semntica del Lenguaje - 2010
C4 main invoca f1
56
Sintaxis y Semntica del Lenguaje - 2010
C4 f1 invoca f2
Sintaxis y Semntica del Lenguaje - 2010
C4 f2 invoca f3
57
Sintaxis y Semntica del Lenguaje - 2010
C4 f3 invoca f2
Sintaxis y Semntica del Lenguaje - 2010
C4
58
Sintaxis y Semntica del Lenguaje - 2010
C4
El ambiente de las variables no locales est determinado por las reglas de mbito del
lenguaje, dependiendo del anidamiento esttico de la declaracin de rutinas
Sintaxis y Semntica del Lenguaje - 2010
C4
El ambiente de las variables no locales est determinado por las reglas de mbito del
lenguaje, dependiendo del anidamiento esttico de la declaracin de rutinas
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
y, z
x, w
t
59
Sintaxis y Semntica del Lenguaje - 2010
C4
enlaces
dinmicos
enlaces
estticos
Sintaxis y Semntica del Lenguaje - 2010
C4
enlaces
dinmicos
enlaces
estticos
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
x, y, z, f1(), main()
Para buscar el enlace correcto entre una variable y la ubicacin en la pila se debe
recorrer la cadena esttica hasta encontrar el enlace
60
Sintaxis y Semntica del Lenguaje - 2010
C4
enlaces
dinmicos
enlaces
estticos
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
x, y, z, f1(), main()
Si la variable es local, no debe buscar por la cadena esttica (distancia 0).
Si la variable est declarada en la unidad inmediata que contiene el bloque,
la distancia es 1
Si la variable est declarada en la siguiente unidad, la distancia es 2
Sintaxis y Semntica del Lenguaje - 2010
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
y, z
x, w
t
C4
enlaces
dinmicos
enlaces
estticos
Para cada referencia a variable
es posible evaluar un atributo de
distancia entre la referencia y la
correspondiente declaracin
El atributo de distancia puede ser evaluado y enlazado a la
variable en tiempo de traduccin
61
Sintaxis y Semntica del Lenguaje - 2010
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
y, z
x, w
t
C4
enlaces
dinmicos
enlaces
estticos
Para cada referencia a variable
es posible evaluar un atributo de
distancia entre la referencia y la
correspondiente declaracin
El atributo de distancia puede ser evaluado y enlazado a la
variable en tiempo de traduccin
Sintaxis y Semntica del Lenguaje - 2010
bloque 0
bloque 1 bloque 4
bloque 2
bloque 3
y, z
x, w
t
C4
enlaces
dinmicos
enlaces
estticos
Para cada referencia a variable
es posible evaluar un atributo de
distancia entre la referencia y la
correspondiente declaracin
El atributo de distancia puede ser evaluado y enlazado a la variable en
tiempo de traduccin. Cada referencia puede ser enlazada estticamente al
par (distancia, desplazamiento) dentro del registro de activacin
62
Sintaxis y Semntica del Lenguaje - 2010
C4
enlaces
estticos
Basado en el par (distancia, offset), es
posible definir el siguiente esquema de
direccionamiento en SIMPLESEM:
Si d es el valor de la distancia
comenzando del RA actual (CURRENT).
Se debe navegar d veces por el enlace
esttico.
Luego, se suma el valor del offset a la
direccin obtenida, y se obtiene la
direccin deseada
fp: Frame-pointer
fp(d) = if d=0 then D[0] else D[fp(d-1)+2]
fp(0) = D[0] = current
Sintaxis y Semntica del Lenguaje - 2010
C4
enlaces
estticos
(distancia, offset)
fp(2) = D[fp(1) + 2] =
= D[D[fp(0) + 2] + 2] =
= D[D[D[0] + 2] + 2]
fp: Frame-pointer
fp(d) = if d=0 then D[0] else D[fp(d-1)+2]
63
Sintaxis y Semntica del Lenguaje - 2010
C4
enlaces
estticos
Basado en el par (distancia, offset), es
posible definir el siguiente esquema de
direccionamiento en SIMPLESEM:
Usando fp, para acceder a la variable x,
con el par <distancia, offset>:
D[fp(distancia)+ offset]
fp: Frame-pointer
fp(d) = if d=0 then D[0] else D[fp(d-1)+2]
Sintaxis y Semntica del Lenguaje - 2010
C4
enlaces
estticos
Basado en el par (distancia, offset), es
posible definir el siguiente esquema de
direccionamiento en SIMPLESEM:
Usando fp, para acceder a la variable x,
con el par <distancia, offset>:
D[fp(distancia)+ offset]
fp: Frame-pointer
fp(d) = if d=0 then D[0] else D[fp(d-1)+2]
Llamada a Funcin
64
Sintaxis y Semntica del Lenguaje - 2010
C5:
Incorporando Comportamiento Dinmico
Hasta ahora consideramos que el tamao del registro de
activacin para cada unidad es conocido en tiempo de
traduccin
El enlace de variables almacenadas dentro del registro de
activacin se puede realizar en tiempo de traduccin
Cada variable es enlazada a su offset estticamente
Existen caractersticas de lenguajes que invalidad este
supuesto
Sintaxis y Semntica del Lenguaje - 2010
C5:
Incorporando Comportamiento Dinmico
Registros de activacin cuyo tamao se conoce en la
activacin de la unidad
Arrays dinmicos, la cantidad de elementos se conoce en
tiempo de ejecucin, cuando se activa la unidad de programa
type VECTOR is array (INTEGER range <>);
A: VECTOR(1..N);
B: VECTOR(1..M);
N y M son enlazados a valores enteros en tiempo de
ejecucin
65
Sintaxis y Semntica del Lenguaje - 2010
C5:
Incorporando Comportamiento Dinmico
type VECTOR is array (INTEGER range <>);
A: VECTOR(1..N);
B: VECTOR(1..M);
N y M son enlazados a valores enteros en tiempo de
ejecucin
En tiempo de traduccin
Es posible reservar espacio en el RA para el descritpor del array
dinmico
El descriptor incluye una celda donde se almacena un puntero al
rea de almacenamiento del array dinmico y otras para los lmites
inferiores y superiores del array
Los accesos al array son traducidos de manera indirecta
a travs del puntero en el descriptor
Sintaxis y Semntica del Lenguaje - 2010
C5:
Incorporando Comportamiento Dinmico
En tiempo de ejecucin,
Se asigna el espacio para
los datos cuyo tamao se conoce de manera esttica y
los descriptores de arrays dinmicos
Cuando se localiza una declaracin de array dinmico
se actualizan las dimensiones del array en el descriptor
se extiende el RA (se incrementa FREE) para incluir espacio para
el array
se actualiza el puntero en el descriptor para que apunte al rea
asignada al array
66
Sintaxis y Semntica del Lenguaje - 2010
C5:
Incorporando Comportamiento Dinmico
Acceso a los elementos de A son traducidos como referencias
indirectas
Asumiendo que
el descriptor de A est en el desplazamiento m, las celdas de offset
m+1, m+2 contienen los lmites inferiores y superiores del array.
cada entero ocupa un espacio de D
I es una variable local almacenada en el offset s,
La instruccin
A[I] = 0
se traduce como:
set D[D[0]+m]+D[D[0]+s], 0
Sintaxis y Semntica del Lenguaje - 2010
C5: Asignacin de datos dinmicos
Asignacin dinmica de memoria
Asigna una estructura con tres campos, info, left y right.
Esta estructura es accesible mediante el puntero n
No puede alojarse en el stack (variables no-locales)
67
Sintaxis y Semntica del Lenguaje - 2010
C5: Asignacin de datos dinmicos
Se asigna espacio de manera dinmica en D iniciando
desde el final del espacio de direcciones.
Esta rea se denomina heap
Sintaxis y Semntica del Lenguaje - 2010
Pasaje de parmetros
Permite la transferencia de datos entre Unidades de
Programas
La mayora de los lenguajes de programacin usan un mtodo
posicional para asociar los parmetros actuales a los formales en
las llamadas a los subprogramas
subprogram S (F1,F2,....,Fn);
.
.
.
end S;
call S (A1,A2,......,An);
el mtodo posicional implica que los parmetros formales Fi
se asociarn a los parmetros actuales Ai, i=1,2,...,n
68
Sintaxis y Semntica del Lenguaje - 2010
Parmetros de Datos
Llamada por referencia
Llamada por copia
Llamada por valor
Llamada por resultado
Llamada por valor-resultado
Llamada por nombre
Sintaxis y Semntica del Lenguaje - 2010
Parmetros de Datos
Llamada por referencia
La unidad llamadora pasa a la unidad llamada la direccin del
parmetro actual (el cual est en el ambiente de la unidad
llamadora)
Se comparte la variable transmitida
Si el parmetro no es una variable
la unidad llamada recibe la direccin de una posicin temporal que
contiene el valor del parmetro actual.
algunos lenguajes tratan esta situacin como un error.
69
Sintaxis y Semntica del Lenguaje - 2010
Parmetros de Datos: Llamada por
Referencia
int a =15;
main () {
f(a);
}
void f(int j) {
int x;
while (j>0) {
read(x);
j:= j-x;
}
}
Considerando el parmetro j por referencia
Entonces:
a d[global,0]
PRf d[f,0]
LDf d[f,1]
j d[f,2]
x d[f,3]
Traduccin de f(a):
c[main,1] : set D[1], ip + 5
c[main,2] : set D[1]+1, D[0]
c[main,3] : set D[1]+2, &d[global,0]
c[main,4] : set 0, D[1]
c[main,5] : set 1, D[1] + AR
c[main,6] : jump &c[f,0]
copia la direccin de a en
el parmetro j
se reserva un lugar para el
parmetro j en el RA de f
Traduccin de j=j-x:
c[f,2] : set D[0]+2, D[D[D[0]+2]]] - D[D[0]+3]]
acceso indirecto mediante j
Sintaxis y Semntica del Lenguaje - 2010
Parmetros de Datos
Llamada por copia
Los parmetros formales actan como variables locales de la unidad
llamada y no comparten almacenamiento con los parmetros actuales
Protege a la unidad llamadora de modificaciones inadvertidas de los
parmetros actuales
Llamada por valor
la unidad llamadora evala los parmetros actuales, y estos valores se usan
para inicializar los parmetros formales, los cuales actan como variables
locales en la unidad llamada
Llamada por resultado
el valor de las variables locales correspondientes a los parmetros formales
no se estable en la llamada al procedimiento, pero su valor, al retorno, se
copia en la posicin del parmetro actual en el ambiente del llamador
Llamada por valor-resultado
las variables locales que denotan parmetros formales son inicializadas en
la llamada al subprograma (como en la llamada por valor) y al retorno,
copian sus valores a los parmetros (como en la llamada por resultado)
70
Sintaxis y Semntica del Lenguaje - 2010
Parmetros de Datos: Llamada por Copia
int a =15;
main () {
f(a);
}
void f(int j) {
int x;
while (j>0) {
read(x);
j:= j-x;
}
}
Considerando el parmetro j por copia valor
Entonces:
a d[global,0]
PRf d[f,0]
LDf d[f,1]
j d[f,2]
x d[f,3]
Traduccin de f(a) :
c[main,1] : set D[1], ip + 5
c[main,2] : set D[1]+1, D[0]
c[main,3] : set D[1]+2, d[global,0]
c[main,4] : set 0, D[1]
c[main,5] : set 1, D[1] + AR
c[main,6] : jump &c[f,0]
copia el valor de a en el
parmetro j
se reserva un lugar para el
parmetro j en el RA de f
Traduccin de j=j-x:
c[f,2] : set D[0]+2, D[D[0]+2]] - D[D[0]+3]]
acceso directo a j
Sintaxis y Semntica del Lenguaje - 2010
Parmetros de Datos
Llamada por nombre
Como en la llamada por referencia, un parmetro formal, mas
que ser una variable local del subprograma, denota un posicin
en al ambiente del llamador
A diferencia de la llamada por referencia, sin embargo, el
parmetro formal no se asocia a la posicin en el momento de la
llamada; sino que se asocia a una posicin (posiblemente
diferente) cada vez que es usado dentro del subprograma
71
Sintaxis y Semntica del Lenguaje - 2010
Parmetros de Datos
procedure swap (a,b: integer);
var temp: integer;
begin
temp:=a;
a:=b;
b:=temp
end swap;
Si se lo llama con swap (i, a[i]) y a y b son parmetros por nombre
La regla de sustitucin especifica que las sentencias a ser ejecutadas son:
temp:=i;
i:=a[i];
a[i]:=temp;
Si i=3 y a[3]=4 antes de la llamada, luego de la llamada i=4, a[4]=3 y
a[3] queda sin modificar

Potrebbero piacerti anche