C (Lenguaje de Programación) PDF
C (Lenguaje de Programación) PDF
C (Lenguaje de Programación) PDF
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
Propiedades
Núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones
matemáticas y de gestión 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.
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.
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.
Historia
Desarrollo inicial
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".
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).
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.
power(a,b)
int a, b;
{
int n;
for (n = 1; b > 0; --b)
n *= a;
return n;
}
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:
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 (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:
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:
# 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 <conio.h>
#include <ctype.h>
#include <stdio.h>
int main() {
char numero;
fputs("Introduzca un numero entero par: ", stdout);
scanf("%c", &numero);
if (!isdigit(numero)) {
fputs("Error: numero no valido.\n", stderr);
return -1;
}
return 0;
}
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.5 Este estándar se denomina habitualmente "C99". Se adoptó como estándar ANSI en marzo de
2000.
Funciones inline.
Las variables pueden declararse en cualquier sitio (como en C++), en lugar de poder
declararse sólo tras otra declaración o al comienzo de una declaración compuesta.
Muchos tipos de datos, incluyendo long long int (para reducir el engorro de la
transición de 32 bits a 64 bits), un tipo de datos booleano, y un tipo complex que
representa números complejos.
Arrays de longitud variable.
Soporte para comentarios de una línea que empiecen con //, como en BCPL o en C++,
característica para la que muchos compiladores habían dado soporte por su cuenta.
muchas funciones nuevas, como snprintf()
algunos headers nuevos, como stdint.h.
Una consideración importante es que hasta la publicación de este estándar, C había sido mayormente un
subconjunto estricto del C++. Era muy sencillo "actualizar" un programa de C hacia C++ y mantener ese
código compilable en ambos lenguajes. Sin embargo, el nuevo estándar agrega algunas características
que C++ no admite, como por ejemplo los inicializadores estáticos de estructuras. También define al tipo
"bool" de una manera que no es exactamente la del C++.
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++."7
C11
C11 (antes conocido como C1X) es un nombre informal para ISO/IEC 9899:20118 . El borrador final,
N1570, fue publicado en abril de 2011.9 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.
C embebido
Históricamente la programación en C embebido ha requerido extensiones no estándar del lenguaje C para
implementar características no oficiales tales como aritmética de punto fijo y operaciones básicas de
entrada y salida.
C18
El último estándar publicado para C ISO/IEC 9899:201810 .
Lenguajes derivados de C
Desde el inicio del lenguaje han surgido varias ramas de evolución que han generado varios lenguajes:
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.
JavaScript, 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:
Ejemplo de código
El siguiente programa imprime en pantalla la frase "Hola Mundo" (C99).
int main(void) {
printf("Hola Mundo\n");
return 0;
}
if (condicion 1) {
sentencia 1
} else if (condicion 2) {
sentencia 2
} else if (condicion n) {
sentencia n
} else {
sentencias por defecto
}
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:
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 GNU/Linux. Igualmente para aplicaciones de
escritorio como GIMP, 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 y simuladores), 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 a simulació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
aeronave). 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 guion (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[cita requerida].
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 a capas del software cercanas al hardware
son la causa de su popularidad en estas aplicaciones.
Una 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:
Este tipo de manipulación 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 están disponibles en el lenguaje C.
Bibliotecas C
Una biblioteca de C es una colección de funciones utilizadas en el lenguaje de programación C. Las
bibliotecas más comunes son la biblioteca estándar de C y la biblioteca del estándar ANSI C, la cual
provee las especificaciones de los estándares que son ampliamente compartidas entre bibliotecas. La
biblioteca ANSI C estándar, incluye funciones para la entrada y salida de archivos, alojamiento de
memoria y operaciones con datos comunes: funciones matemáticas, funciones de manejo de cadenas de
texto y funciones de hora y fecha.
Otras 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.
Véase también
Anexo:Operadores de C y C++
C++
Referencias
1. Ritchie, Dennis (1993). «The Development of the C Language» (http://www.bell-labs.com/us
r/dmr/www/chist.html). ACM SIGPLAN Notices (en inglés) (ACM Press) 28 (3): 201-208.
doi:10.1145/155360.155580 (http://dx.doi.org/10.1145%2F155360.155580). Consultado el 10 de marzo de
2019.
2. Kernighan, Brian W.; Ritchie, Dennis M. (1991). El lenguaje de programación C (2ª edición).
Prentice Hall Hispanoamericana. ISBN 968-880-205-0.
3. Raymond, Eric S. (2003). The Art of Unix Programming (en inglés). Addison-Wesley. ISBN 0-
13-142901-9.
4. Raymond, Eric S. (2003). «Evolution of C» (http://www.catb.org/~esr/writings/taoup/html/c_e
volution.html). The Art of Unix Programming (en inglés). Consultado el 7 de mayo de 2019.
5. «ISO/IEC 9899:1999» (https://www.iso.org/standard/29237.html). International Organization
for Standardization (en inglés). Consultado el 10 de marzo de 2019.
6. «WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3» (http://www.op
en-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) (PDF). International Organization for
Standardization (en inglés). 7 de septiembre de 2007. Consultado el 7 de mayo de 2019.
7. «Content not found» (http://msdn.microsoft.com/chats/transcripts/vstudio/vstudio_022703.as
px). Consultado el 2009.
8. «ISO/IEC 9899:2011» (https://www.iso.org/standard/57853.html). International Organization
for Standardization (en inglés). Consultado el 10 de marzo de 2019.
9. «N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x» (http://www.open-std.org/jtc
1/sc22/wg14/www/docs/n1570.pdf) (PDF). International Organization for Standardization (en
inglés). 12 de abril de 2011. Consultado el 7 de mayo de 2019.
10. 14:00-17:00. «ISO/IEC 9899:2018» (http://www.iso.org/cms/render/live/en/sites/isoorg/conte
nts/data/standard/07/45/74528.html). ISO (en inglés). Consultado el 18 de mayo de 2019.
Enlaces externos
Wikiversidad alberga proyectos de aprendizaje sobre C (lenguaje de programación).
Wikilibros alberga un libro o manual sobre Programación en C.
Página web oficial del estándar ISO/IEC 9899 (http://www.open-std.org/jtc1/sc22/wg14/ww
w/standards) - lenguaje de programación C
Página web oficial del grupo de trabajo de ISO/IEC JTC1/SC22/WG14 (http://www.open-st
d.org/jtc1/sc22/wg14/) encargado de la estandarización del lenguaje de programación C
Obtenido de «https://es.wikipedia.org/w/index.php?title=C_(lenguaje_de_programación)&oldid=122139431»
Esta página se editó por última vez el 19 dic 2019 a las 14:52.
El texto está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3.0; pueden aplicarse
cláusulas adicionales. Al usar este sitio, usted acepta nuestros términos de uso y nuestra política de privacidad.
Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.