Documentos de Académico
Documentos de Profesional
Documentos de Cultura
C
Desarrollador(es)
Informacin general
Extensiones
.h .c
comunes
Paradigma
Imperativo (Procedural),Estructurado
Apareci en
1972
Diseado por
Dennis M. Ritchie
ltima versin
estable
Tipo de dato
Dbil, Esttico
Dialectos
Influido por
Ha influido a
1 Filosofa
2 Caractersticas
2.1 Propiedades
2.2 Carencias
3 Historia
o
3.4 C99
3.5 C11
4 Ventajas
5 Inconvenientes
6 Variantes
7 Proceso de compilacin
o
8 Herramientas de programacin
9 Aplicabilidad
o
10 Bibliotecas C
11 Vase tambin
12 Referencias
13 Enlaces externos
Filosofa[editar]
Uno de los objetivos de diseo del lenguaje C es que slo sean necesarias unas pocas
instrucciones en lenguaje mquina para traducir cada elemento del lenguaje, sin que haga
falta un soporte intenso en tiempo de ejecucin. Es muy posible escribir C a bajo nivel de
abstraccin; de hecho, C se us como intermediario entre diferentes lenguajes.
En parte a causa de ser de relativamente bajo nivel y de tener un modesto conjunto de
caractersticas, se pueden desarrollar compiladores de C fcilmente. En consecuencia, el
lenguaje C est disponible en un amplio abanico de plataformas (ms que cualquier otro
lenguaje). Adems, a pesar de su naturaleza de bajo nivel, el lenguaje se desarroll para
incentivar la programacin independiente de la mquina. Un programa escrito cumpliendo los
estndares e intentando que sea porttil puede compilarse en muchos computadores.
C se desarroll originalmente (conjuntamente con el sistema operativo Unix, con el que ha
estado asociado mucho tiempo) por programadores para programadores. Sin embargo, ha
alcanzado una popularidad enorme, y se ha usado en contextos muy alejados de
la programacin de software de sistema, para la que se dise originalmente.
Caractersticas[editar]
Propiedades[editar]
Un ncleo del lenguaje simple, con funcionalidades aadidas importantes, como funciones
matemticas y de manejo de archivos, proporcionadas por bibliotecas.
Es un lenguaje muy flexible que permite programar con mltiples estilos. Uno de los ms
empleados es el estructurado "no llevado al extremo" (permitiendo ciertas licencias de
ruptura).
Por defecto, el paso de parmetros a una funcin se realiza por valor. El paso por
referencia se consigue pasando explcitamente a las funciones las direcciones de
memoria de dichos parmetros.
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").
Carencias[editar]
Recoleccin de basura nativa, sin embargo se encuentran a tal efecto bibliotecas como la
"libgc" desarrollada por Sun Microsystems, o el Recolector de basura de Boehm.
Aunque la lista de las caractersticas tiles de las que carece C es larga, este factor ha sido
importante para su aceptacin, porque escribir rpidamente nuevos compiladorespara nuevas
plataformas, mantiene lo que realmente hace el programa bajo el control directo del
programador, y permite implementar la solucin ms natural para cada plataforma. sta es la
causa de que a menudo C sea ms eficiente que otros lenguajes. Tpicamente, slo la
programacin cuidadosa en lenguaje ensamblador produce un cdigo ms rpido, pues da
control total sobre la mquina, aunque los avances en los compiladores de C y la complejidad
creciente de los microprocesadores modernos han reducido gradualmente esta diferencia.
En algunos casos, una caracterstica inexistente puede aproximarse. Por ejemplo, la
implementacin original de C++ consista en un preprocesador que traduca cdigo fuente C++
a C. La mayora de las funciones orientadas a objetos incluyen un puntero especial, que
normalmente recibe el nombre "this", que se refiere al objeto al que pertenece la funcin.
Mediante el paso de este puntero como un argumento de funcin, esta funcionalidad puede
desempearse en C. Por ejemplo, en C++ se puede escribir:
stack.push(val);
Mientras que en C se podra escribir:
push(stack, val);
Donde el argumento stack es un puntero a una struct equivalente al puntero this de C++, que
es un puntero a un objeto.
Historia[editar]
Desarrollo inicial[editar]
El desarrollo inicial de C se llev a cabo en los Laboratorios Bell de AT&T entre 1969 y 1973;
segn Ritchie, el periodo ms creativo tuvo lugar en 1972. Se le dio el nombre "C" porque
muchas de sus caractersticas 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. Haban estado jugando en el mainframe de su compaa, pero debido a su poca
capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenan
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 mquina
no tena sistema operativo, as que decidieron escribir uno. Finalmente decidieron portar el
sistema operativo del PDP-11 que haba en su oficina, pero era muy costoso, pues todo el
cdigo estaba escrito en lenguaje ensamblador. Entonces decidieron usar un lenguaje de
alto nivel y porttil para que el sistema operativo se pudiera portar fcilmente de un
ordenador a otro. Consideraron usar B, pero careca de las funcionalidades necesarias
para aprovechar algunas caractersticas avanzadas del PDP-11. Entonces empezaron a
crear un nuevo lenguaje, C.
La justificacin para obtener el ordenador original que se us para desarrollar Unix fue
crear un sistema que automatizase el archivo de patentes. La versin original de Unix se
desarroll en lenguaje ensamblador. Ms tarde, el lenguaje C se desarroll para poder
reescribir el sistema operativo.
En 1973, el lenguaje C se haba 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 ncleos de sistema operativo implementados en un lenguaje distinto al
ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en PL/I, yMaster
Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961).
El C de Kernighan y Ritchie[editar]
En 1978, Ritchie y Brian Kernighan publicaron la primera edicin de El lenguaje de
programacin C, tambin conocido como La biblia de C. Este libro fue durante aos
laespecificacin 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 edicin del
libro cubre el estndar ANSI C, descrito ms abajo).
Kernighan y Ritchie introdujeron las siguientes caractersticas al lenguaje:
Funciones que retornaban tipos de datos struct o union (en lugar de punteros).
Enumeraciones.
Sin embargo, muchos programas han sido escritos de forma que slo pueden compilarse en
una cierta plataforma, o con un compilador concreto, esto puede ser debido a diversos
motivos:
El uso de tipos de datos suponiendo que tendrn el mismo tamao u orden de los bits en
todas las plataformas.
La macro __STDC__ puede usarse para dividir el cdigo en secciones ANSI y K&R para el
compilador.
# if __STDC__
extern int getopt(int,char * const *,const char *);
# else
extern int getopt();
# endif
Algunos programadores recomiendan usar "#if __STDC__", como en el ejemplo, en lugar de
"#ifdef __STDC__" porque algunos compiladores le asignan el valor cero a __STDC__ para
indicar que no son compatibles con ANSI.
En el siguiente ejemplo, el programa pide al usuario que introduzca un nmero. El programa
dividir dicho nmero entre 2 e imprimir el resultado mientras que este sea par, y terminar
cuando el nmero sea impar:
#include <stdio.h>
int main(void) {
int numero;
fputs("Introduzca un numero entero par: ", stdout);
scanf("%d", &numero);
if (!numero) {
fputs("Error: numero no valido.\n", stderr);
return -1;
}
int i = 1;
while (numero%2 == 0) {
printf ("%.3d| %d/2 =", i++, numero);
numero /=2;
printf("%d\n", numero);
}
printf ("No se puede seguir dividiendo: El numero %d es
impar.\n", numero);
return 0;
C99[editar]
Tras el proceso de estandarizacin de ANSI, la especificacin del lenguaje C permaneci
relativamente estable durante algn tiempo, mientras que C++ sigui evolucionando. Sin
embargo, el estndar continu bajo revisin a finales de la dcada de 1990, lo que llev a la
publicacin del estndar ISO 9899:1999 en 1999. Este estndar se denomina habitualmente
"C99". Se adopt como estndar ANSI en marzo de 2000.
Las nuevas caractersticas de C99 incluyen:
Funciones inline.
Las variables pueden declararse en cualquier sitio (como en C++), en lugar de poder
declararse slo tras otra declaracin o al comienzo de una declaracin compuesta.
Muchos tipos de datos, incluyendo long long int (para reducir el engorro de la
transicin de 32 bits a 64 bits), un tipo de datos booleano, y un tipo complex que
representa nmeros complejos.
Soporte para comentarios de una lnea que empiecen con //, como en BCPL o en C++,
caracterstica para la que muchos compiladores haban dado soporte por su cuenta.
Una consideracin importante es que hasta la publicacin de este estndar, C haba sido
mayormente un subconjunto estricto del C++. Era muy sencillo "actualizar" un programa de C
hacia C++ y mantener ese cdigo compilable en ambos lenguajes. Sin embargo, el nuevo
estndar agrega algunas caractersticas que C++ no admite, como por ejemplo los
inicializadores estticos de estructuras. Tambin define al tipo "bool" de una manera que no es
exactamente la del C++.
El compilador GCC, entre muchos otros, soportan hoy en da la mayora de las nuevas
caractersticas de C99. Sin embargo, este nuevo estndar 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 caractersticas de C99. Algunas
caractersticas tienen ms demanda que otras, y consideraremos incluirlas en versiones futuras
2
siempre que sean compatibles con C++."
C11[editar]
C11 (antes conocido como C1X) es un nombre informal para ISO/IEC 9899:2011,3 el ltimo
estndar publicado para C. El borrador final, N1570,4 fue publicado en abril de 2011. El nuevo
estndar super su ltima revisin el 10 de octubre de 2011 y fue oficialmente ratificado por la
ISO y publicado el 8 de diciembre de 2011.
Ventajas[editar]
Lenguaje muy eficiente puesto que es posible utilizar sus caractersticas de bajo nivel para
realizar implementaciones ptimas.
Proporciona facilidades para realizar programas modulares y/o utilizar cdigo o bibliotecas
existentes.
Inconvenientes[editar]
El mayor problema que presenta el lenguaje C frente a los lenguajes de tipo de dato dinmico
es la gran diferencia en velocidad de desarrollo: es ms lento programar en C, sobre todo para
el principiante. La razn estriba en que el compilador de C se limita a traducir cdigo sin
apenas aadir nada. La gestin de la memoria es un ejemplo clsico: en C el programador ha
de reservar y liberar la memoria explcitamente. 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, aunque tambin supone mayor
carga de trabajo para el procesador.
El mantenimiento en algunos casos puede ser ms difcil y costoso que con ciertos lenguajes
de ms alto nivel. El cdigo en C se presta a sentencias cortas y enrevesadas de difcil
interpretacin[cita requerida].
Cabe destacar el contexto y poca en la que fue desarrollado C. En aquellos tiempos existan
muy pocos programadores, los cuales, a su vez, eran prcticamente todos expertos en el
rea. De esta manera, se asuma que los programadores eran conscientes de sus trabajos y
capaces de manejar perfectamente el lenguaje. Por esta razn es muy importante que los
recin iniciados adopten buenas prcticas a la hora de escribir en C y manejar la memoria,
como por ejemplo un uso intensivo de indentacin y conocer a fondo todo lo que implica el
manejo de punteros y direcciones de memoria.
Variantes[editar]
Desde el inicio del lenguaje han surgido varias ramas de evolucin que han generado varios
lenguajes:
C++ (pronunciado C Plus Plus) diseado por Bjarne Stroustrup fue el segundo intento de
proporcionar orientacin a objetos a C y es la variante ms difundida y aceptada. Esta
versin combina la flexibilidad y el acceso de bajo nivel de C con las caractersticas de la
programacin orientada a objetos como abstraccin, encapsulacin y ocultacin.
Tambin 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 orientacin a objetos ms
similar a la de Smalltalk y Objective C.
Proceso de compilacin[editar]
La compilacin de un programa C se realiza en varias fases que normalmente son
automatizadas y ocultadas por los entornos de desarrollo:
1. Preprocesado consistente en modificar el cdigo fuente en C segn una serie de
instrucciones (denominadas directivas de preprocesado) simplificando de esta forma
el trabajo del compilador. Por ejemplo, una de las acciones ms importantes es la
modificacin de las inclusiones (#include) por las declaraciones reales existentes en
el archivo indicado.
2. Compilacin que genera el cdigo objeto a partir del cdigo ya preprocesado.
3. Enlazado que une los cdigos objeto de los distintos mdulos y bibliotecas externas
(como las bibliotecas del sistema) para generar el programa ejecutable final.
Ejemplo de cdigo[editar]
El siguiente programa imprime en pantalla la frase "Hola Mundo" (C99).
// necesario para utilizar printf()
# include <stdio.h>
int main(void)
{
printf("Hola Mundo\n");
return 0;
}
El siguiente escribe "Hola Mundo" en C89
/* comentarios con '//' no permitidos en C89, s en C99 */
# include <stdio.h> /* necesario para utilizar printf */
main() /* tipo 'int' de retorno implcito */
{
printf ("Hola Mundo\n") ;
return 0;
}
Estructura de control "else if"
if (condicion 1) {
sentencia 1
} else if (condicion 2){
sentencia 2
} else if (condicion n){
sentencia n
} else {
sentencias por defecto
}
Herramientas de programacin[editar]
Al programar en C, es habitual usar algunas herramientas de programacin de uso muy
extendido, sobre todo en entorno de tipo unix:
lint: Herramienta utilizada para detectar cdigo sospechoso, confuso o incompatible entre
distintas arquitecturas
dbx : Debugger que suele venir instalado con todos los UNIX.
Aplicabilidad[editar]
Hecho principalmente para la fluidez de programacin en sistemas UNIX. Se usa tambin para
el desarrollo de otros sistemas operativos como Windows o GNU/Linux. Igualmente para
aplicaciones de escritorio como GIMP, cuyo principal lenguaje de programacin es C.
De la misma forma, es muy usado en aplicaciones cientficas (para experimentos informticos,
fsicos, qumicos, matemticos, entre otros, parte de ellos conocidos
comomodelos y simuladores), industriales (industria robtica, ciberntica, sistemas de
informacin y base de datos para la industria petrolera y petroqumica. Predominan tambin
todo lo que se refiere a simulacin de mquinas de manufactura), simulaciones de vuelo (es la
ms delicada, ya que se tienen que usar demasiados recursos tanto de hardwarecomo
de software para desarrollar aplicaciones que permitan simular el vuelo real de una aeronave.
Se aplica por tanto, en diversas reas desconocidas por gran parte de losusuarios noveles.
Los ordenadores de finales de los 90 son varios rdenes de magnitud ms potentes que las
mquinas en que C se desarroll originalmente. Programas escritos en lenguajes de tipo
dinmico y fcil codificacin (Ruby, Python, Perl...) que antao hubieran resultado demasiado
lentos, son lo bastante rpidos como para desplazar en uso a C. Aun as, se puede seguir
encontrando cdigo C en grandes desarrollos de animaciones, modelados y escenas en 3D en
pelculas y otras aplicaciones multimedia.
Actualmente, los grandes proyectos de software se dividen en partes, dentro de un equipo de
desarrollo. Aquellas partes que son ms "burocrticas" o "de gestin" con los recursos del
sistema, se suelen realizar en lenguajes de tipo dinmico o de guion (script), mientras que
aquellas partes "crticas", por su necesidad de rapidez de ejecucin, se realizan en un
lenguaje de tipo compilado, como C o C++. Si, despus de hacer la divisin, las partes crticas
no superan un cierto porcentaje del total (aproximadamente el 10%) entonces todo el
desarrollo se realiza con lenguajes dinmicos. Si la parte crtica no llega a cumplir las
expectativas del proyecto, se comparan las alternativas de una inversin en nuevo hardware
frente a invertir en el coste de un programador para que reescriba dicha parte crtica[cita requerida].
Aplicaciones embebidas[editar]
C es el lenguaje comn para programar sistemas embebidos.[cita requerida] El cdigo ligero que
un compilador C genera, combinado con la capacidad de acceso a capas del software
cercanas al hardware son la causa de su popularidad en estas aplicaciones.
Una caracterstica donde C demuestra comodidad de uso particularmente valiosa en sistemas
embebidos es la manipulacin de bits. Los sistemas contienen registros mapeados en
memoria (en ingls, MMR) a travs de los cuales los perifricos se configuran. Estos registros
mezclan varias configuraciones en la misma direccin de memoria, aunque en bits distintos.
Con C es posible modificar fcilmente uno de estos bits sin alterar el resto. Por ejemplo:
int *mmr; /* puntero al registro que queremos modificar */
mmr = 0x40008ABC; /* direccin de memoria del registro */
* mmr |= 1<<7; /* pone a 1 el bit 8 sin modificar los dems */
* mmr &= ~(1<<12) /* pone a 0 el bit 13 sin modificar los dems */
Este tipo de manipulacin es muy tediosa o sencillamente imposible en otros lenguajes de alto
nivel, dado que se utilizan operaciones comunes del lenguaje ensamblador como
las operaciones a nivel bit OR, AND, SHL y CPL pero que estn disponibles en el lenguaje C.
Otras caractersticas de C consideradas desventajas en la programacin para PC -como la
ausencia de control de memoria automtico- se convierten en ventajas cuando los sistemas
embebidos necesitan cdigo pequeo y optimizado. Ese es el caso de los sistemas basados
en microcontroladores de poca potencia como el intel 8051 o muchos sistemas ARM.