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