Sie sind auf Seite 1von 20

Lenguajes de Programacin - Louden

1.1 Qu es un lenguaje de programacin?


Un lenguaje de programacin es un sistema notacional para describir computaciones en una
forma legible tanto para la mquina como para el ser humano.
Para que un lenguaje resulte legible para la mquina, debe tener una estructura lo
suficientemente simple para que permita una traduccion eficiente.
1.2 Abstracciones en los lenguajes de programacin
Las abstracciones de datos resumen las propiedades de los datos, como cadenas de
caracteres, numeros o arboles de busqueda. Las abstracciones de control resumen
propiedades de transferencia de control, de la modificacion de la trayectoria de ejecucin de un
programa con base en una situacin determinada.
Las abstracciones bsicas renen la informacin de mquina ms localizada. Las
abstracciones estructuradas renen informacin ms global sobre la estructura del programa.
Las abstracciones unitarias reunen informacin sobre alguna parte completa de un programa.
1.2.1 Abstracciones de datos
Abstracciones bsicas: resumen la representacin interna de valores de datos comunes en una
computadora. Las localizaciones en la memoria de la computadora que contienen valores de
datos se abstraen dndoles un nombre y se conocen como variables.
Abstracciones estructuradas: La estructura de los datos es el mtodo principal para la
abstraccin de colecciones de datos relacionados entre s. El arreglo rene datos en una
secuencia de elementos de indizacin individual.
Abstracciones unitarias: En un programa grande es til y necesario reunir cdigos relaciones
entre s. Una propiedad es la reutilizacin. Estas abstracciones representan componentes
(piezas operacionlamente completas de un programa o de una interface de usuario) o
contenedores (estructuras de datos que a su vez contienen otros definidios previamente por el
usuario).
1.2.2 Abstracciones de control.
Abstracciones bsicas: combinan unas cuantas instrucciones de mquina en una sentencia
abstracta ms comprensible. (enunciado de asignacin x = 3;)
Abstracciones estructuradas: dividen un programa en grupos de instrucciones que estn
anidads dentro de purebas que gobiernan su ejecucin (if, switch, etc).
Abstracciones unitarias: Son abstracciones de control que tienen como fin, incluir una coleccin
de procedimientos que proporcionan servicios relacionados lgicamente con otras partes del
programa y que forman una parte unitaria, o independiente del programa. Estos procedimientos
pueden reunirse en una unidad de programa que puede traducirse por separado y usarse por
otras partes del programa mediante un interfaz cuidadosamente controlada.
1.4 Definicin de lenguaje
Sintaxis del lenguaje: Es la descripcion de las maneras en que las diferentes partes del
lenguaje pueden ser combinadas para formar otras partes. La estructura lxica es la estructura
de las palabras del lenguaje o tokens.
Semntica del lenguaje: Es el significado.
1.5 Traduccin del lenguaje
Un traductor que ejecuta un programa directamente se conoce como intrprete, y un traductor
que produce un programa equivalente en una forma adecuada para su ejecucin se conoce
como compilador.
Los pseudointerpretes procesan la totalidad del programa fuente antes de que se inicie la
ejecucin.
Etapas:
Analizador lxico (logra una secuencia de caracteres mas fcil de procesar) Analizador
sintctico (determina la estructura de la secuencia de los tokens proporcionados por el
analizador lxico) Analizador semntico (determina el significado, como para permitir la
ejecucin o generacin del programa objetivo).
Un preprocesador, puede ser ejecutado antes de la traduccin para transformar un programa
en alguna forma adecuada para su traduccin.
Las propiedades de un lenguaje que pueden ser determinadas antes de la ejecucin, son
propiedades estticas (su parte lxica y sintctica). Y las que son durante su ejecucin,
se llaman propiedades dinmicas. Un lenguaje ms dinmico, es mas adecuado para la
interpretacin. Los lenguajes imperativos, han sido de tener mas propiedas estticas y se los
ha compilado.
Los compiladores pueden elevar la eficiciencia del cdigo objetivo al hacer optmizaciones.
Puede requerir varias pasadas. Un traductor debera intentar corregir errores.
Los errores semnticos pueden ser estticos (tipos incompatibles o variables no declaradas) o
dinmicos (un subndice fuera de rango o la divisin por cero).
Finalmente un traductor necesita proporcionar opciones para la correccin de errores; como
son: especificacin de archivos para la inclusin, deshabilitacin de optmizaciones, o la
activacin de rastreo o de depuracin de la informacin, forman la pragmtica de un traductor
de lenguaje.
3.1 Historia y criterios de diseo
Capacidad de escritura: la cualidad de un lenguaje que le permite a un programador su uso
para expresar una computacin con claridad, correccin de manera concisa y con rapidez.
Legibilidad: cualidad de un lenguaje que le permite a un programador comprender y entender
de manera fcil y con precisin la naturaleza de una computacin.
El diseo del lenguaje debe ser tal que un traductor pueda generar un cdigo ejecutable
eficiente (optmizabilidad).
Eficiencia de traduccin: Permite el diseo del lenguaje que el cdigo fuente se traduzca con
eficiencia: con rapidez y con un traductor de tamao razonable= La verificacin de errores
puede ser un problema grave de eficiencia.
Implementacin: es la eficiencia con la que se puede escribir un traductor.
Eficiencia de programacin: Que tan rpida y fcilmente se pueden escribir programas en el
lenguaje? Est conectado con la expresin del lenguaje: Qu tan fcil es expresar procesos
y estructuras complejas? Con qu facilidad se puede correlacionar el diseo en la cabeza del
programador con el cdigo real?
3.3 Regularidad
Expresa lo bien que estn integradas las caractersticas del mismo -una mayor regularidad
implica pocas restricciones no usuales en el uso de constructores particulares, menos
interacciones raras entre dichos constructores y menos sorpresas en la forma en la que se
comportan las caractersticas del lenguaje.
Generalidad: se logra eliminando casos especiales en la disponibilidad y uso de los
constructores y combinando constructores ntimamente relacionados en uno solo ms general.
C carece de procedimientos anidados, por lo tanto carece de generalidad. Pero permite
parmetros, variables y valores devueltos de procedimientos.
C posee arreglos de longitud variable.
En C no se puede comparar 2 arreglos utilizando el operador ==.
Ortogonalidad : significa que los constructores del lenguaje se pueden combiar en cualquier
forma sigfnicativa y que la interaccin de los constructores, o el contexto del uso, no debe
generar restricciones o comportamientos inesperados.
En C los valores de todos los tipos de datos, excepto los tipos de arreglos o matrices, pueden
ser devueltos de una funcin.
En C, las variables locales solamente pueden ser definidas al principio de un bloque.
En C, existe una no ortogonalidad en el paso de parmetros: C pasa todos los parmetros por
valor excepto los arreglos, que se pasan por referencia.
Uniformidad: cosas similares deben verse de forma similar y tener significados similares y, a la
inversa, las cosas diferentes deben verse diferentes.
3.4 Conceptos adicionales
Expresividad: Es la facilidad con la cual un lenguaje puede expresar procesos y estructuras
complejas.
Extensibilidad: Es el principio que indica que debera existir algn mecanismo general para que
el usuario pueda agregar caractersticas a un lenguaje
4.1 Estructura lxica de los lenguajes de programacin
El anlisis lxico rene en forma de tokens secuencias de caracteres del programa de entrada,
los cuales posteriormente se procesan mediante una fase de anlisis sintctico, lo que
determina la estructura sintctica.
Palabras reservadas (tokens: while, if)
Literales o constantes ( 42, hello)
Simbolos especiales ( ; + = )
Identificadores ( putchar )
double if; // es ilegal, porque if es token.
Los tokens se describen mediante expresiones regulares, que son descripciones de patrones
de caracteres.
5.2 Declaraciones, bloques y alcance
Las definiciones, son declaraciones que vinculan a todos los atributos potenciales.
double f (int x);
El bloque, consiste en una secuencia de declaraciones seguidas por una secuencia de
enunciados, y rodeado por marcadores sintcticos como son llaves.
El alcance de un vnculo es la regin del programa sobre la cual se conserva el vnculo. Queda
limitado al bloque en el cual aparece su declaracin asociada (alcance lxico).
La visibilidad incluye nicamente aquellas regiones de un programa donde las ligaduras de una
declaracin son aplicables, en tanto que el alcance incluye a los agujeros en el alcance.
int x = x +1; // no da error, se agrega uno al valor aleatorio de x
5.3 La tabla de smbolos
Es como un diccionario variable: debe darle apoyo a la insercin, bsqueda y cancelacin
de nombres con sus atributos asociados, representando las vinculaciones en declaraciones.
Requiere que las declaraciones sean procesadas en forma de pila: a la entrada de un
bloque, todas las declaraciones de dicho bloque se procesan y se agregan las vinculaciones
correspondientes a la tabla de smbolos.
En C, todas las definiciones de funcin son globales.
La tabla procesa las declaraciones de manera esttica. De otro modo, es el alcance dinmico.
Una declaracin struct realmente contiene una tabla de smbolos locales que es en s un
atributo (que contiene las declaraciones miebros), y esta tabla de smbolos local no puede
eliminarse hasta que la variable struct misma sea eliminada de la tabla de smbolos.
practicar:
struct A
{
int data;
struct A * next;
};
da bucle infinito.
5.5 Asignacin, tiempo de vida y el entorno
La tabla de smbolos, mantiene las ligaduras de los nombres con las localizaciones.
El entorno se puede construir estticamente, dinmicamente o ambos.
En un compilador las declaraciones son utilizadas para indicar el cdigo de asignacin
que el compilador tiene que generar conforme se procesa la declaracin. En un intrprete,
se combinan la tabla de smbolos y el entorno, por lo que la ligadura de atributos por una
declaracin en un intrprete incluye la ligadura de las localizaciones.
Las variables globales se asignan estticamente. Las variables locales, se asignan
dinmicamente. Durante la ejecucin de un cdigo, cuando se entra a cada uno de los bloques,
las variables declaradas al principio de cada bloque se asignan, y cuando se sale de cada
bloque, estas mismas variables se desasignan.
Cada vez que se llama a una funcin, es una activacin de ella y la regin correspondiente de
la memoria asignada como un registro de activacin.
Llamarermos la localizacin asignada a un objeto. Esto es, un objeto es un rea de
almacenamiento asignada en el entorno como resultado del procesamiento de una declaracin.
Las variables y los procedimientos son objetos en C. El tiempo de vida o extensin de un objeto
es la duracin de su asignacin en el entorno. las vidas de los objetos se pueden extender mas
all de la regin de un programa donde pueden ser objeto de acceso.
Un apuntador es un objeto cuyo valor almacenado es una referencia a otro objeto.
int* x;
x = (int*) malloc(sizeof(int)); asigna una nueva variable entera y al mismo tiempo asigna
su localizacin en el valor de x. La funcin malloc devuelve la localizacin que asigna y debe
drsele el tamao de los datos al cual asigna espacio.
practicar:
*x = 2;
printf(%d\n,*x);
imprime 2
La asignacin en el montn por lo general se conoce como asignacin dinmica. La asignacin
automtica, se basa en pilas.
Resumiendo, hay 3 tipos de asignaciones:
Esttica (para variables globales)
Automtico (para variables locales)
Dinmicos (para asignaciones de montones)
int f(void)
{ static int x;}
Ahora x se asigna nicamente una vez, y tiene el mismo significado (y valor) en todas las
llamadas a f.
5.6 Variables y constantes
5.6.1 Variables.
Es un objeto cuyo valor almacenado puede cambiar durante la ejecucin.
&x es un apuntador hacia x (hacia la direccin de x) y *&x es de nuevo x mismo.
*(&x + 1) = 2; es legal.
x = y; es asignacin por comparticin (comparten la misma direccin de memoria),. otro tipo es
por clonacin (se copia el objeto de y).
5.6.2 Constantes
Es como una variable, pero no tiene un atributo de localizacin, sino solamente un valor.
Una constante esttica es aquella cuyo valor se puede calcular antes de la ejecucin, en tanto
que una constante dinmica tiene un valor que se puede computar nicamente durante la
ejecucin.
5.7 Alias, referencias pendientes y basura.
5.7.1 Alias
Un alias ocurre cuando el mismo objeto est vinculado a dos nombres diferentes.
Practicar:
int *x, *y;
x = (int *) malloc(sizeof(int));
*x = 1;
y = x;
*y = 2;
printf(%d\n,*x); imprime 2
Los alias causan efectos colaterales dainos. Efecto colateral = Cualquier cambio en el valor de
una variable que persiste mas all de la ejecucin de un enunciado.
5.7.2 Referencias pendientes
Una referencia pendiente es una localizacin que ha sido desasignada del entorno, pero a la
que el programa puede tener todava acceso.
int *x, *y;
x = (int ]) malloc(sizeof(int));
]x = 2;
y = x; alias
free(x); ref pendiente
printf(%d\n,*y) ref ilegal
5.7.3 Basura
Es memoria que ha sido asignada en el entorno pero que se ha convertido en inaccesible para
el programa.
6 Tipos de datos
Lenguaje fuertemente tipificado = cuya verificacin de tipos es muy severa.
1. La informacin de tipos estticos mejora la eficiencia de la ejecucin
2. Utilizar tipos estticos mejora la eficiencia de traduccin
3. Verificacin de tipos estticos mejora la seguridad y la confiabilidad.
4. Mejora la seguridad y la confiabilidad.
5. Los tipos explcitos mejoran la legibilidad.
6. Los tipos explcitos permiten eliminar ambigedades.
7. Se pueden usar como una herramienta de diseo.
8. La tipificacin esttica mejora la consistencia y correccin de la interfaz.
Un tipo de datos es un conjunto de valores, junto con un conjunto de operaciones sobre dichos
valores y con ciertas propiedades.
El proceso por el cual pasa un intrprete para determinar si la informacin de tipos en un
programa es consistente se conoce como verificacin de tipos. El proceso de asignar tipos a
estas expresiones se conoce como inferencia de tipos.
Si una definicin de lenguaje de programacion especifica un sistema de tipos completo que
puede aplicarse estaicametne y que garantiza que todos los errores de corrupcion de datos
de un programa se detectaran lo mas pronto posible entonces se dice que el lenguaje est
fuertemente tipificado. Los errores de tipo se detectan en tiempo de traduccin.
C tiene incluso mas fallas y, por lo tanto, a veces se le conoce como un lenguaje debilmente
tipificado.
6.2 Tipos simples.
Tipos predefinidos, a partir de los cuales se construyen los demas tipos. Son principalmente
tipos simples, tipos que no tienen otra estructura que su aritmetica inherente o una estrucutra
secuencial. Los tipos enumerados son conjuntos cuyos elementos se denominan y se listan de
manera explcita.
enum Color {Red, Green, Blue};
6.3 Constructores de tipos:
Struct, union, etc.
Una union es discriminada si se le agrega una etqieuta o discriminador para distinguir el tipo de
elemento que es, de cual conjunto proviene.
En C, el tamao de un arreglo no puede ser una constante calculada, debe ser una literal. C
permite que los arreglos sin tamao especificado sean parmetros de funciones.
Si un parmetro es un arreglo multidimensional, entonces el tamao de todas las dimensiones,
a excepcin de la primera debe especificarse en la declaracin del parmetro:
int array_max (int a[][20] , int size).. se requiere el tamao de la 2da
En C podemos definir un tipo de funcin de enteros a enteros:
typedef int (*IntFunction)(int);
6.3.5 Tipos apuntador y recursivos
typedef int* IntPtr;
construye el tipo de todas las direcciones en que haya enteros almacenados.
Referencia = direccin de un objeto bajo el control del sistema, que no se puede utilizar como
valor u operar en forma alguna (aunque se puede copiar) en tanto que un apuntador puede
utilizarse como valor y el programador puede manipularlo.
struct CharList
{
char data;
struct CharList next; // no es correcto!
};
Todos los tipos deben tener un tamao fijo, el cual se determina en tiempo de traduccin.
struct CharListNode
{
char data;
struct CharListNode* next; // ahora es correcto
};
typedef struct CharListNode* CharList;
Tipos de datos en C
Derivados:
Apuntador
Arreglo
Funcin
struct
union
Bsicos:
void
Numrico:
integral
signed
unsigned
char
int
short int
long int
enum
Flotante
float
double
long double
6.5 Equivalencia de tipos
Dos tipos de datos son iguales si tienen la misma estructura y si tienen los mismos nombres.
struct RecA { char x; int y;};
struct RecB { char a; int b;};
no son iguales (tendran que usar diferentes nombres para accesar los datos de los miembros).
Ejemplo.
struct RecA
{
char x;
int y;
};
typedef struct RecA RecA;
struct RecA a;
RecA b;
struct RecA c;
struct {
char x;
int y;
} d;
a, b, c y d son equivalentes estructuralmente. a y c son equivalentes en nombre. b y d no son
equivaentes en nombre a cualquier otra variable.
Dos tipos son iguales solo si tienen el mismo nombre y dos variables son equivalentes de tipo
solo si sus declaraciones usan exactamente el mismo nombre de tipo.
struct
{
char x;
int y;
} d;
struct
{
char x;
int y;
} e;
No son equivalentes en nombre (ya que se generan nuevos nombres internos para cada nuevo
struct).
Cuando se aplica un constructor de tipos struct o union se crea un nuevo tipo, no equivalente,
en tanto que cuando se aplica cualquier otro constructor de tipos, o cuando se utiliza typedef,
no se crea un nuevo tipo, sino uno equivalente a todos los otros tipos con una misma
estructura.
6.6 Verificacin de tipos
Es el proceso que sigue el intrprete para verficiar que todas las construcciones en un
programa tengan sentido en trminos de los tipos de sus constantes, variables, procedimientos
y otras entidades. En un lenguaje de tipificacion fuerte, deben localizarse todos los errores de
tipos antes de la ejecucin, por lo tanto deben hacer un tipificado esttico.
C aplica una verificacin esttica de tipos durante la traduccin, pero C no es un lenguaje con
tipificado fuerte, ya que muchas inconsistencias en los tipos no causan errores de compilacin,
sino que son eliminados al generar codigo de conversion presentando o no un mensaje de
advertencia.
Los tipos implicitos, no estn establecidos explicitamente en un programa, aunque las reglas
que definen sus tipos deben ser explicitas en la definicion del lenguaje.
x; // implicitamente entero
f (int x)
{ return x++} //implicitamente devuelve un entero
6.6.3 Tipos que se suporponen
Los tipos pueden superponerse cuando dos tipos contienen valores en comn. Es preferible
que los tipos sean conjuntos no conexos.
6.6.4 Operaciones compartidas
Los operadores estn sobrecargados cuando se se utiliza el mismo nombre para operaciones
que en esencia son diferentes.
6.7 Conversin de tipos
int x = 3;
x = 2.3 + x/ 2;
devuelve 3
Conversiones implcitas: 1 1.0 y 3.3 3
La conversin por extensin (int a double), es cuando el tipo de datos objetivo puede contener
toda la informacin que se convierte sin prdida de datos, en tanto que la conversin de double
a int es una conversin de restriccin, que puede involucrar prdida de datos.
La conversin explticta es cuando las directrices de la conversin se escriben directamente en
el cdigo.
7 Control, Expresiones y enunciados
Una expresin devuelve un valor y no produce efectos colaterales. Un enunciado se ejecuta por
sus efectos colaterales y no devuelve ningn valor.
7.1 Expresiones
Un operador que toma un operando se conoce como operador unario.
Las funciones se escriben de forma prefija.
Si la evaluacin de una expresin no provoca efectos colaterales, esta dar el mismo resultado,
independientemente del orden en que se evalen las subexpresiones.
practicar
int x = 1;
int f(void)
{ x += 1;
return x;
}
int p (int a, int b)
{
return a + b;
}
main()
{ printf(%d\n, p(x,f()));
return 0;
}
imprime 4
Si los argumentos de la llamada a p en el printf son evaluados de izq a der, imprime 3. Si los
argumentos son evaluados de der a izq, imprime 4.
En C, una asignacin es una expresin. Y se evala de izq a der.
La evaluacin de orden normal de una expresin significa que todas las operaciones
comienzan a evaluarse antes de que sus operandos sean evaluados, y los operandos son
evaluados solo si son necesarios para el calculo del valor de la operacin.
8 Procedimientos y ambientes
La idea de un registro de activacin, como la coleccion de datos necesarios para mantener una
sola ejecucin de un procedimiento, es comun en virtualmente todos los ambientes en tiempo
de ejecucin.
8.2 Semntica de los procedimientos
Esta memoria asignada para los objetos locales del bloque se conoce como registro de
activacin del bloque, y se dice que el bloque est activado conforme se ejecuta bajo las
limitaciones establecidas por su registro de activacin.
Algunos procedimientos pueden depender solamente de parmetros y de caractersticas fijas
del lenguaje. Se llaman de forma cerrada, ya que no contienen dependencias no locales.
8.3 Mecanismos de paso de parmetros
8.3.1 Paso por valor.
Los argumentos son expresiones que se evalan en el momento de la llamada, y sus valores
se convierten en los valores de los parmetros durante la ejecucin del procedimiento.
Los parmetros de valor se comportan como valores constantes durante la ejecucin
del procedimiento, y puede interpretarse paso por valor como el reemplazo de todos los
parmetros en el cuerpo del procedimiento por los valores de los argumentos correspondientes.
En C, los arreglos son implicitamente apuntadores (hacia la primera ubicacin del arreglo)
8.3.2 Paso por referencia
Un argumento debe ser en principio una variable con una direccin asignada. Se pasa la
ubicacin de la variable de modo que el parmetro se convierte en una alias para el argumento,
y cualquier cambio que se le haga a ste lo sufre tambin el argumento.
void inc (int* x)
{
(*x)++;
}
int a;
inc(&a);
8.3.3 Paso por valor resultado
El valor del argumento es copiado y utilizado, y despus, cuando el procedimiento termina, el
valor final del parmetro se copia de regreso a la ubicacin del argumento. Se distingue del
paso por referencia, por la presencia de un alias.
void p(int x, int y)
{x++;
y++;
}
main()
{
int a = 1;
p(a,a);
}
a tiene el valor 3 si es por referencia y 2 si se usa valor resultado.
8.3.4 Paso por nombre y evaluacin retardada
La idea del paso por nombre es que no se evala el argumento hasta su uso real (como
parmetro) en el procedimiento llamado. Por lo que el nombre del argumento o su
representacin textual en el punto de la llamada, reemplaza el nombre del parmetro al cual
corresponde.
void inc(int x)
{ x++:}
si una llamada, digamos, inc(a[i]), se hace, el efecto es evaluar a[i]++. entonces si i cambiara
antes del uso de x en el interior de inc, el resultado sera diferente tanto del paso por referencia
como del paso por valor resultado:
int i;
int a[10];
void inc(int x)
{ i++; x++;}
main ()
{i=1;
a[1]=1;
a[2]=2;
p(a[i]);
return 0;
}
El texto de un argumento en el punto de llamada se considera como una funciona por su
propio derecho, misma que es evauada cada vez que se llega al nombre del parmetro
correspondiente en el cdigo del procedimiento llamado.
#include <stdio.h>
int i;
int p(int y)
{
int j = y;
i++;
return j+y;
}
void q(void)
{
int j =2;
i = 0;
printf(%d\n, p(i+j));
}
main()
{
q();
return 0;
}
( imprime 4)
i + j para la llamada a p desde q es evaluado cada vez que se encuentra el parmetro y en el
interio de p. La expresin i + j, es evaluada como si todava estuviera en el interior de q. por
tanto int j =y; produce 2. i++ es 1. return j+y producira 3. El pgm imprimiria 5 si usara paso por
nombre.
#include <stdio.h>
int i, j;
int i_plus_j(void){
return i+j;
}
int p(int (*y)(void))
{
int j = y();
i++;
return j+y();
}
void q(void)
{
int j =2;
i = 0;
printf(%d\n, p(i_plus_j));
}
main()
{
q();
return 0;
}
imprime 1.
sera una funcin llamada 'p' que devuelve un entero y recibe como arg. un
puntero a una funcin que devuelve un entero, y no recibe args.
Lo que indica que es un ptro a una funcin es esta forma de notacin: (*y)
lo que aparece a la dcha (void) indica que NO recibe args.
8.4.1 Ambientes totalmente estticos
Cada procedimiento o funcin tiene un registro de activacin fijo, que ha previsto espacio para
las variables y parmetros locales, as como la direccin de retorno para el regreso correcto de
las llamadas.
8.4.2 Ambientes de tiempos de ejecucin basados en pilas.
Las activaciones de bloques de procedimientos no pueden asignarse estticamente, ya que el
procedimiento puediera volver a ser llamado antes de haber salido de su activacin anterior y,
por lo tanto, debe crearse una nuva activacin en cada entrada del procedimiento.
Debe mantenerse un apuntador a la activacin presente, ya que cada procedimiento no tiene
una ubicacion fija para su registro de activacion. Se conoce como apuntador de ambiente o
ep. tambien debe tener un apuntador al registro de activacion del bloque desde el que entr
dicha activacion. Es necesario porque que cuando se sale de la activacion presente, se
retira el registro de activacion presente de la pila de los registros de activacion. El ep debe
restablecerse para que apunte a la activacion anterior, el ep viejo se conserva en el nuevo
registro de activacion (enlace de control o enlace dinmico)
Registro de activacin
enlace de control
direccin de retorno
parmetros pasados
variables locales
temporales
Las variables locales se ubican en el registro de activacin presente al cual ep apunta. Cada
variable puede ser ubicada en la misma posicin en el registro con relacin al principio del
mismo.
En C no es posible anidar procedimientos.
Enlace de acceso (o esttico), proporciona el acceso a las variables no locales.
8.4.3 ambientes dinmicos
Cualquier procedimiento que pueda devolver un apuntador a un objeto local, dar como
resultado una referencia pendiente al salir del procedmimento ya que el registro de activacin
del procedimiento habr sido desasignado de la pila.
int * dangle(void)
{
int x;
return &x;
}
En C, todos los procedimientos son globales.
En un ambiente dinmico, se eliminan los registros de activacin slo cuando ya no es posible
tener acceso a ellos desde el interior del programa en ejecucin. Debe llevar a cabo alguna
clase de recuperacion automtica de almacenamiento no accesible: conteos de referencia y
recoleccin de basura.
8.5 Administracin de la memoria dinmica
En C la asignacion y desasignacion automatica del almacenamiento ocurre unicamente para
los registros de activacion de una pila. Se asigna el espacio para un registro de activacion
cuando se llama a un procedimiento y desactiva cuando se sale del procedimiento.
8.5.1 Mantenimiento de espacio libre
Por lo general, un SO pone un bloque contiguo de memoria para uso de un pgm en ejecucin.
El espacio libre en el interior del bloque es conservado por una lista de bloques libres.
Al unirse, una lista libre puede quedar fragmentada. Es posible que falle la asignacion de un
bloque grande. Por ello, debe compactarse moviendo todos los bloques libres para unirlos y
crear un solo bloque.
Los ambientes dinmicos, eliminan los registros de activacin slo cuando ya no es posible
tener acceso a ellos desde el interior del programa en ejecucin. Debe llevar a cabo alguna
clase de recuperacin automtica de almacenamiento no accesible: conteos de referencia o
sino, recoleccin de basura.
8.5 Administracin de la memoria dinmica
En C, la asignacin y desasignacin automtica del almacenamiento ocurre nicamente para
los registros de activacin de una pila: se asigna el espacio para un registro de activacin
cuando se llama a un procedimiento y se desactiva cuando se sale del procedimiento.
8.5.2 Recuperacin de almacenamiento
Cada bloque de almacenamiento asignado contiene un campo de conteo adicional que
guarda el nmero de referencias del bloque en realacin con otros bloques. Cada vez que se
cambia una referencia, este conteo de referencia debe ser actualizado. Cuando el conteo de
referencias llega a cero, el bloque puede ser devuelto a la lista libre. Los conteos de referencia
deben ser decrementados recursivamente.
El metodo alterno a los conteos de referencia es marcar y barrer (perezoso): pospone la
recuperacin de cualquier almacenamiento hasta que el asignador se queda sin espacio,
y en ese momento busca todo el almacenamiento que puede referenciarse y mueve todo
el almacenamiento no referenciado de regreso a la lista libre. Lo hace en dos pasadas: la
1ra sigue todo los punteros de manera recursiva, iniciandose con el ambiente o la tabla de
smbolos actuales, y marca cada bloque de almacenamiento localizado.
La recoleccin de basura, aade un rea de almacenamiento permanentemente al esquema
de recuperacin del prrafo anterior. Los objetos asignados que sobrevivan lo suficiente
simplemente son copiados al espacio permanente y no son nunca desasignados durante
recuperaciones de almacenamiento subsecuentes.
http://es.wikipedia.org/wiki/Operadores_de_C_y_C%2B%2B
http://www.uaem.mx/posgrado/mcruz/cursos/lic/varydat.pdf
#include <stdio.h>
#include <string.h>
#include <conio.h>
enum type { H=1,
C=2 , S=4 , D=8 };
char* dish( int x ){
char buf[100]; char *p = buf; *p = 0;

if( x & D ) strcat( p, "rum-soaked " );

if( x & S ) strcat( p, "sugared " );

if( x & C ) strcat( p, "turkey " );

if( x & H ) strcat( p, "broccoli " );
printf("%s",p);

return p;
}
int main(){
printf( " \nplease pass the %s and the %s.", dish(6), dish(9));
getch();
return 0;
}
'p' es un puntero a char,no acumula, lo que hace e referencia una de las
cadenas de caracteres.
Esta asignacin: float z[]=v; es incorrecta, debe ser as: float *z=v; de
esta forma z toma la direcin base del arreglo v

Das könnte Ihnen auch gefallen