Mostrando entradas con la etiqueta PRIMERA UNIDAD. Mostrar todas las entradas
Mostrando entradas con la etiqueta PRIMERA UNIDAD. Mostrar todas las entradas

domingo, 10 de febrero de 2013

1º UNIDAD




En la actualidad la ciencia y la tecnología están avanzando a pasos agigantados llevándonos así a conocer tecnologías que nunca nos hubiéramos imaginado conocer.
Hoy en día la computadora ya no es un lujo sino que es una necesidad, ya que ésta nos ayuda a terminar trabajos o deberes de una forma más rápida y precisa.
Es por eso que éste trabajo de investigación se enfocó a presentar  cuáles son los tipos de lenguajes, cómo se iniciaron, quienes las crearon y cómo funcionan.
Y también definición e historia del lenguaje C

1.   LENGUAJE DE PROGRAMACIÓN                                                                                                           
1.1 DEFINICIÓN

   Un lenguaje de programación es un  idioma artificial  diseñado para expresar procesos que pueden ser llevadas a cabo por máquinas como las computadoras.
   Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana.
   Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación.
   También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:
·         El desarrollo lógico del programa para resolver un problema en particular.
·         Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).
·         Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.
·         Prueba y depuración del programa.
·         Desarrollo de la documentación. 
1.2       HISTORIA 
   Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico conocido como código máquina, el cual la máquina comprende fácilmente, pero que lo hace excesivamente complicado para las personas. De hecho sólo consiste en cadenas extensas de números 0 y 1.
   Para facilitar el trabajo, los primeros operadores de computadoras decidieron hacer un traductor para reemplazar los 0 y 1 por palabras o abstracción de palabras y letras provenientes del inglés; éste se conoce como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). El lenguaje ensamblador sigue la misma estructura del lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números.
   La necesidad de recordar secuencias de programación para las acciones usuales llevó a denominarlas con nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguaje ensamblador. Posteriormente aparecieron diferentes lenguajes de programación, los cuales reciben su denominación porque tienen una estructura sintáctica similar a los lenguajes escritos por los humanos, denominados también lenguajes de alto nivel.
   La primera programadora de computadora conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora.
   A finales de 1953, John Backus sometió una propuesta a sus superiores en IBM para desarrollar una alternativa más práctica al lenguaje ensamblador para programar la computadora central  IBM 704. El histórico equipo Fortran de Backus consistió en los programadores Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy Nutt, Robert Nelson, Irving Ziller, Lois Haibt y David Sayre.
   El primer manual para el lenguaje Fortran apareció en octubre de 1956, con el primer compilador Fortran entregado en abril de 1957. Esto era un compilador optimizado, porque los clientes eran reacios a usar un lenguaje de alto nivel a menos que su compilador pudiera generar código cuyo desempeño fuera comparable al de un código hecho a mano en lenguaje ensamblador.
   En 1960, se creó COBOL, uno de los lenguajes usados aún en 2010 en informática de gestión.
   A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método más eficiente para programarlas. Entonces, se crearon los lenguajes de alto nivel, como lo fue BASIC en las versiones introducidas en los microordenadores de la década de 1980. Mientras que una tarea tan sencilla como sumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará una sola sentencia.
1.3.1 LENGUAJES DE MÁQUINA
    En informática, cualquier lenguaje artificial que puede utilizarse para definir una secuencia de instrucciones para su procesamiento por un ordenador o computadora. Es complicado definir qué es y qué no es un lenguaje de programación. Se asume generalmente que la traducción de las instrucciones a un código que comprende la computadora debe ser completamente sistemática. Normalmente es la computadora la que realiza la traducción.
1.3.2  LENGUAJE DE BAJO NIVEL
    Se llaman de bajo nivel porque están muy cercanos al hardware del ordenador. Es necesario conocer a fondo la arquitectura de la máquina para la que se va a programar. El primer lenguaje de este tipo que se utilizó fue el lenguaje máquina, que consiste en un conjunto de instrucciones en binario, es decir, con ceros y unos, con los cuales se indica al ordenador qué hacer. Este lenguaje es muy complicado y la posibilidad de cometer errores es muy alta, por lo que ya no se utiliza. Para solventar estas dificultades apareció el lenguaje ensamblador, que consiste en asignar una abreviatura a cada instrucción en binario, de forma que sea más fácil recordarla y más difícil equivocarse. Sin embargo, con este lenguaje sigue siendo necesario conocer muy bien el hardware del ordenador.
1.3.4  LENGUAJES DE ALTO NIVEL
   Los primeros programas ensambladores producían sólo una instrucción en lenguaje de máquina por cada instrucción del programa fuente. Para agilizar la codificación, se desarrollaron programas ensambladores que podían producir una cantidad variable de instrucciones en lenguaje de máquina por cada instrucción del programa fuente
1.3.5  LENGUAJES COMPILADOS
   En informática, un lenguaje cuyos programas se traducen a código máquina antes de ejecutarse, a diferencia de un lenguaje interpretado, cuyos programas se traducen y ejecutan instrucción por instrucción.

1.3.6  LENGUAJES INTERPRETADOS
   Se puede también utilizar una alternativa programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar diferente de los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la corrida de compilación para utilizarlo en una corrida de producción futura, el
1.3.7 LENGUAJES DE PROGRAMACIÓN DECLARATIVOS
   Se les conoce como lenguajes declarativos en ciencias computacionales a aquellos lenguajes de programación en los cuales se le indica a la computadora qué es lo que se desea obtener o qué es lo que se está buscando, por ejemplo: Obtener los nombres de todos los empleados que tengan más de 32 años. Eso se puede lograr con un lenguaje declarativo como SQL.
1.3.7  LENGUAJE DE DESCRIPCIÓN DE MÁQUINA
   Lenguaje de programación, como el PostScript, que se utiliza para describir la salida a una impresora o a una pantalla, que a su vez usan las instrucciones del lenguaje de descripción de página para construir el texto y los gráficos para crear la imagen de la página. El lenguaje de descripción de página es como otros lenguajes de ordenador o computadora, con un flujo lógico de programa que permite una manipulación sofisticada de la salida.
1.3.8  LENGUAJE EXPERTO
 Visual C Lenguaje de programación desarrollado en 1972 por el estadounidense Dennis Ritchie en los Laboratorios Bell. Debe su nombre a que su predecesor inmediato había sido llamado lenguaje de programación B. Aunque muchos consideran que C es un lenguaje ensamblador más independiente de la máquina que un lenguaje de alto nivel, su estrecha asociación con el sistema operativo UNIX, su enorme popularidad y su homologación por el American National Standards Institute (ANSI) lo han convertido quizá en lo más cercano a un lenguaje de programación estandarizado en el sector de microordenadores o microcomputadoras y estaciones de trabajo. C es un lenguaje compilado que contiene un pequeño conjunto de funciones incorporadas dependientes de la máquina.
1.3.9 PASCAL
Lenguaje de programación imperativo, diseñado entre 1967 y 1971 por Niklaus Wirth. Se trata de un lenguaje compilado y estructurado, basado en el lenguaje ALGOL, que simplifica su sintaxis a la vez que incluye nuevos tipos de datos y estructuras, como subrangos, tipos de datos enumerados, archivos, registros y conjuntos.
1.3.10  VISUAL BASIC
    En informática, acrónimo de Beginners All-purpose Symbolic Instruction Code (Código de Instrucciones Simbólicas de Uso General para Principiantes). Se trata de un lenguaje de programación de alto nivel desarrollado por los estadounidenses John Kemeny y Thomas Kurtz en el Dartmouth College a mediados de la década de 1960. BASIC se ganó su enorme popularidad gracias sobre todo a dos implementaciones, Tiny BASIC y Microsoft BASIC, que convirtieron a este lenguaje en la primera lengua franca de los microordenadores o microcomputadoras
1.3.11 COBOL
  Programación  desarrollado entre 1959 y 1961 que utiliza como base el idioma inglés y que se caracteriza por su gran facilidad de lectura. Los programas escritos en COBOL, que es un lenguaje compilado, se clasifican en cuatro divisiones: Identification, Enviroment, Data y Procedure. La Identification division especifica el nombre del programa y contiene información general del programa como puede ser su autor, fecha en que se escribió y una pequeña descripción de su utilidad, así como cualquier otra documentación que el programador desee añadir. La Enviroment division especifica qué equipo o equipos se están utilizando, y los archivos empleados en el programa para la entrada y la salida. La Data division describe los datos utilizados en el programa. La Procedure division contiene la parte del procesamiento que dicta las acciones del programa
 1.3.12  LISP
 El LISP es un lenguaje interpretado, en el que cada expresión es una lista de llamadas a funciones. Este lenguaje se sigue utilizando con frecuencia en investigación y en círculos académicos, y fue considerado durante mucho tiempo el lenguaje modelo para la investigación de la inteligencia artificial.
1.3.13 JAVA
Este lenguaje define una máquina virtual independiente de la plataforma donde se ejecuta, que procesa programas, llamados Applets, descargados desde el servidor Web. Además, debido al modo de ejecución de los Applets, este lenguaje es muy seguro frente a la presencia y ataque de virus informáticos.
2.   LENGUAJE DE PROGRAMACIÓN TIPO  C 
2.1 DEFINICIÓN   
   C es un lenguaje de programación creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell como evolución del anterior lenguaje B, a su vez basado enBCPL.
   Al igual que B, es un lenguaje orientado a la implementación de Sistemas Operativos, concretamente Unix. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque también se utiliza para crear aplicaciones.
   Se trata de un lenguaje fuertemente tipificado de medio nivel pero con muchas características de bajo nivel. Dispone de las estructuras típicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C o acceder directamente a memoria o dispositivos periféricos.
   La primera estandarización del lenguaje C fue en ANSI, con el estándar X3.159-1989. El lenguaje que define este estándar fue conocido vulgarmente comoANSI C. Posteriormente, en 1990, fue ratificado como estándar ISO (ISO/IEC 9899:1990). La adopción de este estándar es muy amplia por lo que, si los programas creados lo siguen, el código es portátil entre plataformas y/o arquitecturas.

2.2  HISTORIA
2.2.1 DESARROLLO INICIAL

   El desarrollo inicial de C se llevó a cabo en los Laboratorios Bell de AT&T entre 1969 y 1973; según Ritchie, el periodo más creativo tuvo lugar en 1972. Se le dio el nombre "C" porque muchas de sus características fueron tomadas de un lenguaje anterior llamado "B".
   Hay muchas leyendas acerca del origen de C y el sistema operativo con el que está íntimamente relacionado, Unix. Algunas de ellas son:
·         El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space Travel. Habían estado jugando en el mainframe de su compañía, pero debido a su poca capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenían suficiente control sobre la nave para evitar colisiones con los asteroides. Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa máquina no tenía sistema operativo, así que decidieron escribir uno. Finalmente decidieron portar el sistema operativo del PDP-11 que había en su oficina, pero era muy costoso, pues todo el código estaba escrito en lenguaje ensamblador. Entonces decidieron usar un lenguaje de alto nivel y portátil para que el sistema operativo se pudiera portar fácilmente de un ordenador a otro. Consideraron usar B, pero carecía de las funcionalidades necesarias para aprovechar algunas características avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C.
·         La justificación para obtener el ordenador original que se usó para desarrollar Unix fue crear un sistema que automatizase el archivo de patentes. La versión original de Unix se desarrolló en lenguaje ensamblador. Más tarde, el lenguaje C se desarrolló para poder reescribir el sistema operativo.
   En 1973, el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix, originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. Éste fue uno de los primeros núcleos de sistema operativo implementados en un lenguaje distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en PL/I, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961).

2.2.2  EL C DE KERNIGHAN Y RITCHIE

   En 1978, Ritchie y Brian Kernighan publicaron la primera edición de El lenguaje de programación C, también conocido como La biblia de C. Este libro fue durante años la especificación informal del lenguaje. El lenguaje descrito en este libro recibe habitualmente el nombre de "el C de Kernighan y Ritchie" o simplemente "K&R C" (La segunda edición del libro cubre el estándar ANSI C, descrito más abajo).
El C de Kernighan y Ritchie es el subconjunto más básico del lenguaje que un compilador debe de soportar. Durante muchos años, incluso tras la introducción del ANSI C, fue considerado "el mínimo común denominador" en el que los programadores debían programar cuando deseaban que sus programas fueran transportables, pues no todos los compiladores soportaban completamente ANSI, y el código razonablemente bien escrito en K&R C es también código ANSI C válido.
En las primeras versiones del lenguaje, la definición de funciones se hacía mediante un 'prototipo de función' (function prototype), el cual indicaba al compilador el tipo de retorno de la función. Aunque este método tiene una gran desventaja respecto al nuevo, debido a que no comprueba el número ni el tipo en la lista de argumentos; en otras palabras, es mucho más fácil cometer errores al hacer una llamada a una función con argumentos incorrectos.
En los años siguientes a la publicación del C de Kernighan y Ritchie, se añadieron al lenguaje muchas características no oficiales, que estaba soportadas por los compiladores de AT&T, entre otros.

2.2.3  ANSI C e ISO C

A finales de la década de 1970, C empezó a sustituir a BASIC como lenguaje de programación de microcomputadores predominante. Durante la década de 1980 se empezó a usar en los IBM PC, lo que incrementó su popularidad significativamente. Al mismo tiempo, Bjarne Stroustrup empezó a trabajar con algunos compañeros de Bell Labs para añadir funcionalidades de programación orientada a objetos a C. El lenguaje que crearon, llamado C++, es hoy en día el lenguaje de programación de aplicaciones más común en el sistema operativo Microsoft Windows; mientras que C sigue siendo más popular en el entorno Unix. Otro lenguaje que se desarrolló en esa época, Objective C, también añadió características de programación orientada a objetos a C. Aunque hoy en día no es tan popular como C++, se usa para desarrollar aplicaciones Cocoa para Mac OS X.
En 1983, el Instituto Nacional Estadounidense de Estándares organizó un comité, X3j11, para establecer una especificación estándar de C. Tras un proceso largo y arduo, se completó el estándar en 1989 y se ratificó como el "Lenguaje de Programación C" ANSI X3.159-1989. Esta versión del lenguaje se conoce a menudo como ANSI C, o a veces como C89 (para distinguirla de C99).
En 1990, el estándar ANSI (con algunas modificaciones menores) fue adoptado por la Organización Internacional para la Estandarización (ISO) en el estándar ISO/IEC 9899:1990. Esta versión se conoce a veces como C90. No obstante, "C89" y "C90" se refieren en esencia al mismo lenguaje.
Uno de los objetivos del proceso de estandarización del ANSI C fue producir una extensión al C de Kernighan y Ritchie, incorporando muchas funcionalidades no oficiales. Sin embargo, el comité de estandarización incluyó también muchas funcionalidades nuevas, como prototipos de función, y un preprocesador mejorado. También se cambió la sintaxis de la declaración de parámetros para hacerla semejante a la empleada habitualmente en C++:

2.2.4   C99
Tras el proceso de estandarización de ANSI, la especificación del lenguaje C permaneció relativamente estable durante algún tiempo, mientras que C++ siguió evolucionando. Sin embargo, el estándar continuó bajo revisión a finales de la década de 1990, lo que llevó a la publicación del estándar ISO 9899:1999 en 1999. Este estándar se denomina habitualmente "C99". Se adoptó como estándar ANSI en marzo de 2000.
El compilador GCC, entre muchos otros, soportan hoy en día la mayoría de las nuevas características de C99. Sin embargo, este nuevo estándar ha tenido poca acogida entre algunos desarrolladores de compiladores, como Microsoft y Borland, que se han centrado en C++. Brandon Bray, de Microsoft, dijo a este respecto:
"En general, hemos visto poca demanda de muchas características de C99. Algunas características tienen más demanda que otras, y consideraremos incluirlas en versiones futuras siempre que sean compatibles con C++."
2.2.5   C11
C11 (antes conocido como C1X) es un nombre informal para ISO/IEC 9899:2011, el último estándar publicado para C. El borrador final, N1570, fue publicado en abril de 2011. El nuevo estándar superó su última revisión el 10 de octubre de 2011 y fue oficialmente ratificado por la ISO y publicado el 8 de diciembre de 2011.
2.3 CARACTERÍSTICAS
·         Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas.
·         Es un lenguaje muy flexible que permite programar con múltiples estilos. Uno de los más empleados es el estructurado "no llevado al extremo" (permitiendo ciertas licencias de ruptura).
·         Un sistema de tipos que impide operaciones sin sentido.
·         Usa un lenguaje de preprocesado, el preprocesador de C, para tareas como definir macros e incluir múltiples archivos de código fuente.
·         Acceso a memoria de bajo nivel mediante el uso de punteros.
·         Interrupciones al procesador con uniones.
·         Un conjunto reducido de palabras clave.
·         Por defecto, el paso de parámetros a una función se realiza por valor. El paso por referencia se consigue pasando explícitamente a las funciones las direcciones de memoria de dichos parámetros.
·         Punteros a funciones y variables estáticas, que permiten una forma rudimentaria de encapsulado y polimorfismo.
·         Tipos de datos agregados (struct) que permiten que datos relacionados (como un empleado, que tiene un id, un nombre y un salario) se combinen y se manipulen como un todo (en una única variable "empleado").


LÍNEA DEL TIEMPO (historia del lenguaje C)


MANEJO DE MEMORIA Y PALABRAS RESERVADAS


1.   EL MANEJO DE MEMORIA EN EL LENGUAJE C

Todos los objetos tienen un tiempo de vida, es decir, el tiempo durante el cual se garantiza que el objeto exista. Las variables globales y las variables locales declaradas con el especificador static tienen duración estática. Se crean antes de que el programa inicie su ejecución y se destruyen cuando el programa termina. Las variables locales no static tienen duración automática. Se crean al entrar al bloque en el que fueron declaradas y se destruyen al salir de ese bloque. Duración asignada se refiere a los objetos cuya memoria se reserva de forma dinámica. Como se explicó anteriormente, esta memoria se crea y se debe liberar de forma explícita. Los arreglos de longitud variable de C99 son un caso especial. Tienen duración automática, con la particularidad de que son creados a partir de su declaración.
La biblioteca estándar de C proporciona las funciones malloc, calloc, realloc y free para el manejo de memoria dinámica. Estas funciones están definidas en el archivo de cabecera stdlib.h.
Los datos se almacenan en uno de los tres segmentos de memoria que el programador dispone. La zona estática para datos, que permite almacenar variables globales durante la ejecución de un programa.
El stack que permite almacenar los argumentos y variables locales durante la ejecución de las funciones.
El heap que permite almacenar variables adquiridas dinámicamente durante la ejecución de un programa.
1.1  MANEJO ESTÁTICO DE LA MEMORIA.
La zona estática para datos, permite almacenar variables globales y estáticas.
Si se encuentra una variable definida fuera de las funciones, se la considera global; el compilador le asigna un espacio determinado y genera la referencia para accesarla en la zona estática. El tamaño de las variables no puede cambiarse durante la ejecución del programa, es asignado en forma estática.
El tiempo de vida de las variables de la zona estática es la duración del programa.
Estas variables son visibles para todas las funciones que estén definidas después de ellas.
Si se precede con la palabra static a una variable local a una función, ésta también es ubicada en la zona estática, y existe durante la ejecución del programa; no desaparece al terminar la ejecución de la función, y conserva su valor, entre llamados a la función.
1.1.1 MEMORIA ESTÁTICA
Es el espacio en memoria que se crea al declarar variables de cualquier tipo de dato (primitivas [int,char...] o derivados [struct,matrices,punteros...]). Este tipo de memoria no puede cambiarse una vez es declarada, y tampoco liberarse cuando ya no es necesaria, consumiendo de esta forma recursos innecesariamente.
1.2  MANEJO DINÁMICO DE LA MEMORIA EN C
El compilador asigna un espacio determinado para las variables y genera las referencias para accesar a las variables del stack y de la zona estática. El tamaño de las variables no puede cambiarse durante la ejecución del programa, es asignado en forma estática.
El tiempo de vida de las variables de la zona estática es la duración del programa; las variables denominadas automáticas, o en la zona del stack, existen durante la ejecución de la función que las referencia. Los frames en el stack, son asignados y desasignados en forma dinámica durante la ejecución de las funciones; pero en forma automática, el programador no tiene responsabilidad en ese proceso.
En el heap el programador debe solicitar la asignación de espacio, establecer las referencias entre el espacio asignado y las variables en las otras zonas, liberar el espacio, desasignar las referencias. Cualquier equivocación lleva a errores, en tiempo de ejecución, difíciles de depurar.
Este mecanismo permite al programador tener un mayor control de la memoria, tanto en tamaño como en tiempo de vida, pero al mismo tiempo le da la responsabilidad de administrarla correctamente. Un arreglo en la zona estática debe ser definido con un tamaño determinado, el cual no puede cambiar durante la ejecución del programa, sin embargo en el heap se puede solicitar un arreglo del tamaño que se desee, siempre que no exceda el tamaño máximo asignado al heap.
Escribir programas que manejen el heap es notablemente más difícil, por esta razón lenguajes más modernos efectúan automáticamente la programación del heap, y no le permiten al programador realizar esta tarea.  Algunos errores de programas que manejan el heap, compilan correctamente, sin embargo al ejecutarlos se producen errores difíciles de depurar.
1.2.1 MEMORIA DINÁMICA
Es memoria que se reserva en tiempo de ejecución. Su principal ventaja frente a la estática, es que su tamaño puede variar durante la ejecución del programa.(En C, el programador es encargado de liberar esta memoria cuando no la utilice más). El uso de memoria dinámica es necesario cuando a priori no conocemos el número de datos/elementos a tratar; sin embargo es algo más lento, pues es en tiempo de ejecución cuando se determina la memoria a usar. En contrapartida la memoria estática es más rápida ya que está disponible desde que se inicio el programa.
1.2.1.1 DIFERENCIAS, VENTAJAS Y DESVENTAJAS
La memoria reservada de forma dinámica suele estar alojada en el heap o almacenamiento libre, y la memoria estática en el stack o pila (con excepción de los objetos de duración estática, que se verán más adelante, los cuales normalmente se colocan en una zona estática de datos). La pila generalmente es una zona muy limitada. El heap, en cambio, en principio podría estar limitado por la cantidad de memoria disponible durante la ejecución del programa y el máximo de memoria que el sistema operativo permita direccionar a un proceso. La pila puede crecer de forma dinámica, pero esto depende del sistema operativo. En cualquier caso, lo único que se puede asumir es que muy probablemente dispondremos de menor espacio en la pila que en el heap.
Otra ventaja de la memoria dinámica es que se puede ir incrementando durante la ejecución del programa. Esto permite, por ejemplo, trabajar con arreglos dinámicos. Aunque en C, a partir del estándar C99 se permite la creación de arreglos cuyo tamaño se determina en tiempo de ejecución, no todos los compiladores implementan este estándar. Además, se sigue teniendo la limitante de que su tamaño no puede cambiar una vez que se especifica, cosa que sí se puede lograr asignando memoria de forma dinámica.
Una desventaja de la memoria dinámica es que es más difícil de manejar. La memoria estática tiene una duración fija, que se reserva y libera de forma automática. En contraste, la memoria dinámica se reserva de forma explícita y continúa existiendo hasta que sea liberada, generalmente por parte del programador.
La memoria dinámica puede afectar el rendimiento. Puesto que con la memoria estática el tamaño de las variables se conoce en tiempo de compilación, esta información está incluida en el código objeto generado, por lo cual el proceso es muy eficiente. Cuando se reserva memoria de manera dinámica, se tienen que llevar a cabo varias tareas, como buscar un bloque de memoria libre y almacenar la posición y tamaño de la memoria asignada, de manera que pueda ser liberada más adelante. Todo esto representa una carga adicional, aunque esto depende de la implementación y hay técnicas para reducir su impacto.
1.2.1.2  RESERVA DE MEMORIA
.La función g_malloc posibilita la reserva de una zona de memoria, con un número de bytes que le pasemos como parámetro. Además, también existe una función similar llamada g_malloc0 que, no sólo reserva una zona de memoria, sino que, además, llena esa zona de memoria con ceros, lo cual nos puede beneficiar si se necesita un zona de memoria totalmente limpia.gpointer g_malloc (gulong numero_de_bytes );gpointer g_malloc0 (gulong numero_de_bytes );Existe otro conjunto de funciones que nos permiten reservar memoria de una forma parecida a cómo se hace en los lenguajes orientados a objetos.
1.2.1.3  LIBERACIÓN DE MEMORIA.
 Cuando se hace una reserva de memoria con g_malloc y, en un momento dado, el uso de esa memoria no tiene sentido, es el momento de liberar esa memoria. Y el sustituto de free es g_freeque, básicamente, funciona igual que la anteriormente mencionada. Void g_free (gpointer memoria_reservada);
1.2.1.4  REALOJAMIENTO DE MEMORIA
 En determinadas ocasiones, sobre todo cuando se utilizan estructuras de datos dinámicas, es necesario ajustar el tamaño de una zona de memoria (ya sea para hacerla más grande o más pequeña). Para eso, GLib ofrece la función g_realloc, que recibe un puntero a memoria que apunta a una región que es la que será acomodada al nuevo tamaño y devuelve el puntero a la nueva zona de memoria. El anterior puntero es liberado y no se debería utilizar más: gpointer g_realloc (gpointer memoria_reservada, gulong numero_de_bytes).

1.2.2  FUNCIONES
1.2.2.1 MALLOC
La función malloc reserva un bloque de memoria y devuelve un puntero void al inicio de la misma. Tiene la siguiente definición:
void *malloc(size_t size);
donde el parámetro size especifica el número de bytes a reservar. En caso de que no se pueda realizar la asignación, devuelve el valor nulo (definido en la macro NULL), lo que permite saber si hubo errores en la asignación de memoria.
Ej.:
int*puntero;

char*puntcarc;

puntero=(int*)malloc(4);

puntcarc=(char*)malloc(200);
A continuación se muestra un ejemplo de su uso:
int*i;
…
/* Reservamos la memoria suficiente para almacenar un int y asignamos su dirección a i */

i =malloc(sizeof(int));

/* Verificamos que la asignación se haya realizado correctamente */
if(i  == NULL){
/* Error al intentar reservar memoria */
}
Uno de los usos más comunes de la memoria dinámica es la creación de vectores cuyo número de elementos se define en tiempo de ejecución:
int*vect1, n;
printf("N£mero de elementos del vector: ");
scanf("%d",&n);

/* Reservar memoria para almacenar n enteros */
vect1 =malloc(n *sizeof(int));

/* Verificamos que la asignación se haya realizado correctamente */
if(vect1  == NULL){
/* Error al intentar reservar memoria */
}
1.2.2.2  CALLOC
La función calloc funciona de modo similar a malloc, pero además de reservar memoria, inicializa a 0 la memoria reservada. Se usa comúnmente para arreglos y matrices. Está definida de esta forma:
void *calloc(size_t nmemb, size_t size);
El parámetro nmemb indica el número de elementos a reservar, y size el tamaño de cada elemento. El ejemplo anterior se podría reescribir con calloc de esta forma:
int*vect1, n;
printf("N£mero de elementos del vector: ");
scanf("%d",&n);

/* Reservar memoria para almacenar n enteros */
vect1 =calloc(n,sizeof(int));

/* Verificamos que la asignación se haya realizado correctamente */
if(vect1  == NULL){
/* Error al intentar reservar memoria */
}
1.2.2.3  REALLOC
La función realloc redimensiona el espacio asignado de forma dinámica anteriormente a un puntero. Tiene la siguiente definición:
void *realloc(void *ptr, size_t size);
Donde ptr es el puntero a redimensionar, y size el nuevo tamaño, en bytes, que tendrá. Si el puntero que se le pasa tiene el valor nulo, esta función actúa como malloc. Si la reasignación no se pudo hacer con éxito, devuelve un puntero nulo, dejando intacto el puntero que se pasa por parámetro. Al usar realloc, se debería usar un puntero temporal. De lo contrario, podríamos tener una fuga de memoria, si es que ocurriera un error en realloc.
Ejemplo de realloc usando puntero temporal:
/* Reservamos 5 bytes */
void*ptr=malloc(5);
…
/* Redimensionamos el puntero (a 10 bytes) y lo asignamos a un puntero temporal */
void*tmp_ptr =realloc(ptr,10);

if(tmp_ptr== NULL){
/* Error: tomar medidas necesarias */
}
else{
/* Reasignación exitosa. Asignar memoria a ptr */
ptr=tmp_ptr;
}
Cuando se redimension la memoria con realloc, si el nuevo tamaño (parámetro size) es mayor que el anterior, se conservan todos los valores originales, quedando los bytes restantes sin inicializar. Si el nuevo tamaño es menor, se conservan los valores de los primeros size bytes. Los restantes también se dejan intactos, pero no son parte del bloque regresado por la función.
1.2.2.4  FREE
La función free sirve para liberar memoria que se asignó dinámicamente. Si el puntero es nulo, free no hace nada. Tiene la siguiente definición:
void free(void *ptr);
El parámetro ptr es el puntero a la memoria que se desea liberar:
int*i;
i =malloc(sizeof(int));
…
free(i);
Una vez liberada la memoria, si se quiere volver a utilizar el puntero, primero se debe reservar nueva memoria con malloc o calloc:
int*i =malloc(sizeof(int));
…
free(i);

/* Reutilizamos i, ahora para reservar memoria para dos enteros */
i =malloc(2*sizeof(int));
…
/* Volvemos a liberar la memoria cuando ya no la necesitamos */
free(i); 

2.   PALABRAS RESERVADAS

Las palabras reservadas son identificadores predefinidos (tienen un significado especial). En todos los lenguajes de programación existe un conjunto de palabras reservadas.
El lenguaje de programación C se reserva el uso de algunas palabras como identificadores internos clave para sus tipos de datos, estructuras de control,sus instrucciones y otras funciones y características propias del lenguaje. Por esta razón no es posible usarlos como identificadores de variables, de funciones o de cualquier otro objeto. Los editores de texto modernos las resaltan automáticamente para hacer los programas más legibles. A continuación una lista de dichas palabras.

auto - break - case - char - const - continue - default - do - double - else - enum - extern - float - for - goto - if - int - long - register - return - short - signed - sizeof - static - struct - typedef - union - unsigned - void - volatile – while.