1. www.miceminfo.net
l o
ue er
ig m
M o
n nR
Sa rvi
B a
G M
U c.
Li
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
2. www.miceminfo.net
Introducción.
l o
ue er
El lenguaje C se define como un lenguaje de programación de alto nivel, desarrollado a
ig m
principios de los años 70 por Dennis Ritchie, e implementado por primera vez en un DEC PDP-11,
M o
bajo el sistema operativo UNIX. El siguiente trabajo de investigación estudia los orígenes,
n nR
características, desarrollo e importancia del lenguaje C además de su estrecha relación con el
sistema UNIX. Primero que nada, es vital comentar una breve reseña histórica del lenguaje C,
Sa rvi
desde su diseño a creación para luego llegar a su consolidación como uno de los lenguajes
favoritos de programadores alrededor de todo el mundo. Luego, de manera sistemática y objetiva,
B a
G M
se definen los tipos de datos existentes en el lenguaje C para después estudiar las principales
características y procedimientos que se deben seguir al programar en esta poderosa
U c.
herramienta. Es decir, el saber cómo compilar, depurar, ejecutar, editar y enlazar un programa. De
Li
manera anexada se incluyen ejemplos básicos de estas rutinas, los que facilitan la comprensión y
estudio de este lenguaje. Dentro de las características de este lenguaje, se describe la inmensa
gama de operadores y sentencias, además de los tipos de datos, con lo que se hace un detallado
análisis de C, su relación con UNIX y las razones de su permanencia en el tiempo.
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
3. www.miceminfo.net
Historia y características principales.
l o
En un principio, C nació en los laboratorios Bell de AT&T como un lenguaje de
ue er
programación de sistemas, y más específicamente de sistemas operativos. En efecto, las
ig m
primeras versiones de UNIX se implementaron en ensamblador, pero Dennis Ritchie reescribió
M o
el código de UNIX ya existente en C, para facilitar su mantenimiento y transportabilidad. Hoy en
n nR
día sólo una pequeña parte del núcleo de UNIX se sigue escribiendo en ensamblador, estas
son, las partes que se comunican íntimamente con el hardware. Este lenguaje está inspirado
Sa rvi
en el lenguaje B escrito por Ken Thompson en 1970 con intención de decodificar el UNIX, que
B a
en la fase de arranque está escrito en ensamblador, en vistas a su transportabilidad a otras
G M
máquinas. B era un lenguaje evolucionado e independiente de la máquina, inspirado en el
lenguaje BCPL concedido por Martin Richard en 1967. Luego, en 1972, Dennis Ritchie toma el
U c.
relevo y modifica el lenguaje B, creando el lenguaje C y reescribiendo el UNIX basándose en
Li
dicho lenguaje. La novedad y ventaja comparativa que proporcionó el lenguaje C sobre B en el
momento de su creación y desarrollo fue el diseño de tipos y estructuras de datos. Los tipos
básicos de datos eran char (carácter), int (entero), float (reales en simple precisión) y double
(reales en doble precisión). Posteriormente se le añadieron los tipos short (enteros de longitud
menor a la del int), long (enteros de longitud mayor a la del int) y enumeraciones. Los tipos
estructurados básicos de C son las estructuras, las uniones y los arrays. Estos permiten la
definición y declaración de tipos derivados de mayor complejidad.
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
4. www.miceminfo.net
Las instrucciones de control de flujo de C son las habituales de la programación
estructurada: if, for, while, swith-case, todas incluidas en su predecesor BCPL. El lenguaje C
l o
ue er
incluye también punteros y funciones. Los argumentos de las funciones se pasan por valor,
esto es copiando su valor, lo cual hace que no se modifiquen los valores de los argumentos en
ig m
la llamada.
M o
n nR
Cuando se desea modificar los argumentos en la llamada, éstos se pasan por referencia,
es decir, se pasan las direcciones de los argumentos. Por otra parte, cualquier función puede
Sa rvi
ser llamada recursivamente.
Una de las peculiaridades y más grandes ventajas de C es su riqueza de operadores.
B a
G M
Puede decirse que prácticamente dispone de un operador para cada una de las posibles
operaciones en código máquina. Sin embargo, hay además toda una serie de operaciones
U c.
posibles de realizar con el lenguaje C pero que no están incluidas en el compilador
Li
propiamente dicho, si no que C las realiza a través de un preprocesador el cual actúa justo
antes de cada compilación. Las dos operaciones más importantes en este ámbito son #define
(directriz de sustitución simbólica o de definición) e #include (directriz de inclusión en el fichero
fuente).
Sin embargo, el lenguaje C, que ha sido pensado para ser altamente transportable y para
programar lo improgramable, presenta inconvenientes al igual que todos los otros lenguajes:
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
5. www.miceminfo.net
Carece de instrucciones de entrada/salida de instrucciones para manejo de
cadenas de caracteres, con lo que este trabajo queda para la librería de rutinas, con la
l o
ue er
consiguiente pérdida de transportabilidad.
ig m
La excesiva libertad en la escritura de los programas puede llevar a errores en la
M o
programación que, por ser correctos sintácticamente no se detectan a simple vista.
n nR
Por otra parte, las precedencias de los operadores convierten a veces las
expresiones en pequeños rompecabezas.
Sa rvi
B a
Los detractores de C resaltan que este lenguaje es de nivel medio. Esto no significa que sea
G M
más complejo que uno de bajo nivel como el ensamblador, ni tampoco menos evolucionado y en
definitiva peor diseñado que uno de alto nivel, como Pascal o su derivado Ada. El “nivel” de un
U c.
lenguaje no viene dado por su dificultad o su utilidad, si no que por las operaciones que se
Li
puedan especificar en él. Se dice que C es un lenguaje de nivel medio porque “aúna” elementos
de los lenguajes de alto nivel con las posibilidades que ofrece el lenguaje ensamblador.
En estos lenguajes de alto nivel tiene especial importancia el concepto de tipo de dato, que
define el conjunto de valores que puede tomar una variable, y el conjunto de operaciones que se
pueden efectuar sobre ella. Algunos tipos son fácilmente comprensibles intuitivamente, como los
enteros o los reales, pero otros son más oscuros, como el tipo de datos vacío (void) de C. Todos
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
6. www.miceminfo.net
los lenguajes de alto nivel controlan el uso de los distintos tipos de datos; o sea, ciertas
operaciones sólo se pueden realizar sobre ciertos tipos; esto se denomina tipificación. Sin
l o
ue er
embargo, este control puede efectuarse rígidamente, como en Pascal o Ada, o ser aplicado
menos estrictamente, como en C; por esto, se dice que C es un lenguaje débilmente tipificado.
ig m
Esto conlleva que en C se pueda realizar cualquier transformación de datos, la mayoría incluso de
M o
n nR
forma implícita. Por ejemplo, el paso del tipo carácter al tipo entero se realiza implícitamente en
cualquier expresión de C. Otra característica que C comparte con los otros lenguajes de alto nivel
Sa rvi
es la posibilidad de crear nuevos tipos de datos a partir de los ya existentes.
B a
Por otro lado, C hereda capacidades del lenguaje ensamblador como la manipulación
G M
directa de mapas de bits, punteros, y otros tipos que usa el hardware internamente. Es por este
U c.
motivo que C está particularmente bien adaptado a la programación de sistemas.
Li
Sin embargo, a pesar de combinar muchas de las ventajas de los lenguajes de alto y bajo
nivel, C hereda también algunos de sus problemas. La mayoría de estas dificultades provienen
del hecho de que C es un lenguaje pensado por y para programadores; su diseño considera la
eficiencia del programa final más que la facilidad de desarrollo. De hecho, es un lenguaje que se
lee difícilmente, al permitir “expresiones idiomáticas” particulares, que fomentan la escritura de
código difícilmente comprensible para los demás. Además, este lenguaje no implementa ningún
tipo de comprobación de errores en tiempo de ejecución; o sea, el compilador asume que
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
7. www.miceminfo.net
aquello que se le pide, aunque parezca extraño, procede de un programador experimentado, que
sabe exactamente lo que quiere; esto conlleva que ciertas tareas que en otros lenguajes de más
l o
ue er
alto nivel son largas se puedan realizar rápidamente en C, pero también que ciertos errores
comunes que son localizados en otros lenguajes en tiempo de compilación puedan quedar
ig m
ocultos durante mucho tiempo en programa en C. En definitiva, se puede decir que C proporciona
M o
n nR
un gran control al desarrollador sobre cada aspecto de su programa, pero éste debe ser
manejado cuidadosamente.
Sa rvi
Un lenguaje estructurado
B a
G M
En un lenguaje estructurado como C, el programa se organiza en una serie de bloques de
U c.
código independientes que se llaman los unos a los otros. Este método de programación
Li
soluciona algunos de los problemas más recurrentes que se le pueden plantear al programador:
en vez de tener que seguir atentamente el flujo de ejecución a lo largo de un inmenso programa,
se puede controlar la ejecución en el bloque principal, que va llamando a los otros bloques para
tareas secundarias o repetitivas. En este aspecto, C es similar a otros muchos lenguajes como
Pascal, Ada, Modula, etc. sin embargo, estrictamente hablando, C no es un lenguaje estructurado
en bloques. El motivo es que no se puede declarar una función local a otra función, es decir que
no se puede definir una función que sólo se pueda llamar desde el interior de otra. Por otro lado,
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
8. www.miceminfo.net
los lenguajes de alto nivel ofrecen un gran número de construcciones condicionales y bucles. En
estos lenguajes se limita o se elimina el uso de goto y de las etiquetas correspondientes, lo que
l o
ue er
era posible en programas anteriores, como por ejemplo, en Pascal. De hecho, en aquellos
lenguajes que lo permiten, como C, el uso de goto está muy mal visto; éste es uno de los criterios
ig m
que se usan habitualmente para juzgar si un código está bien estructurado o no. En efecto, el uso
M o
n nR
de saltos con goto tiene tendencia a producir un “código espaghetti”, que es difícil de leer y de
mantener. Por el contrario, en los lenguajes estructurados se usan construcciones más
Sa rvi
funcionales como if y bucles for y while, que clarifican la estructura del programa.
B a
G M
El Lenguaje C y el Sistema UNIX.
Como fue mencionado al principio, el lenguaje C se desarrolló para tener un lenguaje de
U c.
alto nivel en el que se pudiera programar el Sistema Operativo UNIX. Por lo mismo, los
Li
programas en C constan de uno o más ficheros con procedimientos y declaraciones. Estos
ficheros se pueden compilar por separado, generándose ficheros objeto independientes, que
el montador (o linker) de enlaces ha de combinar para generar el programa ejecutable. La
automatización de este proceso se realiza mediante una herramienta que dependerá del
sistema en el que se realice la aplicación.
En UNIX, esta herramienta es (make). Los ficheros de las aplicaciones codificadas en C
se dividen en dos tipos, según su nombre acabe en: c o en .h. Los ficheros .c contienen la
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
9. www.miceminfo.net
implementación del módulo y los .h (cabeceras o header) contienen la información sintáctica y
semántica sobre el uso de la interfase del módulo. Los ficheros .h pueden ser dependientes de
l o
ue er
la aplicación o propios del sistema operativo. Contienen un bloque de comentarios, sentencias
de inclusión de otros ficheros .h, definiciones de constantes y tipos, y declaraciones de
ig m
funciones. Debe recordarse eso sí de que no se permite declarar variables en un fichero .h.
M o
n nR
En toda aplicación existe además un módulo principal, que es el que define la función
main. En este sistema existen varias funciones main, debido a que cada una se corresponde
Sa rvi
con la ejecución de un programa, es decir, un proceso del sistema. Ligado a lo anterior, se
corresponderá ahora a explicar el funcionamiento del compilador de C en UNIX, el cual es
B a
G M
utilizado para la obtención de los ficheros ejecutables necesarios para el funcionamiento de la
parte práctica del sistema. La función de este compilador no es sólo traducir programas en
U c.
lenguajes de alto nivel a código máquina para que sean ejecutados en una computadora
Li
específica. Este compilador además proporciona un entorno de ejecución adecuado en el que
se pueden llevar a cabo operaciones de entrada/salida, acceso a ficheros y a otras interfaces
del sistema operativo. En el sistema operativo UNIX, el comando utilizado para compilar
programas en C es cc. Este proceso de compilación consta de 5 fases:
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel
10. www.miceminfo.net
1) Preprocesamiento: es realizado por el programa cpp (preprocesador de C). Maneja
definiciones de constantes, inclusión de ficheros, gestión de macros, compilación condicional,
l o
ue er
etc.
ig m
2) Compilación: tomando como entrada los resultados de la fase anterior, el programa ccom
M o
realiza chequeos sintácticos, el parsing, y la generación del código ensamblador.
n nR
3) Optimización: es opcional. Proporciona al generador de código una mayor velocidad.
4) Ensamblado: el programa ensamblador asm se utiliza para crear un fichero objeto que
Sa rvi
contiene código binario y genera la información que va a ser utilizada por el linker/cargador.
B a
5) Cargado: el programa de cargado constituye un linker/cargador. Combina todos los ficheros
G M
objetos y enlaza (o linca) éste a todas las subrutinas de librerías necesarias para producir un
U c.
programa ejecutable.
Li
El comando cc se encarga de tomar un fichero .c como entrada, generando el
correspondiente fichero .o (objeto). A partir de un fichero .s o ensamblado, se produce este fichero
.o. luego, este fichero .o se convierte en un fichero ejecutable. Si esta compilación se realiza en un
solo paso, entonces el fichero .o se borra automáticamente.
Lic. Marvin Romero _:_:_ marfonline@gmail.com _:_:_ UGB, San MIguel