                   El lenguaje de programacin C
                   *****************************

Prefacio

C es un lenguaje de programacin de empleo general caraterizado por su
concisin y por poseer un moderno flujo de control y estructura de 
datos, asi como un rico conjunto de operadores. No es un lenguaje de 
"muy alto nivel" ni "grande", no estando especializado en ningn rea 
particular de aplicacin. En cambio, su carencia de restricciones y 
su generalidad lo hacen ms eficaz y conveniente para muchas tareas 
que otros lenguajes supuestamente ms potentes.

C fue diseado originalmente para el sistema operativo UNIX (marca 
registrada de Bell Laboratories) en la PDP-11 de la DEC e implantado 
en ella por Dennis Ritchie. Tanto el sistema operativo como el 
compilador de C y prcticamente todos los programas de aplicacin en 
UNIX se escribieron en C. Tambin existen compiladores para otras 
mquinas, entre ellas la IBM/370, Honeywell 6000 e Interdata 8/32. Sin 
embargo, C no est ligado a un hardeware o sistema en concreto, siendo 
fcil escribir programas que ejecuten tareas sin ningn cambio en 
cualquier mquinas que soporte C.

C ha demostrado ser un lenguaje agradable, expresivo y fcilmente 
aplicable a una amplia variedad de programas, es fcil de entender y se 
obtienen mejores resultados a medida que aumenta nuestra experiencia 
con l. 

Introduccin

C es un lenguaje que es usado por mucha gente en todo el mundo y est 
estrechamente asociado al sistema operativo UNIX, pero lo cierto es que
C no esta ligado a ningn sistema en especial.

C ha sido llamado "lenguaje de programacin de sistemas" por su 
utilidad para escribir sistemas operativos, pero ha probado con el 
tiempo que se puede usar para desarrollar programas cientficos, 
procesadores de texto o manejadores de bases de datos indistintamente.

C es un lenguaje de relativo bajo nivel, esto no significa que C no 
sirva mucho, significa que C puede trabajar con la misma clase de  
objetos con que trabajan la mayora de las computadoras: carcteres, 
nmeros y direcciones, que pueden ser combinados con operadores 
aritmticos o lgicos usados normalmente en las mquinas. 

C no contiene operaciones para trabajar con objetos compuestos, tales 
como cadenas (tiras) de carcteres, conjuntos, listas, cadenas de 
vectores, considerados como un todo. No hay por ejemplo analoga con 
los operadores de PL/1, que son capacez de manipular un arreglo o una 
cadena de carcteres completos. el lenguaje no definida ninguna 
capacidad de realizar asignacin de memoria aparte de las definiciones 
estticas y el manejo de las pilas para las variables locales de las 
funciones: no emplea "heap" ni "recolector de basura" como el Algol 68. 
Finalmente, C no cuenta con operaciones de entrada-slida; no existen 
proposiones READ o WRITE, ni mtodos propios para el acceso a archivos 
(ficheros). Todos estos mecanismos de alto nivel deben ser aportados 
por funciones llamadas explcitamente.

De la misma manera, C slo ofrece proposiones (sentencias) de control 
de flujo sencilla, secuenciales, de seleccin, de iteracin, bloques 
y subprogramas, pero no multiprogramacin, paralelismo, sincronizacin 
o corutinas.

Aunque la ausencia de alguna de estas caractersticas podra paracer 
una grave deficiencia ( Pretende usted que llame a una funcin para 
comparar dos cadenas de carcteres?), el mantener el lenguaje dentro 
de dimensiones modestas produce beneficios reales. ya que C es 
relativamente pequeo, puede describirse en poco espacio y aprender 
rpidamente. El compilador para C puede ser sencillo y compacto. Los 
compiladores se escriben facilmente; utilizando la tecnologa actual, 
es posible tener preparado un compilador para una nueva mquina en un 
par de meses y descubrir que un 80% del cdigo de un nuevo compilador 
es igual al de los ya existentes. Esto hace que un lenguaje se a de un 
alto grado de portabilidad (movilidad). Debido a que los tipos de dato 
y estructuras de control que ofrece son manejados por la mayora de los
 computadores actuales, la biblioteca de tiempo de ejecucin necesaria 
para realizar programas independientes es minscula . En la PDP-11, 
por ejemplo, contiene nicamente las rutinas para multiplicain y 
divisin de nmeros de 32 bits y para realizar las secuencias de 
entrada en las subrutinas y retorno de ellas. Por supuesto, cada 
versin contiene una extensa y compatible biblioteca de funciones para
llevar a cabo las operacioens de E/S, manejo de cadenas de carcteres
y asignacin de memoria; pero como son llamadas nicamente en forma 
explcita, estas funciones pueden omitirse en caso necesario. Pueden 
incluso estar escritas en el mismo C.

Debido tambin a que el lenguaje refleja las posibilidades de las 
computadoras actuales, los programas en C tienden a ser lo suficiente
eficientes como para que no haya necesidad de escribirlos en lenguaje
ensamblador. El ejemplo ms claro es el sistema operativo UNIX,
escrito en su mayor parte en lenguaje C. De las 13000 lneas de cdigo
del sistema, slo estn escritas en ensamblador las 800 necesarias 
para satisfacer las necesidades de ms bajo nivel. De hecho casi todas
las aplicaiones de UNIX estn escritas en C. La gran mayora de los
usuarios de UNIX ni siquiera conocen el lenguaje ensamblador de la 
PDP-11.

Aunque las posibilidades de C corresponden a las de muchas computadoras
, el lenguaje es independiente de cualquier arquitectura de mquina en
particular y as, con algo de cuidado, es fcil escribir programas
"porttiles", es decir, programas que pueden ejecutarse sin cambios
en una amplia variedad de computadoras. Es costumbre en nuestro medio
que el software desarrollado en UNIX seatransportado a los sistemas
Honeywell, IBM e Interdata. DE hecho, los compopiladores de C y los
soportes de tiempo de tiempo de ejecucin son mucho ms cmpatibles
que las versiones ANSI de FORTRAN. El sistema operativo UNIX 
actualmente est instalado en PDP-11 y al Interdata 8/32. Exceptuando 
los programas que necesariamente dependen de alguna forma de la
mquina, como por el compilador, ensamblador y depurador, el 
software escrito en C es identico en ambas mquinas. En el sistema
operativo las 7000 lneas de cdigo, si tomar en cuenta el soprte del
ensamblador y los manejadores de dispositivos de E/S, son idnticas en
un 95%.

Para los programadores familiarizados con otros lenguajes, conviene 
hacer una breve mencin de algunos aspestos histricos, tcnicos y
filosficos de C a fin de destacar los detalles peculiares de C y los
que comparte con ellos.

Muchas de la ideas principales de C provienen de un lenguaje mucho ms
antiguo pero an vigente: el lenguaje BCPL inventado por Martin
Richards. La influencia de BCPl le llega indirectamente a travs del
lenguaje B, escrito por Ken Thompson en 1970 para el primer sistema 
UNIX en una PDP-7. 

Aunque tiene varias caractersticas comunes con el BCPL, C no es 
propiamente un dialecto suyo. tanto BCPL como B son lenguaje "sin 
tipos": el nico tipo de datos es la palabra de mquina, y el acceso
a otra clase de objetos se efecta a travs de operadores especiales 
o de llamadas a funciones. En C los objetos fundamentales son
carcteres, enteros de varios tamaos y nmeros de punto flotante.
Adems existe una gerarqua de tipos de datos derivados, creados con 
apuntadores, arreglos, estructuras, uniones y funciones. 

C posee las construcciones fundamentales de construcin de flujo sin
las cuales no es posible construir programas bien estructurados; 
agrupamiento de sentencias, toma de sentencias (if), ciclos (bucles), 
con comprobacin de la condicin de termino al principio (while, for) 
o al final (do) y seleccin dentro de un conjunto de casos posibles 
(switch). (Todas estaban incluidas en BCPL, aunque con alguna 
diferencia de sintaxis; este lenguaje se anticip varios aos a la
moda de la "programacin estructurada".) 

C incluye apuntadores (punteros) y capacidad de aritmtica de
direcciones. Los argumentos de las funciones se pasan por valor,
siendo imposible que la funcin llamada altere el valor del argumento
del llamante. Cuando se debe realizar una "llamada por referencia", 
se puede pasar el apuntador explcitamente, pudiendo la funcin 
cambiar el valor del objeto al que se apunta.los nombres de arreglos 
se pasan como la direccin de origen del arreglo mismo. Por tanto, los
argumentos de tipo de arreglo se transmiten por referencia. 

Cualquier funcin puede ser llamada recursivamente y sus variables
locales son normalmente "aotomticas" o creadas de nuevo en cada 
invocacin. Las definiciones de funcin no pueden anidarse, pero las
variables pueden ser declaradas con una estructura de bloques. Las 
funciones de un programa C pueden compilarse por separado. Las 
variables pueden ser internas a una funcin, externas (pero conocidas
nicamente a lo largo de un solo archivo fuente) y completamente 
globales. Las variables internas son automticas o estticas. Las
variables automticas pueden colocarse en un registro para incrementar
su eficiencia; pero su declaracin como registro es nicamente una 
indicacin al compilador y no se refiere a registros especficos de la
mquina.

C no es un lenguaje "fuertemente estructurado" en el sentido de Pascal
o Algol68. Es relativamente flexible en la conversin de datos, aunque 
no realize conversin automtica entre tipo de datos con el 
despreocupado abandono de PL/1.

Los compiladores disponibles no ofrecen comprobacin de los subndices
de arreglos, tipos de argumentos, ect; durante la ejecucin.

Para aquellas situaciones en que conviene contar con comprobacin de
tipos se utiliza una versin separada del compilador. Este programa se
llama lint (pelusa) porque extrae "pelusilla" de los programas. Lint
no genera cdigo, sino que realiza una comprovacin muy estricta de 
tantos aspectos de un programa como puedan ser comprobadas durante la 
compilacin y la carga. Detecta inconsistencias en los tipos, uso 
incongruente de argumentos, variables no utilizadas o no inicializadas,
problemas potenciales de portabilidad y otras parecidas. Los porgramas
que pasan sin problemas a travs de lint estn excentos, salvo 
excepciones, de errores relativos a tipos en forma tan completa como,
por ejemplo, los escritos en Algol68. Mencionaremos otras capacidades 
de lint segn se vaya presentando la ocasin.

Finalmente C, igual que cualquier otro lenguaje, tiene sus 
inconveniente. Algunos de los operadores tienen precedencia equivocada;
algunas partes de la sintaxis podran ser mejores. Existen varias 
versiones del lenguaje, aunque difieren en poco. A pesar de todo, C ha
demostrado ser un lenguaje extremadamente eficaz y expresivo para una 
extensa gama de aplicaciones de programacin.

Por ser C un lenguaje en evolucin qu existe en varios sistemas, parte
del material de este libro quiz no corresponda al estado actual del 
desarrollo de un sistema particular. 



