viernes, 31 de enero de 2014

Sobre la evolución de C++

Aproveché una parte de las vacaciones para tratar de ponerme al día con el "nuevo" estándar de C++: C++11. Digo "nuevo" porque aunque el estándar (el documento que describe el lenguaje) tiene ya 3 años, recién el año pasado los principales desarrolladores de compiladores publicaron versiones con soporte suficientemente estable y completo para las nuevas características y bibliotecas (gcc 4.8, clang 3.3, visual studio 2013, etc). No vengo a explicar las nuevas características, sino que les voy a contar a modo de recomendación de dónde me informé, y que otras cosas muy interesantes me encontré en el camino; para al final tratar de pensar cómo y cuando nos va a afectar esto.

El que me conozca o siga el blog sabe que el 90% (o más) de lo que programo, lo hago con C++. Se convirtió en mi lenguaje favorito por cuestiones más bien pragmáticas, y por oposición a alternativas (discutiblemente) más simples, modernas, o prolijas, pero en general menos eficientes. Estos motivos no hicieron más que afirmarse y crecer durante estas semanas, gracias a algunas lecturas adicionales que encontré en el camino.

Previamente, hace mucho, había pegado una mirada rápida a la entrada de Wikipedia en inglés, donde hay un excelente resumen de qué cosas nuevas vamos a encontrar en C++11 respecto a C++99/03, enfatizando además qué es nuevo en el núcleo del lenguaje (esto es para mi lo más interesante) y qué es lo nuevo en las bibliotecas (esto es para muchos lo más útil). Esta vez no recuerdo cómo llegué, pero empecé por ver un video del mismísimo Stroustrup, una keynote para las charlas GoingNative de 2012. A partir de la charla terminé cayendo en la pagina personal de don Stroustrup, donde hay un FAQ bastante completo y bien práctico sobre los nuevos cambios. Están las respuestas que pueden ser directas, con ejemplos cortos y útiles. Faltan algunos temas "gordos" que no entran en un FAQ (como la biblioteca de threads o las expresiones regulares), pero para quien quiere ir directo al grano, ese FAQ es la mejor fuente que encontré.

El grandísimo Straustrup durante su charla.

Desde el mismo FAQ se puede acceder al video que nombraba en primera instancia, y en realidad a todas las charlas de GoingNative de 2012 y 2013. Parece ser una conferencia sobre C++, patrocinada u organizada por Microsoft, pero con expositores de mucho peso, como el creador de C++, desarrolladores de compiladores de MS (hasta uno de clang), gente de empresas como Google o Facebook, casi todos integrantes regulares de los comités que definen los estándares de C++. Por esto es información muy muy buena, de primera mano. Alguna muy útil en general (como las dos keynotes de 2012), otras muy interesantes (y complejas) desde lo técnico. Los videos se pueden descargar gratuitamente en varias calidades, y no son tantos. Están en inglés, pero el audio es limpio y en general hablan bastante claro.

Hasta ahí mi recomendación de buenas fuentes acerca del nuevo estándar: resúmen en Wikipedia, ejemplos en el FAQ de Stroustrup, detalles en GoingNative. Pero lo más interesante es el resto del sitio de Stroustrop. Allí hay varias publicaciones y enlaces de interés, y entre ellos dos papers me llamaron la atención, que él menciona como HOPL (por History Of Programming Languajes, una conferencia rara de ACM). El primero es de los 90s y cuenta la historia de cómo se inició C++, cual era su experiencia, cuales eran sus objetivos al diseñarlo, porqué tomó C como base, etc. La historia es por demás interesante, y nos permite darnos cuenta mejor de porqué C++ es como es, de para qué están pensadas ciertas características del lenguaje, etc. El segundo es de 2006 (creo) y cuenta cómo terminó el proceso de estandarización del 98, la revisión del 03, y los cambios que tenían pensados para el próximo estándar (el 11, en ese momento nombrado 0x, casi todos finalmente aceptados). Recomiendo mucho empezar por estos dos trabajos, que aunque sean papers, son de lectura muy amena por la forma en que están escritos, y dan una perspectiva nueva sobre el lenguaje, a la luz de la cual se pueden entender mucho mejor lo cambios más recientes.

Como conclusión de tanto leer, me quedo con una frase de Stroustrup: "C++11 se siente como un lenguaje nuevo". Esto quiere decir que el cambio no es solo agregar cosas. Si bien todo lo que sabíamos todavía aplica porque es en un 99% compatible hacia atrás, los nuevos elementos del lenguaje hacen que todo se pueda ahora hacer de otra forma. Y esa otra forma será más eficiente, más corta, más legible, o todo junto. Entonces, como dicen en las charlas, automáticamente todos los libros de C++ quedan obsoletos. En cada pequeño ejemplo hay algo que se puede hacer mejor gracias a uno de estos cambios. A la luz de la historia y los objetivos de C++, los cambios son enormes, nos acercan muchísimo más a esos objetivos, y casi que abren paso a un nuevo estilo de codificación, sobre el mismo lenguaje, pero más seguro y más prolijo, y a veces también todavía más eficiente.

Pero como decía antes, los compiladores recién acaban de aparecer, los libros se están actualizando, los programadores más importantes están terminando de aprender cómo interaccionan en proyectos reales estas nuevas funcionalidades propuestas por separado, y los docentes estamos empezando a pensar en planear el cambio por lo que los alumnos siguen formándose en el estándar viejo (el tiempo en clases es bastante acotado). Aunque lleve 3 años aprobado, van a pasar al menos un par más hasta que lo veamos aprovechado. La mayoría de los entornos de desarrollo instalados actualmente aún no lo cumplen (la última LTS de Ubuntu con actualizaciones al día, por ejemplo, incluye gcc 4.6 y clang 3.0; o ZinjaI en Windows con mingw-gcc 4.7, que actualizaré en breve a 4.8, la versión que realmente necesitamos para esto). Por otro lado, los ejemplos, las bibliotecas, etc., todavía están empezando a incorporar los cambios en el mejor de los casos, el 99% del código C++ que vemos a diario es C++98/03. Así que habrá que esperar.

Captura de una de las charlas del 2012, la de Clang y su poder de diagnóstico, donde compara la 
cantidad de profesionales y estudiantes typeando código en C++ con los infinitos monos y sus máquinas de escribir.

No puedo por estas razones utilizarlo para desarrollar ZinjaI, porque dejarían de poder compilarlo en muchas distribuciones. No puedo iniciar una cruzada para que lo enseñemos ya en clases porque no estará disponible fácilmente para los alumnos, y adaptar los planes será delicado. Por ahora, tal vez pueda utilizar MotoGT como conejillo de indias, cuando lo retome, veremos. Pero aunque no utilice todavía lo nuevo, las lecturas me han abierto mucho la cabeza como para que mi estilo de programación con C++ mejore de todas formas. Lo importante es que cuando finalmente lo hayamos incorporado, si lo hacemos bien, nuestra forma de programar y de ver el lenguaje habrá cambiado (y no hablo de sintaxis solamente), y de seguro para mejor.

No hay comentarios:

Publicar un comentario