The design and evolution of C++ (2008-03)
Tuesday, July 29th, 2008Querido Ndugu,
La gente que me conoce sabe que me gusta el lenguaje C++. Es un lenguaje en el que nunca dejas de aprender cosas nuevas, de encontrar rincones oscuros en los que nunca habías estado, o un nuevo uso de una de sus características que no habías pensado.
Para la gente que ya tiene ciertos conocimientos del lenguaje, existen una colección de libros absolutamente recomendables que ya devoré en su día, como Effective C++ (y More Effective C++), C++ Coding Standards, Exceptional C++ (y More Exceptional C++), y hasta Modern C++ Design. Tengo que reconocer que en algunos momentos el grado de detalle es abrumador, y puede hacer rendirse al más pintado, pero en general se disfrutan bastante.
Sin embargo, desde que terminé ese puñado de libros, tenías ganas de que cayera en mis manos el que ahora comento,
The Design and Evolution of C++ de Bjarne Stroustrup, nada más y nada menos que el creador de C++.
El libro está escrito antes de que saliera el estándar de C++, y cuenta, como su propio título indica, el diseño y evolución de C++. En él descubres los orígenes del lenguaje, el germen de la idea, sus primeros pasitos renqueantes y como poco a poco se fue convirtiendo en lo que ahora es.
A pesar de que no es un libro de rabiosa actualidad (es de 1994), me ha parecido una delicia. Teniendo en cuenta que siguen haciendo reimpresiones (yo tengo la edición número 16 del año 2007), creo que el autor podría haber pensado en incluir algún capítulo o apéndice de actualización contando todas las cosas que han ocurrido desde entonces.
El libro empieza con tres capítulo sobre la “prehistoria” de C++, el “C con clases” y el nacimiento de C++. Resulta interesante el capítulo siguiente, en el que describe las reglas de diseño que siguió (y aún se siguen) en el proceso de creación (o ampliación) del lenguaje. Por ejemplo, la filosofía de que es más importante añadir una característica deseable que intentar evitar todos sus usos malintencionados (lo que se traduce en lo que un amigo teclario define como “C++ confía en ti”), la importancia de no permitir violaciones implícitas del sistema de tipos estáticos o el “ante dos alternativas, elige la que sea más fácil de enseñar/aprender”. Pero de todas, las que más me llaman la atención son las relacionadas con el soporte de bajo nivel del lenguaje: su obsesión por poder no necesitar enlazadores (linkers) distintos de los disponibles en su momento, no añadir incompatibilidades gratuitas con C, su intento por sustituir a éste como lenguaje de bajo nivel, y la regla de la “sobrecarga cero”: las características del lenguaje no utilizadas en un programa (funciones virtuales, herencia múltiple, RTTI, excepciones…) no suponen tiempo de ejecución extra.
La primera parte del libro termina con la cronología del lenguaje, el proceso de estandarización y la explosión de usuarios, el diseño de librerías.
En la segunda parte introduce los detalles del diseño de cada una de las características más importantes de C++, describiendo por qué decidieron añadirla (en base a las reglas de diseño explicadas anteriormente en el libro), las distintas alternativas que tuvieron y en qué se basaron para elegir la definitiva. Esta es la parte más jugosa del libro, en la que se llegan a aprender cosas nuevas sobre el lenguaje. Describe la gestión de memoria, la sobrecarga y sus implicaciones en los enlazadores, la herencia múltiple y cómo se almacenan los objetos en memoria para conseguirlo, plantillas, espacios de nombres, manejo de excepciones…
En definitiva, el libro es imprescindible para todos aquellos que tengan a C++ como uno de sus lenguajes favoritos, o al menos, aquellos que no nos cansamos de descubrir en él cosas nuevas. También resulta interesante para aquellos aficionados a los lenguajes de programación en general, que gustan de comparar las capacidades de unos y otros y las distintas maneras de resolver los mismos problemas. Yo he aprendido un puñado de nuevas “perlas” curiosas. Algunas de ellas las dejaré caer por aquí en un futuro.
Nota: imprescindible (para los forofos de los lenguajes de programación en general)

