“Conoce C” Lenguaje de programación en C



Descargar 102.75 Kb.
Fecha de conversión09.03.2017
Tamaño102.75 Kb.

Conoce C”

Lenguaje de programación en C:

C se desarrolló originalmente por programadores para programadores. Sin embargo, ha alcanzado una popularidad enorme, y se ha usado en contextos muy alejados de la programación de sistemas, para la que se diseñó originalmente.

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 en BCPL.

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 débilmente 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 como ANSI 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. En la práctica, los programadores suelen usar elementos no-portátiles dependientes del compilador o del sistema operativo.

imagen13.jpg

Historia de C

  • 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 Programa para el B5000 de Burroughs, escrito en ALGOL en 1961).

  • 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" Kernighan y Ritchie introdujeron las siguientes características al lenguaje:

El tipo de datos struct.

El tipo de datos long int.

El tipo de datos unsigned int.

Los operadores =+ y =- fueron sustituidos por += y -= para eliminar la ambigüedad semántica de expresiones como i=-10, que se podría interpretar bien como i =- 10 o bien como i = -10.

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 estas primeras versiones de C, las únicas funciones que necesitaban ser declaradas si se usaban antes de la definición de la función eran las que retornaban valores no enteros. Es decir, se presuponía que una función que se usaba sin declaración previa (prototipo) devolvería un entero.

Ejemplo de llamada que requiere declaración previa (prototipo):

long int cierta_funcion();

int llamando_funcion()

{

long int ret;

ret = cierta_funcion();

}

Ejemplo de llamada que no requiere declaración previa:

int llamando_funcion()

{

int ret;

ret = alguna_otra_funcion();

}

int alguna_otra_funcion()

{

return 0;

}

Dado que el lenguaje C de K&R no incluía ninguna información sobre los argumentos de las funciones, no se realizaba comprobación de tipos en los parámetros de las funciones, aunque algunos compiladores lanzan mensajes de advertencia si se llamaba a una función con un número incorrecto de argumentos.

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. Algunas de estas características eran:

Funciones void y el tipo de datos void *.

Funciones que retornaban tipos de datos struct o union (en lugar de punteros).

Asignación de tipos de datos struct.

Calificador const, que hace que un objeto sea de sólo lectura.

Una biblioteca estándar, que incorporaba la mayoría de las funcionalidades implementadas por varios desarrolladores de compiladores.

Enumeraciones.

  • Ventajas:

Lenguaje muy eficiente puesto que es posible utilizar sus características de bajo nivel para realizar implementaciones óptimas.

A pesar de su bajo nivel es el lenguaje más portado en existencia, habiendo compiladores para casi todos los sistemas conocidos.

Proporciona facilidades para realizar programas modulares y/o utilizar código o bibliotecas existentes.

  • Desventajas:

El mayor problema que presenta el lenguaje C frente a los lenguajes de tipo de dato dinámico es la gran diferencia en velocidad de desarrollo: es mucho más lento programar en C. La razón estriba en que el compilador de C se limita a traducir código sin apenas añadir nada. La gestión de la memoria es un ejemplo clásico: en C el programador ha de reservar y liberar la memoria explícitamente. En otros lenguajes (como BASIC, Matlab o C#) la memoria es gestionada de forma transparente para el programador. Esto alivia la carga de trabajo humano y en muchas ocasiones previene errores.

El mantenimiento también es más difícil y costoso que con lenguajes de más alto nivel. El código en C se presta a sentencias cortas y enrevesadas de difícil interpretación. Aunque el lenguaje admite código escrito de forma fácilmente legible, si no se siguen normas en el equipo de programación algunos programadores pueden acabar escribiendo código difícil de leer. Esto complica la revisión y el mantenimiento.

C no dispone de sistemas de control automáticos y la seguridad depende casi exclusivamente de la experiencia del programador. La mayor parte de los problemas de seguridad en los sistemas informáticos actuales deriva de haber sido realizados en C. El fallo de seguridad clásico consiste en que algunas entradas de información al programa no se comprueban en longitud. Si un atacante introduce datos lo bastante grandes puede provocar la sobreescritura de código en la pila del programa e incluso llegar a forzar la ejecución de código pernicioso. Los lenguajes de tipo dinámico cuentan con controles de gestión de memoria y de entrada de datos automáticos.

Por estas razones, los directores de desarrollo han de sopesar la ventaja en eficiencia de un buen programa en C frente a la mayor duración del trabajo y los riesgos de seguridad y estabilidad. Han de tener en cuenta además, que los equipos bajan de precio con el tiempo mientras que el coste de los programadores aumenta.

  • Variantes:

Desde el inicio del lenguaje han surgido varias ramas de evolución que han generado varios lenguajes:

  • Objective-C es un primer intento de proporcionar soporte para la programación orientada a objetos en C, de escasa difusión, pero actualmente usado en Mac OS X y GNUstep.

  • C++ diseñado por Bjarne Stroustrup fue el segundo intento de proporcionar orientación a objetos a C y es la variante más difundida y aceptada. Esta versión combina la flexibilidad y el acceso de bajo nivel de C con las características de la programación orientada a objetos como abstracción, encapsulación y ocultación.

  • También se han creado numerosos lenguajes inspirados en la sintaxis de C, pero que no son compatibles con él:

  • Java, que une una sintaxis inspirada en la del C++ con una orientación a objetos más similar a la de Smalltalk y Objective C.

  • Java Script, un lenguaje de scripting creado en Netscape e inspirado en la sintaxis de Java diseñado para dar a las páginas web mayor interactividad. A la versión estandarizada se la conoce como ECMAScript.

  • C# (pronunciado C Sharp) es un lenguaje desarrollado por Microsoft derivado de C/C++ y Java.

  • Proceso de compilación:

La compilación de un programa C se realiza en varias fases que normalmente son automatizadas y ocultadas por los entornos de desarrollo:

Preprocesado consistente en modificar el código fuente en C según una serie de instrucciones (denominadas directivas de preprocesado) simplificando de esta forma el trabajo delcompilador. Por ejemplo, una de las acciones más importantes es la modificación de las inclusiones (#include) por las declaraciones reales existentes en el archivo indicado.

Compilación que genera el código objeto a partir del código ya preprocesado.

Enlazado que une los códigos objeto de los distintos módulos y bibliotecas externas (como las bibliotecas del sistema) para generar el programa ejecutable final.

  • Herramientas de Programación:

Al programar en C, es habitual usar algunas herramientas de programación de uso muy extendido, sobre todo en entorno de tipo unix:

make: Herramienta para automatizar el proceso de compilación, enlazado, etc.

lint: Herramienta utilizada para detectar código sospechoso, confuso o incompatible entre distintas arquitecturas

  • Ejemplo de Código:

El siguiente programa imprime en pantalla la frase "Hola Mundo" (C99).

# include // necesario para utilizar printf()

int main(void)

{

printf("Hola, Mundo \n");

// return 0 implícito en C99 para main().

}

El siguiente escribe "Hola, mundo" en C89

/* comentarios con '//' no permitidos en C89, sí en C99 */

# include /* necesario para utilizar printf */

main() /* tipo 'int' de retorno implícito */

{

printf ("Hola Mundo\n") ;

return 0;

}

  • Aplicabilidad:

Hecho principalmente para la fluidez de programación en sistemas UNIX. Se usa también para el desarrollo de otros sistemas operativos como Windows o Linux. Igualmente para aplicaciones de escritorio como OpenOffice.org, cuyo principal lenguaje de programación es C.

De la misma forma, es muy usado en aplicaciones científicas (para experimentos informáticos, físicos, químicos, matemáticos, entre otros, parte de ellos conocidos como modelos ysimuladores), industriales (industria robótica, cibernética, sistemas de información y base de datos para la industria petrolera y petroquímica. Predominan también todo lo que se refiere asimulación de máquinas de manufactura), simulaciones de vuelo (es la más delicada, ya que se tienen que usar demasiados recursos tanto de hardware como de software para desarrollar aplicaciones que permitan simular el vuelo real de una areonave. Se aplica por tanto, en diversas áreas desconocidas por gran parte de los usuarios noveles.

Los ordenadores de finales de los 90 son varios órdenes de magnitud más potentes que las máquinas en que C se desarrolló originalmente. Programas escritos en lenguajes de tipo dinámico y fácil codificación (Ruby, Python, Perl...) que antaño hubieran resultado demasiado lentos, son lo bastante rápidos como para desplazar en uso a C. Aun así, se puede seguir encontrando código C en grandes desarrollos de animaciones, modelados y escenas en 3D en películas y otras aplicaciones multimedia.

Actualmente, los grandes proyectos de software se dividen en partes, dentro de un equipo de desarrollo. Aquellas partes que son más "burocráticas" o "de gestión" con los recursos del sistema, se suelen realizar en lenguajes de tipo dinámico o de guión (script), mientras que aquellas partes "críticas", por su necesidad de rapidez de ejecución, se realizan en un lenguaje de tipo compilado, como C o C++. Si, después de hacer la división, las partes críticas no superan un cierto porcentaje del total (aproximadamente el 10%) entonces todo el desarrollo se realiza con lenguajes dinámicos. Si la parte crítica no llega a cumplir las expectativas del proyecto, se comparan las alternativas de una inversión en nuevo hardware frente a invertir en el coste de un programador para que reescriba dicha parte crítica.

  • Aplicaciones Embebidas

C es el lenguaje común para programar sistemas embebidos.[cita requerida] El código ligero que un compilador C genera, combinado con la capacidad de acceso capas del software cercanas al hardware son la causa de su popularidad en estas aplicaciones.

Un característica donde C demuestra comodidad de uso particularmente valiosa en sistemas embebidos es la manipulación de bits. Los sistemas contienen registros mapeados en memoria (en inglés, MMR) a través de los cuales los periféricos se configuran. Estos registros mezclan varias configuraciones en la misma dirección de memoria, aunque en bits distintos. Con C es posible modificar fácilmente uno de estos bits sin alterar el resto. Por ejemplo:

int *mmr; /* puntero al registro que queremos modificar */

mmr = 0x40008ABC; /* dirección de memoria del registro */

* mmr |= 1<<7; /* pone a 1 el bit 7 sin modificar los demás */

* mmr &= ~(1<<12) /* pone a 0 el bit 12 sin modificar los demás */

Este tipo de manipulación es muy tediosa o sencillamente imposible en otros lenguajes de alto nivel.

Otras características de C consideradas desventajas en la programación para PC -como la ausencia de control de memoria automático- se convierten en ventajas cuando los sistemas embebidos necesitan código pequeño y optimizado. Ese es el caso de los sistemas basados en microcontroladores de poca potencia como el intel 8051 o muchos sistemas ARM.

Biblioteca C:

Una biblioteca de C es una colección de rutinas utilizadas en el lenguaje de programación C. Las bibliotecas más comunes son la biblioteca estándar de C y la ISO y estándar ANSI Cprovee las especificaciones de los estándares, las cuales son ampliamente compartidas entre bibliotecas. La biblioteca ANSI C estándar incluye rutinas para la entrada y salida de archivos, alojamiento de memoria y operaciones con datos comunes como funciones matemáticas, funciones de cadenas y funciones de hora y fecha.

Otros juegos de bibliotecas C son aquellas utilizadas para desarrollar sistemas Unix, las cuales proveen interfaces hacia el núcleo. Estas funciones son detalladas en varios estándares tales como POSIX y el Single UNIX Specification.

Ya que muchos programas han sido escritos en el lenguaje C existe una gran variedad de bibliotecas disponibles. Muchas bibliotecas son escritas en C debido a que C genera código objeto rápido; los programadores luego generan interfaces a la biblioteca para que las rutinas puedan ser utilizadas desde lenguajes de mayor nivel, tales como Java, Perl y Python.



La base de datos está protegida por derechos de autor ©bazica.org 2016
enviar mensaje

    Página principal