Disponible la versión 6 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


1 Programación C++

"No programming language can be all things to all programers. No matter how many features a language has, there's always someone who wants just one more". Dan Saks  "C/C++ Users Journal"  Enero 1990.

§1  Observaciones y comentarios sobre los lenguajes C/C++

Se ha dicho:

  "C++ es un lenguaje potente, pero a veces no es precisamente un paseo por el parque... De acuerdo, de acuerdo, es orientado a objetos.  Correcto.  Yo personalmente conozco gente que ha trabajado toda una semana en herencia múltiple, para retirarse completamente frustrado a Carolina del Norte a limpiar cochineras".  Joshua Trupin: MSDN Magazine, Septiembre 2000    www.msdn.microsoft.com/msdnmag/default.asp

  "C hace fácil dispararse en los propios pies;  C++ lo hace más difícil, pero cuando lo haces, te vuela la pierna completa".  Stroustrup.

  “C++ es un lenguaje difícil en el que puede existir una línea muy tenue entre una característica y un 'bug' ".  Programming in C++: Rules and Recommendations, Ellemtel Telecommunication Systems Laboratories, Sweden.

  "Para nuestro gusto C++ ya es demasiado largo y complicado".  Comité de estandarización del C++.

  "Tiene una sintaxis compleja, semántica sutil y una temible reputación".  Steve Donovan "Scripting C++".  InformIT Marzo 2002

  "Todos los hombres ascienden en la escala hasta alcanzar su máximo nivel de ineficacia".  Dr. Laurence J. Peter. "La pirámide de Peter".  Ed. Plaza & Janes S.A. Barcelona [5].

Creo que C++ es un magnífico ejemplo de que lo anterior es aplicable también a los lenguajes de programación.  En efecto, C++ es una muestra de como las cosas pueden seguir mejorándose hasta llegar a un nivel de complejidad que las hace prácticamente inutilizables por el común de los mortales, a no ser que les dediquen un mínimo de 500 horas para empezar a entenderlas [9].  Como botón de muestra, incluyo un comentario encontrado en Amazon [1] sobre el libro  "The C++ Programming Language" (TC++PL para los íntimos) del ya citado Stroustrup:  "Estoy en mi tercer año de aprendizaje de C++ (sí, se tarda un tiempo en conocer el C++, en conocerlo realmente), todavía lo leo una y otra vez, y cada vez encuentro más y más cosas útiles y consejos importantes", Caliv Nir (Israel).

Afortunadamente parece que las cosas vuelven a su cauce.  Hace poco tiempo que algunos se dieron cuenta que el asunto había empezado a desmadrarse, así que empezaron a quitarle cosas y a simplificarlo..., ¡Estaba naciendo Java!  (es también la explicación "oficial" de Microsoft para inventar el C#  ;-)

Nota:  Esta es la situación por el momento, pero no os preocupéis.  Vemos como Java se está perfeccionando a marchas rápidas, con lo que a no tardar será tan complejo como C++ y habrá que volver a inventar algo más sencillo...[4]   En cuanto al C#:  Sea bienvenida cualquier mejora!!.  Aunque se me ocurre que no estaría de más aquello de mantener una cierta "diversidad genética" en la informática, mucho me temo que al paso que vamos acabemos todos vestidos de gris con el "Libro Rojo" en el bolsillo :-(  [6]

§2  Reseña histórica

Desde un punto de vista histórico, el C es anterior al C++, aunque el estándar C++ fuera publicado antes que el de C [2], de modo, que paradójicamente el hijo influyó en el estándar del padre.  Así pues, la propuesta de ANSI C recogió algunas de las normas del C++.  Ambos nacieron en los prestigiosos laboratorios Bell de la AT&T (American Telephone and Telegraph) en Murray Hill (New Jersey USA) [3].  El primero de la mano de Brian W. Kernighan y Dennis M. Ritchie (la "K" y la "R" de K&R, siglas con las que se les conoce), el segundo es de Bjarne Stroustrup.

La primera edición del libro: "El lenguaje de programación C" de K&R es de 1978.  Por su parte la primera edición de: "El lenguaje de programación C++" de Stroustrup es de 1986.  El propio Stroustrup reconoce que comenzó a trabajar en su diseño en 1979;  justo un año después de la publicación del clásico de K&R.  Las primeras versiones en uso del lenguaje (bajo el nombre de "C con clases") en el entorno de los departamentos de investigación de la AT&T se remontan a 1980.  La primera utilización del lenguaje fuera del entorno de investigación data de Agosto de 1983.  La designación actual C++ fue acuñada en el verano de 1.983 por Rick Mascitti.  El primer compilador comercial fue lanzado en Octubre de 1985.

Como todos los lenguajes (naturales y de programación), el C++ es un resultado de la evolución;  de forma que recoge influencia de sus ancestros, algunos de los cuales ya se han señalado ( 0.1).  Además es en sí mismo un producto en evolución.  Las últimas aportaciones datan de los 80, y se refieren principalmente al mecanismo de excepciones y a las plantillas ("Templates").

Sin duda la mejor fuente de información sobre la historia y evolución de este lenguaje es su propio inventor, de modo que remitimos al lector a sus propias palabras D&EC++.

§2.1  Situación actual

Después de décadas de aparente inactividad por parte del Comité Internacional encargado de elaborar el estándar, el 25 de Marzo de 2011, los medios especializados de todo el mundo, se hacían eco de que finalmente, el comité ISO para el C++ había sido aprobado el último borrador del nuevo estándar en su reunión de primavera en Madrid. Esta versión, en la que se había estado trabajando intensamente, era conocida como C++09 porque se suponía que sería aprobada en el 2009. Sin embargo, el proceso sufrió sucesivos retrasos, de forma que finalmente era conocido -quizás un poco humorísticamente- como C++0x, en relación a que no se sabía cuando aparecería. Finalmente, si las cosas discurren como es de suponer, la aprobación ocurrirá dentro de este año, así que el próximo estándar será el C++2011.

Nota: a la hora de escribir estas líneas, la última revisión publicada lo era bajo el título ISO_C0x_final_draft. Un documento .PDF de nada menos que 11 MB.


Podría decirse que después de vivir una época dorada, la popularización y uso del C++ había sufrido una cierta ralentización en favor de nuevas modas y nuevos lenguajes, y que incluso su desarrollo y evolución habían quedado estancados desde los años 70. Sin embargo, esta aparente "inactividad" ha estado lejos de ser real y el nuevo estándar incluye un sinnúmero de avances conceptuales y materiales -en forma de nuevas librerías- que lo colocan de nuevo en una posición puntera dentro del mundo de la programación, en especial en lo que respecta a grandes sistemas. Precisamente, la razón principal de los retrasos ocurridos en el proceso de aprobación del nuevo estándar, tienen mucho que ver con la magnitud, número y calado de las nuevas extensiones y librerías.

Con independencia de que los cambios se hagan oficiales, muchas de las nuevas herramientas ya estaban en la calle de forma más o menos oficial, de la mano de los fabricantes de compiladores. De forma que se habla incluso de un "renacimiento" del C++ como herramienta y concepto. Para que el lector pueda hacerse una idea de por donde van las últimas tendencias, a continuación le incluyo algunos enlaces ilustrativos.

§3  Estudiar C++

"C++ should not be for beginners, as it is better to learn the principles from a clearer language than be confused by what all the syntactic knobs and dials, and superfluous constructs do in C++.   As for courses, C++ has proven so difficult to learn that you need lots of courses".  Ian Joyner "C++??" (  [Joyner-96]).


Para tener una perspectiva histórica parece natural estudiar primero C y después C++, con lo que se empiezan a ver las diferencias y salvedades entre uno y otro.  Este es el enfoque de algunos libros; de hecho el ya comentado manual de ayuda "C++ Builder Languaje Guide" sigue más o menos esta pauta.  Dedica muchos comentarios a las diferencias entre C y C++, y al final dedica un capítulo a los asuntos que son exclusivos de este último.  Algunos de estos libros incluso hacen comentarios curiosos, que ya solo tienen sentido desde un punto de vista histórico.  Por ejemplo, citan que los ficheros fuente de los programas C deben tener nombres con terminación ".c" y los de C++ terminaciones ".cc" o ".cpp", lo que es superfluo para los compiladores actuales.  Por ejemplo, Borland C++Builder puede compilar perfectamente fuentes .c como C o como C++ con un simple indicador (-P) en la orden de llamada.

Nota:  Otros, como los compiladores GNU C/C++, permiten utilizar ambos criterios.  Además de poder utilizar una directiva explícita, pueden distinguir el tipo de compilación por la terminación de los fuentes.  Por ejemplo, las terminaciones .c son tratadas y compiladas como fuentes C, mientras que los sufijos .C; .Cpp.C++; .cc son compilados como C++.  Otros compiladores C++ Unix como Solaris de SUN o HP-UX pueden compilar fuentes con terminaciones .C, .c, .cc, .cpp o .cxx.


C++ no nació como un lenguaje orientado a objetos puro.  Más bien se trataba de añadirle "objetos" al clásico C de K&R, ya que el nuevo paradigma de programación "con objetos", se mostraba como un paso adelante en el arte de la programación.  De hecho, aunque C++ introduce nuevas palabras clave y operadores para manejo de clases, algunas de sus extensiones tienen aplicación fuera del contexto de programación con objetos (fuera del ámbito de las clases).  Esta es también la causa de que C++, junto con las magníficas cualidades del C, arrastre algunas de sus deficiencias.  Sigue siendo permisivo (aunque menos) "intentando hacer algo razonable con lo que se haya escrito", solo que a veces, sin que nos demos cuenta, se pasa de listo.  Por supuesto, con ambos lenguajes resulta cierto el viejo aforismo informático: "Un programa no hace lo que queremos que haga, sino lo que le hemos dicho que haga".  En el caso del C++ quizás tendríamos que añadir: "Mas lo que él decide por su cuenta"... :-)

Cuando se trata de programas sencillos, que no requieren necesariamente de las características "++" de la POO, surge inmediatamente la cuestión si será mejor hacerlo en C o en C++, Cual es mas rápido?  Cual proporciona un código más compacto?  Según dicen los expertos, con los actuales compiladores el resultado está en tablas.  Las diferencias se mantienen en un margen de  ± 5% y por lo general los resultados se encuentran a la par.  Sin embargo, en cuanto se trata de escribir programas algo más complicados que mostrar el consabido "Hola mundo", las diferencias de productividad son notables, con una indiscutible ventaja a favor del C++.

Nota:  En cierta forma esta discusión, usar C++ o C, es un poco bizantina, dado que a efectos prácticos el segundo es un subconjunto del primero (de hecho, los compiladores GNU C y C++ están integrados en un solo producto).  Más bien cabría discutir si, utilizando C++, merece o no la pena usar los recursos de la POO.


Dicho esto queda una cuestión:  Aunque estudiar C++ a partir de C proporciona una perspectiva histórica, una visión del desarrollo del lenguaje, de como fueron sucediendo las cosas.  En mi opinión, hacerlo de esta forma no solo es innecesario sino quizás contraproducente para el estudiante normal.  No digo que esté de más, solo que es  un camino innecesariamente farragoso.  Me parece que se trata de una situación parecida a la de alguien que quisiera aprender Español empezando por aprender Latín.  Por supuesto no estaría de más si tiene tiempo y gana, si se es un lingüista.  Se tendrá un mayor conocimiento del lenguaje y su evolución; se comprenderá mejor el porqué de ciertas cosas.  Pero para el extranjero que simplemente necesita entenderse en Español, es evidentemente innecesario.  Digo esto, porque al ser la POO un paso superior de abstracción respecto de los primeros sistemas de "traslación de fórmulas".  Un paso en la evolución de los lenguajes de programación, con un cuerpo de doctrina ya suficientemente consolidado y coherente, las cosas pueden explicarse partiendo directamente del estudio de C++ y aprovechando todas sus posibilidades desde el principio.  Incluso diría que intentando "olvidarse" del viejo C que aún pervive en su interior.  Es perfectamente factible introducir el concepto general de clase y objeto, para decir después que las estructuras son una "clase" especial que tiene estas y las otras propiedades (todas sus propiedades son públicas), sin necesidad de introducir el concepto tradicional de "estructura" C, para luego decir que en C++ son un tipo especial de clase...  Esto tendrá la ventaja adicional de permitir al neófito empezar a pensar "en objetos" con más rapidez.

Nota:  Tenía ya una gran cantidad de material recopilado cuando me di cuenta de esta realidad, así que tuve que volver a rehacer una parte de la estructura de este "libro", volviendo a empezar directamente con el C++, e intentando hacer la menor cantidad de referencias al viejo C.  A la hora de escribir estas líneas todavía no está terminado el trabajo (no se si lo estará algún día), pero esta es la intención, de forma que si cuando caiga en manos del lector quedan referencias al viejo C, que no sean meramente históricas o comparativas, sepa que se debe simplemente a un trabajo inacabado.

  Inicio.


[1]  Ya sabéis que esta tienda on-line tiene una característica (que se va extendiendo a otras muchas): Los lectores pueden incluir comentarios y opiniones personales sobre los libros.  Tiene la ventaja de que no son comentarios interesados de la editorial.  Si sabemos leer entre líneas, esta posibilidad puede ser de mucha ayuda a la hora de evaluar el libro.  Sin embargo, la mejor fuente de información (en inglés) sobre C++, incluyendo evaluación de libros, es la Asociación de usuarios C y C++     ACCU  (The Association of C and C++ Users), sección "Book reviews".

[2]  El instituto ANSI (American National Standards Institute) estableció en 1.989 el comité denominado J16 para estandarizar el C++.  Paralelamente, la organización internacional encargada de los estándares ISO (International Standards Organization    www.iso.ch), había creado el comité WG14 que trabajaba en el mismo sentido.  Finalmente, el comité americano recomendó que se adoptara el estándar ISO como estándar americano.  La primera versión del Estándar data de principios de 1997; la última (por el momento) se ratificó en Marzo de 1998, y se publicó en Septiembre del mismo año por el ANSI y el ISO.  De forma que el "Estándar C++" es la norma ISO/IEC 14882 (IEC es acrónimo de "International Electrotechnical Commission", uno de los grupos de trabajo del ANSI).

La Norma está disponible para descarga en un documento .PDF de 2.794 KB y 732 páginas, previo pago de unos 18 $ US:  National Committee for Information Technology Standards (puede pagarse con tarjeta de crédito).  La versión impresa es mucho más cara!!.

También puede descargarse gratis uno de los últimos borradores conocidos como DWPs ("Draft Working Papers"):    ftp://ftp.research.att.com/dist/c++std/WP/CD2.  Hay que advertir no obstante, que la Norma dista mucho de ser un texto adecuado para aprender C++.

[3]  "Bell Labs"; durante mucho tiempo los mayores y mejores laboratorios de investigación industrial del mundo.  Además del origen de los lenguajes C y C++, entre otras "naderías", fueron también la cuna del transistor; del Sistema Operativo UNIX, y de las primeras células fotovoltaicas con utilidad práctica.

[4]  Mucho después de escribir esta nota, he encontrado esta confirmación: "I predicted the growth of Java complexity and don't condemn it, I consider complexity an inevitable consequence of serving a large community". Bjarne Stroustrup   "The State of the Languaje".

[5]  Como lectura complementaria también recomendaría: "La Ley de Murphy", de Arthur Bloch. Ed. Temas de Hoy S.A.  Madrid.  Una de mis lecturas favoritas y sin duda un buen libro "de cabecera" para los programadores C++.

[6]  Si no entiendes la referencia no te preocupes... ¡Sencillamente eres demasiado joven!.

[9]  Hace poco leía el comentario del directivo de una gran multinacional, quejándose que el tiempo de entrenamiento estimado para que un programador C++ fuese verdaderamente eficiente era de tres años, mientras que la NASA estimaba en 18 meses el tiempo de preparación de un astronauta.