(Este artículo forma parte del Curso de Programación en C)
Ya tiene más de 30 años, lo cual es una eternidad en el universo informático, pero sigue tan lozano como el primer día. GNU/Linux y, de hecho, casi todos los sistemas operativos están programados en gran parte con él. Cientos de miles, tal vez millones, de programadores en todo el mundo lo conocen. Es el lenguaje C. ¿Pero quién es este tipo? ¿A qué se debe su longevidad?
Breve historia de C
Empecemos por el principio. En 1972, los laboratorios Bell necesitaban un nuevo sistema operativo. Hasta ese momento, la mayoría de los sistemas operativos estaban escritos en un lenguaje ensamblador ya que los lenguajes de alto nivel no generaban programas lo suficientemente rápidos. Pero los programas escritos en ensamblador son difíciles de mantener y Bell quería que su nuevo sistema operativo se pudiera mantener y modificar con facilidad. Por lo tanto, se decidieron a inventar un lenguaje de alto nivel nuevo con el que programar su sistema operativo. Este lenguaje debía cumplir dos requisitos: ser tan manejable como cualquier otro lenguaje de alto nivel (para que los programas fueran fáciles de mantener) y generar un código binario tan rápido como el escrito directamente en ensamblador.
Dennis Ritchie, un ingeniero de laboratorios Bell, diseñó el lenguaje C usando un ordenador DEC PDP-11. Se denominó C porque evolucionó de un lenguaje anterior llamado B, que se denominó B porque provenía de otro lenguaje llamado BCPL, que a su vez… Bueno, oigan, al principio de todo hubo una gran explosión, luego la materia se condensó y surgieron las galaxias y todo eso… El caso es que el lenguaje C pasó a convertirse y conocerse como “un lenguaje de programación de alto‑bajo nivel”, significando con esa frase que soporta todas las construcciones de programación de cualquier lenguaje de alto nivel, incluyendo construcciones de programación estructurada, pero también se compila en un código eficiente que corre casi tan rápidamente como un lenguaje ensamblador.
Los laboratorios Bell terminaron de construir su sistema operativo Unix y su lenguaje de programación por excelencia, C. El tándem C – Unix ha sido la referencia fundamental en el mundo de la programación desde entonces, y C se ha convertido en uno de los lenguajes de programación más populares y longevos de la historia de la informática. C creció en popularidad muy rápidamente y sigue siendo uno de los lenguajes fundamentales tanto en el mundo educativo como en el mundo profesional.
El lenguaje C como tal aparece descrito por primera vez en el libro “The C Programming Language” (Prentice-Hall, 1978), aunténtica biblia de la programación escrita por Brian Kerninghan y el propio Dennis Ritchie. El lenguaje se extendió rápidamente y surgieron diferentes implementaciones con ligeras diferencias entre sí hasta que el instituto de estándares americano (ANSI) formó un comité en 1983 para definir un estándar del lenguaje. El primer estándar ANSI C apareció en 1989 (C89) y fue revisado en 1999 (C99).
Una evolución de C fue el lenguaje C++, diseñado por Bjarne Stroustrup en los años 80. Además de todas las características del ANSI C, C++ incluye soporte para la orientación a objetos, una técnica de programación ligeramente diferente de la programación estructurada de la que ya hablaremos otro día. Y en el año 2000, Microsoft presentó el lenguaje C#, otra evolución de C++ orientada al desarrollo de aplicaciones para la plataforma .NET de esta compañía. Los dos lenguajes (C++ y C#) cuentan en la actualidad con sus respectivos estándares ISO.
En la actualidad son muchos los fabricantes de compiladores C, y todos cumplen con la norma ANSI C89 como mínimo, por lo que el código escrito para un compilador es altamente portable a otros.
Un lenguaje para programadores
Hace tiempo leí (en un libro sobre C de Herbert Schildt) la siguiente reflexión, que al principio puede resultar sorprendente:
Pero… ¿no son todos los lenguajes para programadores? La respuesta es sencillamente: no.
Analizando un poco más las razones del autor para tan rotunda negativa, se llega a la conclusión de que existen determinados lenguajes (algunos clásicos, como Basic, Cobol o Fortran, y otros más actuales, como Visual Basic) que han sido diseñados para permitir que los no programadores puedan leer y comprender los programas y, presumiblemente, aprender a escribir los suyos propios para resolver problemas sencillos.
Por el contrario, C fue creado, influenciado y probado en vivo por programadores profesionales. El resultado es que “C da al programador profesional lo que el programador profesional pide” (parafraseo de nuevo a Schildt). Es decir: C tiene pocas restricciones, pocas pegas, bloques de código independientes y un reducido (pero suficiente) conjunto de palabras clave. Si a esto unimos que el código objeto generado por C es casi tan eficiente como el ensamblador, se entenderá por qué lleva 30 años siendo el lenguaje más popular entre los programadores profesionales.
Ahora bien, C también tiene sus detractores que lo acusan de ser confuso, críptico y demasiado flexible. En efecto, con C se pueden desarrollar las técnicas de programación estructurada, pero también se puede programar “código espagueti”. Otro ejemplo: C++ es un lenguaje orientado a objetos que, sin embargo, permite saltarse a la torera todas las reglas de la orientación a objetos.
Un lenguaje estructurado y modular
C es un lenguaje estructurado porque contiene las estructuras de control básicas de las que hemos hablado con anterioridad. También permite romper las estructuras y escribir programas no estructurados, pero en este blog huiremos de ello como de la peste.
C es un lenguaje estrictamente modular. Todos los algoritmos se escriben en forma de funciones, incluido el algoritmo principal (cuya función siembre recibe el mismo nombre: main() ). En C no existen los procedimientos, pero se pueden escribir funciones que no devuelvan ningún valor, es decir, funciones que en realidad son procedimientos.
Características de C
Como resumen de esta introducción al lenguaje C, les propongo la siguiente lista de caracterísitcas definitorias de nuestro viejo amigo:
- Es un lenguaje con muy pocas palabras clave.
- Los operadores de C son más numerosos que en la mayoría de los lenguajes de programación anteriores y contemporáneos suyos.
- Muchas de las sentencias de decisión y de bucles han servido de referencia para el diseño de todos los lenguajes creados en estos últimos años, de modo especial los populares Java, PHP y Visual Basic (no confundir Java con JavaScript: son dos lenguajes diferentes. Tampoco se debe confundir Visual Basic con el antiguo Basic)
- C es un lenguaje muy eficiente, casi tanto como el ensamblador, por lo que es adecuado para desarrollar software en el que la velocidad de ejecución sea importante: sistemas operativos, sistemas en tiempo real, compiladores, software de comunicaciones, etc.
- C es un lenguaje de nivel intermedio: soporta todas las estructuras de programación típicas de los lenguajes de alto nivel, pero también permite realizar tareas de bajo nivel (como manipulación de datos a nivel de bit, acceso directo a los registros del procesador, a los puertos de entrada/salida o a la memoria, etc.). Por eso es tan adecuado para la programación de sistemas.
- C y Unix (o GNU/Linux) forman una pareja estable y fuertemente compenetrada.
- C es altamente portable, más que otros lenguajes de alto nivel, ya que existen compiladores para lenguaje C estándar en todas las plataformas imaginables.
- Es un lenguaje muy popular y, por lo tanto, existen multitud de librerías de funciones ya programadas que se pueden reutilizar, así como documentación abundante y muchos programadores profesionales que conocen el lenguaje.
- C es más críptico que la mayoría de los otros lenguajes de programación de alto nivel. Su naturaleza críptica proviene de la enorme cantidad de operadores y un número pequeño de palabras clave o palabras reservadas. ¡El lenguaje C estándar tiene solamente 32 palabras reservadas!

3 comments
Comments feed for this article
Trackback link
http://profeblog.es/blog/alfredo/2008/04/22/el-lenguaje-c-sigue-dando-guerra/trackback/
1 Julio 2008 at 18:06
IGNACIO AULAR
#include
main(){
printf(”HELLO, MY NAME IS IGNACIO AULAR, I AM A STUDENT OF SCIENCE COMPUTER FROM VENEZUELA, I LIKE THE PROGRAMMING C, GOOD BYE DEAR FRIEND”);
getch();
return;
}
2 Julio 2008 at 15:01
Alfredo Moreno Vozmediano
prueba.c:1:9: error: #include espera “NOMBRE_ARCHIVO” ó
26 Enero 2009 at 12:01
javier
pon:
#include
saludetes
PD: Cuando se quiere hacer un programa eficiente de hace en C. Cuando su quiere hacer un programa cómodo se hace en Java.