Está en la página 1de 12

Propiedades

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). 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 mltiples archivos de cdigo 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 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. Punteros a funciones y variables estticas, 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"). [editar]Carencias

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. Soporte para programacin orientada a objetos, aunque la implementacin original de C++ fue un preprocesador que traduca cdigo fuente de C++ a C. Funciones anidadas, aunque GCC tiene esta caracterstica como extensin. Soporte nativo para programacin multihilo.

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 compiladores para 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 losmicroprocesadores 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.

Desarrollo inicial
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 elmainframe 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 unPDP-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, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961).

Origen
[Inicio] [Final]
<< [0] [1] [2] [3] [4] [5] [6] [7] >> [Ref] [CSS]

Atrs Sig

Fig. 1. Dennis (parado) y Ken (sentado) frente a una PDP-11, 1972


[editar]El

C de Kernighan y Ritchie

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 la especificacin 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:

El tipo de datos struct. El tipo de datos long

int. int.

El tipo de datos unsigned

Los operadores =+ y =- fueron sustituidos por += y -= para eliminar la ambigedad sintctica de expresiones como i=-10, que se podra interpretar bien como i =- 10 o bien como i = -10.

El C de Kernighan y Ritchie es el subconjunto ms bsico del lenguaje que un compilador debe de soportar. Durante muchos aos, incluso tras la introduccin del ANSI C, fue considerado "el mnimo comn denominador" en el que los

programadores deban programar cuando deseaban que sus programas fueran transportables, pues no todos los compiladores soportaban completamente ANSI, y el cdigo razonablemente bien escrito en K&R C es tambin cdigo ANSI C vlido. En las primeras versiones del lenguaje, la definicin de funciones se haca mediante un 'prototipo de funcin' (function prototype), el cual indicaba al compilador el tipo de retorno de la funcin. Aunque este mtodo tiene una gran desventaja respecto al nuevo, debido a que no comprueba el nmero ni el tipo en la lista de argumentos; en otras palabras, es mucho ms fcil cometer errores al hacer un llamado a una funcin con argumentos incorrectos. Ejemplo del "viejo estilo": int power(); /* Podria haberse omitido (*) */

power() int a, b; { int n; for (n = 1; b > 0; --b) n *= a; return n; } Ejemplo de la nueva definicin: 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 declaracin entera

int power(); podra haberse omitido.

En los aos siguientes a la publicacin del C de Kernighan y Ritchie, se aadieron al lenguaje muchas caractersticas no oficiales, que estaba soportadas por los compiladores de AT&T, entre otros. Algunas de estas caractersticas eran:

Funciones void y el tipo de datos void Asignacin de tipos de datos struct.

*.

Funciones que retornaban tipos de datos struct o union (en lugar de punteros). Calificador const, que hace que un objeto sea de slo lectura. Una biblioteca estndar, que incorporaba la mayora de las funcionalidades implementadas por varios desarrolladores de compiladores. Enumeraciones.

[editar]ANSI

C e ISO C

Artculo principal: ANSI C.

A finales de la dcada de 1970, C empez a sustituir a BASIC como lenguaje de programacin de microcomputadores predominante. Durante la dcada 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 compaeros de Bell Labs para aadir funcionalidades de programacin orientada a objetos a C. El lenguaje que crearon, llamado C++, es hoy en da el lenguaje de programacin de aplicaciones ms comn en el sistema operativo Microsoft Windows; mientras que C sigue siendo ms popular en el entorno Unix. Otro lenguaje que se desarroll en esa poca, Objective C, tambin aadi caractersticas de

programacin orientada a objetos a C. Aunque hoy en da no es tan popular como C++, se usa para desarrollar aplicaciones Cocoa para Mac OS X. En 1983, el Instituto Nacional Estadounidense de Estndares organiz un comit, X3j11, para establecer una especificacin estndar de C. Tras un proceso largo y arduo, se complet el estndar en 1989 y se ratific como el "Lenguaje de Programacin C" ANSI X3.159-1989. Esta versin del lenguaje se conoce a menudo como ANSI C, o a veces como C89 (para distinguirla de C99). En 1990, el estndar ANSI (con algunas modificaciones menores) fue adoptado por la Organizacin Internacional para la Estandarizacin (ISO) en el estndar ISO/IEC 9899:1990. Esta versin 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 estandarizacin del ANSI C fue producir una extensin al C de Kernighan y Ritchie, incorporando muchas funcionalidades no oficiales. Sin embargo, el comit de estandarizacin incluy tambin muchas funcionalidades nuevas, como prototipos de funcin, y un preprocesador mejorado. Tambin se cambi la sintaxis de la declaracin de parmetros 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 da por casi la totalidad de los compiladores. La mayora del cdigo C que se escribe actualmente est basado en ANSI C. Cualquier programa escrito slo en C estndar sin cdigo que dependa de un hardware determinado funciona correctamente en cualquier plataforma que disponga de una implementacin de C compatible. 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:

La utilizacin de bibliotecas no estndar, como interfaces grficas de usuario. El uso de compiladores que no cumplen las especificaciones del estndar. 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.

Ventajas del lenguaje C

El lenguaje C tiene una gran cantidad de ventajas sobre otros lenguajes y constituyen precisamente la razn fundamental de que despus de casi dos dcadas de uso C siga siendo uno de los lenguajes ms populares, utilizados en empresas, organizaciones y fbricas de software de todo el mundo. C se caracteriza por su velocidad de ejecucin. En los primeros das de la informtica los problemas de tiempo de ejecucin se resolvan escribiendo todo o parte de una aplicacin en lenguaje ensamblador (muy al lenguaje de mquina). Debido a que existen muchos programas escritos en el lenguaje C, se han creado numerosas bibliotecas C para programadores profesionales que soportan gran variedad de aplicaciones.
Atrs
<< [0] [1] [2] [3] [4] [5] [6] [7] >> [Ref] [CSS]

Sig

Eficiente:

Ms eficiente que lenguajes de alto nivel, casi tan rpido como lenguaje Ensamblador Compilador para cualquier CPU. Lenguaje oficial de la industria del software. Base para nuevos lenguajes: C++, Java, Javascript, PHP, C#, etc. aceptada Definicin ANSI C bastante completa, madura y

Universal:

Estable:

Flexible:

Proporciona mucha libertad y flexibilidad para expresar casi cualquier cosa de bajo nivel Un sistema puede migrarse a otra plataforma a un costo razonable

Portable:

Deficiencias:

Cdigo Confuso: Cdigo muy rebuscado, catico, complicado, confuso, ambiguo, oscuro, etc. Primitivo: Operaciones primitivas que propician cdigo inseguro, e.g. aritmtica de apuntadores Dficil de Dominar: Requiere mucha experiencia el uso correcto a nivel profesional y competitivo, e.g. Caballo salvaje

Dficil de Depurar: Fcil generar errores de programacin (bug), es dficil localizarlos y corregirlos a tiempo Incompatible: Existen aspectos muy abiertos en definicin del lenguaje, e.g. tamao tipo de dato, reduce portabilidad
Variantes
Desde el inicio del lenguaje han surgido varias ramas de evolucin que han generado varios lenguajes:

Objective-C es un primer intento de proporcionar soporte para la programacin orientada a objetos en C, de escasa difusin, pero actualmente usado en Mac OS X , iOS y GNUstep. 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. JavaScript, un lenguaje de scripting creado en Netscape e inspirado en la sintaxis de Java diseado para dar a las pginas webmayor interactividad. A la versin estandarizada se la conoce como ECMAScript. C# (pronunciado C Sharp) es un lenguaje desarrollado por Microsoft derivado de C/C++ y Java.

El proceso de compilacin
Programacin en C/El proceso de compilacin

Normalmente, a la hora de programar no creamos un nico archivo C .c, sino varios de ellos conteniendo diferentes funciones del programa. Esto nos proporciona varias ventajas: una mejor organizacin del cdigo, una mejor modularidad y, sobre todo, ms facilidad (y velocidad) a la hora de compilar. El proceso de compilacin que hemos tratado hasta ahora se divide en realidad en dos etapas, que el compilador nos esconde en una: compilacin propiamente dicha y enlazado. En la primera etapa, la de compilacin, nuestro cdigo en C se transforma en cdigo objeto, es decir, cdigo mquina (instrucciones que el ordenador puede ejecutar) en ficheros .o, mientras que en la segunda etapa (enlazado) estos ficheros objeto son unidos entre s para formar el fichero ejecutable (normalmente sin extensin en el mundo Unix, o con extensin .com o .exe en el mundo MS-DOS/Windows). Archivo:Compilar.png De esta manera, si no hemos modificado el fichero .c que se compila a un determinado fichero .o podemos ahorrarnos esa parte de la compilacin cuando hagamos un cambio en otra parte del programa.

Adems tenemos los archivos de cabecera .h, que utilizamos para definir parmetros que se utilizan en el cdigo (caso delfuente1.h del ejemplo) o para definir todas las funciones que vamos a utilizar en todos los archivos .c (caso del cabeceras.h), ya que si recordamos, las funciones (como todo en C) deben definirse antes de usarse, y es posible que estn en otro fichero, lo cual nunca es considerado por el compilador como "antes". Hay que tener en cuenta que el fichero en el que se encuentra la funcinmain() llama, necesariamente, a todos los dems ficheros .c, directa o indirectamente, ya que de lo contrario lo que tendramos en esos ficheros sera perfectamente intil. Si tpicamente compilaramos el ejemplo con

$ gcc -o programa fuente1.c fuente2.c fuente3.c

para realizar esta compilacin por pasos, stos seran:

$ gcc -c fuente1.c $ gcc -c fuente2.c $ gcc -c fuente3.c $ gcc -o programa fuente1.o fuente2.o fuente3.o

#crea fuente1.o #crea fuente2.o #crea fuente3.o #crea programa

ya que la opcin -c del compilador lo que le dice es que detenga el proceso antes de enlazar, creando los ficheros .o necesarios.

2.1) Estructura de un programa en C. Todo programa escrito en C consta de una o ms funciones, una de las cuales se llama main. El programa siempre comenzar por la ejecucin de la funcin main. Cada funcin debe contener:

Una cabecera de la funcin, que consta del nombre de la funcin, seguido de una lista opcional de argumentos encerrados con parntesis. Una lista de declaracinde argumentos, si se incluyen estos en la cabecera. Una sentencia compuesta, que contiene el resto de la funcin.

Los argumentos son smbolos que representan informacin que se le pasa a la funcin desde otra parte del programa . (Tambin se llamanparmetros a los argumentos).

Cada sentencia compuesta se encierra con un par de llaves, {.....}. Las llaves pueden contener combinaciones de sentencias elementales (denominadas sentencias de expresin) y otras sentencias compuestas. As las sentencias compuestas pueden estar anidadas, una dentro de otra. Cada sentencia de expresin debe acabar en punto y coma (;).

Los comentarios pueden aparecer en cualquier parte del programa, mientras estn situados entre los delimitadores /* ................ */ (por ejemplo: /*esto es un ejemplo*/). Los comentarios son tiles para identificar los elementos principales de un programa o simplemente para orientar a un posible usuario de ese cdigo.

Tipos de instrucciones en C
En lenguaje C, las instrucciones, tambin llamadas sentencias, se pueden clasificar en:

De expresin. De control. Compuestas.

Una instruccin compuesta siempre alberga, entre llaves ({...}), a un <bloque_de_instrucciones>:

{ <bloque_de_instrucciones> }

Un bloque de instrucciones puede estar compuesto por una o ms instrucciones, que, a su vez, pueden ser instrucciones de expresin, de control y/o compuestas nuevamente.

El cuerpo de toda funcin es una instruccin compuesta. Sirva como ejemplo el cuerpo de la funcin main, el cual alberga al bloque de instrucciones principal de un programa escrito en lenguaje C. Las instrucciones de expresin, tambin conocidas como instruccionessimples o elementales, son aquellas que representan a las acciones ms pequeas (elementales) que se pueden ejecutar en un programa, y siempre van seguidas de un carcter punto y coma (;), el cual indica que la instruccin ha terminado:

<instruccin_de_expresin>;

Una instruccin de expresin es, en s misma, una expresin. De modo que, la accin que se ejecuta es la evaluacin de dicha expresin:

<expresin>;

En cuanto a las instrucciones de control, existen de distintos tipos, y todas sirven para modificar el flujo de control de un programa. Veremos que, algunas de ellas deben ir seguidas del carcter punto y coma (;), pero otras no.

Elementos de un programa en C

Los elementos de un programa en C son los siguientes:


Comentarios

Inclusin de archivos

main()

variables locales

flujo de sentencias

Definicin de funciones creadas por el programador utilizadas en main() Veamos en que consiste cada uno: Comentarios: Se identifican porque van entre diagonales y asterisco, el compilador ingnora todo el texto estcrito en ello.Nos sirve para escribir informacin que nos referencie al programa pero que no forme parte de l. Inclusin de archivos: Consiste en mandar llamar a la o las libreriasdonde se encuentran definidas las funciones de C (instrucciones) que estamos utilizando en el programa.

main(): En C, todo est constituido a base de funciones. El programa principal no es la excepcin. main() indica el comienzo de la funcin principal del programa la cual se delimita con llaves. Variables locales: Antes de realizar alguna operacin en el programa, se deben declarar la(s) variable(s) que se utilizarn en el programa. Flujo de sentencias: Es la declaracin de todas las instrucciones que conforman el programa. Definicin de funciones creadas por el programador utilizadas enmain(): Finalmente,se procede a definir el contenido de las funciones utilizadas dentro de main(). Estas contienen los mismos elementos que la funcin principal.

ELEMENTOS DEL LENGUAJE C.

ELEMENTOS

Comentarios

Los comentarios son textos que no son procesados por el compilador. Sirven como informacin al programador. Para que un texto sea comentario debe estar entre los smbolos /* (marca el comienzo) y */ (marca el final de comentario).

Identificadores

Se usan para referenciar las variables, las funciones, las etiquetas y otros objetos definidos por el usuario. La longitud del identificador puede variar entre uno o varios caracteres (se recomienda no ms de 31 y si el identificador est envuelto en el proceso de enlazado al menos los seis primeros deben ser significativos). El primer carcter debe ser una letra o un smbolo subrayado y los caracteres siguientes pueden ser letras, nmeros o smbolos de subrayado. Las minsculas y las maysculas se tratan como distintas.

Un identificador no puede ser igual a una palabra clave de C y no debe tener el mismo nombre que una funcin ya escrita o que se encuentre en la biblioteca de C.

Constantes

Las constantes son expresiones con un significado invariable. La representacin ms simple de un concepto de este lenguaje son las constantes. Al contrario que las variables, las constantes mantienen su valor a lo largo de todo el programa. Para indicar al compilador que se trata de una constante, usaremos la directiva #define #define <identificador> <valor> Observa que no se indica el punto y coma de final de sentencia ni tampoco el tipo de dato. La directiva #define no slo nos permite sustituir un nombre por un valor numrico, sino tambin por una cadena de caracteres. El valor de una constante no puede ser modificado de ninguna manera. /* Uso de las constantes */ #include <stdio.h> #define pi 3.1416 #define escribe printf main() /* Calcula el perimetro */ { int r; escribe("Introduce el radio: "); scanf("%d",&r); escribe("El perimetro es: %f",2*pi*r); }

Variables

Una variable es una posicin de memoria con nombre que se usa para mantener un valor que puede ser modificado en el programa. Todas las variables deben ser declaradas antes de poder usarlas.

Operadores

Los operadores son palabras o smbolos que hacen que un programa acte sobre las variables. En C existen diversos tipos de operadores. Aritmticos, relacionales, de asignacin, lgico.

Sentencias

Una sentencia es una expresin en C donde se esperan unas consecuencias, normalmente son las instrucciones, cada sentencia finaliza con un punto y coma.