Sunteți pe pagina 1din 7

C es un lenguaje de programaci�n de prop�sito general2?

:1 originalmente
desarrollado por Dennis Ritchie entre 1969 y 1972 en los Laboratorios Bell,1? como
evoluci�n del anterior lenguaje B, a su vez basado en BCPL.2?:13?4?

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 de tipos de datos est�ticos, d�bilmente tipificado, de


medio nivel, ya que 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 portable entre plataformas y/o arquitecturas.

�ndice
1 Filosof�a
2 Caracter�sticas
2.1 Propiedades
2.2 Precauciones que se debe tener por ser un lenguaje de bajo nivel
3 Historia
3.1 Desarrollo inicial
3.2 El C de Kernighan y Ritchie
3.3 ANSI C e ISO C
3.3.1 Palabras reservadas de ANSI-C
3.4 C99
3.5 C11
3.6 C embebido
3.7 C18
4 Lenguajes derivados de C
5 Proceso de compilaci�n
5.1 Ejemplo de c�digo
6 Herramientas de programaci�n
7 Aplicabilidad
7.1 Aplicaciones embebidas
8 Bibliotecas C
9 V�ase tambi�n
10 Referencias
11 Enlaces externos
Filosof�a
Uno de los objetivos de dise�o del lenguaje C es que solo sean necesarias unas
pocas instrucciones en lenguaje m�quina para traducir cada elemento del lenguaje,
sin que haga falta un soporte intenso en tiempo de ejecuci�n. Es muy posible
escribir C a bajo nivel de abstracci�n; 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 caracter�sticas, se pueden desarrollar compiladores de C f�cilmente. En
consecuencia, el lenguaje C est� disponible en un amplio abanico de plataformas
(m�s que cualquier otro lenguaje). Adem�s, a pesar de su naturaleza de bajo nivel,
el lenguaje se desarroll� para incentivar la programaci�n independiente de la
m�quina. Un programa escrito cumpliendo los est�ndares e intentando que sea
port�til 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 programaci�n de software de sistema, para la que se dise��
originalmente.

Caracter�sticas
Commons-emblem-issue.svg
En esta secci�n se detectaron varios problemas, para mejorarla, pulsa [editar]
junto a su t�tulo:
No tiene una redacci�n neutral. Por favor, discute este problema en la discusi�n.
Necesita referencias adicionales para su verificaci�n.
Existen dudas o desacuerdos sobre la exactitud de su redacci�n.
Por favor, debate este problema en la p�gina de discusi�n.
Estas deficiencias fueron encontradas el 4 de mayo de 2019.
Puedes avisar al redactor principal pegando lo siguiente en su p�gina de discusi�n:
{{sust:Aviso PA|C (lenguaje de programaci�n)|noneutral|referencias}} ~~~~
Propiedades
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 estructurado, i.e. tiene estructuras de control y tipos de datos
estructurados definidos por el programador a partir de los tipos at�micos t�picos y
mediante arreglos, estructuras, uniones y apuntadores, incluidos los apuntadores a
funci�n.
En su primera edici�n no hab�a advertencias sobre asignar a una variable un valor
un tipo distinto. Por lo que hab�a un programa llamado lint que detectaba este tipo
de errores. Actualmente los compiladores pueden detectar inconsistencias de tipos y
otros errores.
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 apuntadores o punteros.
Manejo de Interrupciones mediante la biblioteca signal.
Un conjunto reducido de palabras clave.
El llamado a funciones es por valor. Aunque se pueden pasar apuntadores a variables
para hacer llamados por referencia.
Distintos tipos de almacenamiento que permiten un dise�o modular.
La palabra clave static permite encapsular variables y funciones.

Las estructuras se declaran mediante la palabra clave struct, implementan el


producto cartesiano de tipos tambi�n llamados registros.
Y la uni�n disyunta, tambi�n llamada suma, co-producto o tipos variantes, se
declara con la palabra clave union. Las estructuras y uniones permiten la
implementaci�n de �rboles.

Lenguaje muy eficiente puesto que es posible utilizar sus caracter�sticas de bajo
nivel para realizar implementaciones �ptimas.
Se dise�� como un lenguaje de programaci�n de sistemas port�til.
Es muy poco lo que requiere uso de ensamblador, lo que permiti� portar Unix y otros
sistemas operativos a distintos equipos.

Distingue entre may�sculas y min�sculas, pero conserva su portabilidad en equipos


que manejan caracteres de 6 bits, como las computadoras Cyber de CDC que ten�an una
palabra de 60 bits, (10 caracteres), porque usan trigr�ficos para codificar
s�mbolos especiales.
Su compilador de C se ha portado a casi todos los sistemas conocidos. Porque adem�s
de que no se requiere codificar en ensamblador, interact�a con los lenguajes
especializados YACC y LEX. tambi�n escritos en C como parte de Unix.
Facilita la programaci�n modular gracias a que cuenta con distintos tipos de
almacenamiento de las variables y compilaci�n separada. Adem�s del macro procesador
integrado cpp, que permite declarar los encabezados de las funciones y los tipos de
datos en archivos con extensi�n h. En el caso de las bibliotecas del sistema Unix y
de C se necesita incluir los prototipos con la macros #include por ejemplo #include
<system.h>. Ello �nicamente sirve para automatizar la declaraci�n de objetos
externos que se usar�n en el programa, por lo que es necesario pasar los nombres de
las bibliotecas como par�metros del compilador que �ste pasa al encadenador (linker
loader).
Precauciones que se debe tener por ser un lenguaje de bajo nivel
Los programadores novatos deben tener cuidado con la gesti�n de la memoria, en C el
programador ha de reservar y liberar la memoria expl�citamente. En otros lenguajes
(como BASIC o Matlab) la memoria es gestionada de forma transparente para el
programador. Esto alivia la carga de trabajo y evita errores, pero le quita
flexibilidad al lenguaje para escribir controladores del hardware.

Por esta raz�n es muy importante que los reci�n iniciados adopten buenas pr�cticas
a la hora de escribir en C y manejar la memoria, como por ejemplo un uso intensivo
de indentaci�n y conocer a fondo todo lo que implica el manejo de punteros y
direcciones de memoria.

Recolecci�n 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.
Soporte para programaci�n orientada a objetos, aunque la implementaci�n original de
C++ fue un preprocesador que traduc�a c�digo fuente de C++ a C. V�ase tambi�n la
librer�a GObject.
Funciones anidadas, aunque GCC tiene esta caracter�stica como extensi�n.
Soporte nativo para programaci�n multihilo. Disponible usando librer�as como
libpthread.
Aunque la lista de las caracter�sticas �tiles de las que carece C es larga, este
factor ha sido importante para su aceptaci�n, porque escribir r�pidamente nuevos
compiladores para nuevas plataformas, mantiene lo que realmente hace el programa
bajo el control directo del programador, y permite implementar la soluci�n m�s
natural para cada plataforma. �sta es la causa de que a menudo C sea m�s eficiente
que otros lenguajes. T�picamente, s�lo la programaci�n cuidadosa en lenguaje
ensamblador produce un c�digo m�s r�pido, pues da control total sobre la m�quina,
aunque los avances en los compiladores de C y la complejidad creciente de los
microprocesadores modernos han reducido gradualmente esta diferencia.

El lenguaje se puede extender mediante bibliotecas y macros. Por ejemplo, la


implementaci�n original de C++ consist�a en un preprocesador que traduc�a c�digo
fuente C++ a C. La mayor�a 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 funci�n. Mediante el paso de este puntero como un argumento de
funci�n, esta funcionalidad puede desempe�arse en C. Por ejemplo, en C++ se puede
escribir:

stack.push(val);
Mientras que en C se podr�a 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. La limitaci�n de esto es que al no ser
nativamente orientado a objetos no permite a�adir polimorfismo a la encapsulaci�n,
donde una serie de clases superiores utilizan funcionalidad desconociendo las
clases inferiores que las implementan. Forzosamente, en alg�n punto de las clases
superiores habr� un if comprobando la pertenencia del objeto a distintas subclases,
impidiendo la abstracci�n de las clases superiores respecto a las inferiores.Al
igual que esto se le declaran las variables a cualquier operaci�n de C++.

Historia
Desarrollo inicial

Ken Thompson (izquierda) con Dennis Ritchie (derecha, el inventor del lenguaje de
programaci�n C)
El desarrollo inicial de C se llev� a cabo en los Laboratorios Bell de AT&T entre
1969 y 1973; seg�n Dennis Ritchie, el periodo m�s creativo tuvo lugar en 1972.1? 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, Ken Thompson y
Dennis 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.1? �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).

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.2?:2 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).

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
sint�ctica 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 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.

Ejemplo del "viejo estilo":

int power(); /* Se podr�a usar este prototipo


para llamar a la funci�n.
Simplemente power();
u omitirlo dado que el tipo
por default es int */

power(a,b)
int a, b;
{
int n;
for (n = 1; b > 0; --b)
n *= a;
return n;
}
Ejemplo de la nueva definici�n:

int power(int a, int b) {


int n;
for (n = 1; b > 0; --b)
n *= a;
return n;
}
(*) Por defecto, el tipo de retorno en C es int, por lo que la declaraci�n entera
int power(); podr�a haberse omitido.

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.
ANSI C e ISO C
Art�culo principal: ANSI 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 (ANSI) 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++:

main(argc, argv)
int argc;
char **argv;
{
...
}
pas� a ser:

int main(int argc, char *argv[]) {


...
}
ANSI C est� soportado hoy en d�a por casi la totalidad de los compiladores. La
mayor�a del c�digo C que se escribe actualmente est� basado en ANSI C. Cualquier
programa escrito s�lo en C est�ndar sin c�digo que dependa de un hardware
determinado funciona correctamente en cualquier plataforma que disponga de una
implementaci�n de C compatible. Sin embargo, muchos programas han sido escritos de
forma que s�lo pueden compilarse en una cierta plataforma, o con un compilador
concreto, esto puede ser debido a diversos motivos:

La utilizaci�n de bibliotecas no est�ndar, como interfaces gr�ficas de usuario.


El uso de compiladores que no cumplen las especificaciones del est�ndar.
El uso de tipos de datos suponiendo que tendr�n el mismo tama�o u orden de los bits
en todas las plataformas.
La macro __STDC__ puede usarse para dividir el c�digo 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 n�mero. El


programa dividir� dicho n�mero entre 2 e imprimir� el resultado mientras que este
sea par, y terminar� cuando el n�mero 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;
}

S-ar putea să vă placă și