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:134
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 sistema,
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.
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.
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.
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.
No hay comentarios.:
Publicar un comentario