Hace poco me preguntaron que contara mis experiencias en mi trabajo con C y C++. Y eso lo hacen no solo aquí, sino que muchas veces me lo preguntan en la Vida Real™, y la verdad es que lo tengo bastante difícil, porque considero que no tengo experiencias con él, y cuando las tengo no puedo (ni debo) hablar de ellas, así que voy a intentar acercarme lo más posible a lo deseado, sabiendo que no voy a poder explicarme bien y que posiblemente levante alguna que otra polémica.
Para mi C++ es el lenguaje. Así muy, pero que muy por encima, conozco Visual Basic (el clásico y el moderno), supongo que podría leer y medio interpretar un programa escrito con ellos, lo mismo que con Pascal por mi herencia de C++ Builder. Algo sé de Java, sobre todo de cuando salió, y en mis tiempos mozos programé con dBase y luego con Clipper. En su momento sabía Cobol (que olvidé al momento de hacer el examen) y era bastante productivo con los ficheros .BAT, haciendo verdaderas virguerías. También sabía varios ensambladores, entre ellos el del Z80, x86 y 80×31.
Los lenguajes que conozco bien son C, C++ y C#. Y sus idiomas, es decir, Visual C++, C++ Builder, Windows CE (que incluye a Windows Mobile), MFC, Win32 y .NET. También he hecho mis pinitos con C y Linux, algo de las APIs de GTK y de KDE. Ahora estoy indeciso si seguir con QT o profundizar más en MFC… QT me tienta mucho, pero mucho de verdad, sin embargo lo veo como demasiado inseguro, sobre todo desde que lo ha cogido Nokia y está sacando versión tras versión cada cuatro meses, a piñón fijo, esté como esté el producto, y así está acumulando bugs y problemas. Otra cosa que no me mola de QT es que con la versión LGPL no puedo enlazar estáticamente, sino que tengo que distribuir las DLLs adecuadas como runtimes, y para runtimes ya tenemos bastante con los de Visual C++ y su puñetero DLL Hell, y tampoco es cuestión de distribuir 300 megas de runtimes cada cuatro meses. Sin embargo, una de las cosas por las que QT brilla con luz propia es que soporta una enorme cantidad de plataformas como Windows CE, Symbian, MAC, Linux, Windows…
También tengo bastante experiencia en programar hardware sin sistema operativo, mayormente en C porque muchas veces no hay compilador de C++. De todo lo que hago es lo que menos me gusta más que nada porque tengo que usar C y veo las enormísimas limitaciones que tiene frente a su hermano mayor. Cosas que se podrían solucionar de un plumazo (es un decir) con una jerarquía de clases y polimorfismo las tengo que hacer con arrays de punteros a funciones, sentencias switch y otras zarandajas (que, entre nosotros y sin que nadie más se entere, es lo que termina haciendo el compilador de C++ pero de forma transparente para el programador). Tampoco me gusta mucho tener que pelearme con la configuración de los registros del micro ni el estudio de los datasheet que eso conlleva, etc. Además, la mayoría de compiladores de C no son estándar y ni siquiera lo cumplen. No es que traigan extensiones, que son de desear para algunas cosas como definir interrupciones o colocar variables en ROM, RAM, FLASH o registros, sino que, dependiendo del fabricante y el micro de destino, muchas cosas funcionan de forma diferente a lo esperado.
Y bajo toda esta experiencia propia no creo que haya nada como C++. Su expresividad, su potencia y su rapidez son inigualables ante cualquier otro lenguaje. Ya sé que es difícil de aprender, y más todavía de usar, pero pilotar aviones también lo es y nadie se queja. Y, personalmente, todos esos problemas que tiene la gente con C++ yo no suelo tenerlos. Evidentemente cometo bugs como todo mortal, y a veces me atasco en tonterías, pero casi nunca tengo los típicos problemas de fugas de memoria y no liberación de recursos.
Será porque siempre que pongo un new, pongo un delete, siempre que hago o modifico el constructor hago el destructor, siempre que llamo a una función que abre un recurso también llamo a la que lo cierra, e intento evitar salir de un método si no es al final (incluso con gotos, sobre todo en embedded), y si lo hago miro hacia arriba para ver qué tengo que cerrar/liberar. Y por supuesto uso, allá donde estén, las herramientas de análisis de código y de detección de problemas, en las que Visual C++ es inigualable y a veces te dan una grata sorpresa, ya sea por la genialidad a la hora de detectarte un sibilino potencial problema o por la de mostrarte algo verdaderamente estúpido y sin sentido.
C++ es para mi la herramienta, el súmmum de todos los lenguajes compilados de programación, y hasta la fecha no hay ningún otro que lo supere. De hecho, siempre lo he dicho y lo repito cada vez que tengo oportunidad: si te has propuesto aprender C++ y no has podido es porque eres mal programador. No hay otra. Lo que sí entiendo es que C++ no sea adecuado para todo, ni de lejos. Entiendo que si vas a hacer una aplicación de bases de datos típica, C++ queda un poco… digamos… pequeño. No pequeño en cuanto a características, sino pequeño en su fijación por el detalle, porque seamos serios: C++, con una buena biblioteca de acceso a bases de datos, podría ser insuperable. Y si no que se lo pregunten a Clipper. [Para el que no lo sepa, Clipper era un front-end con sintaxis similar a dBase generalmente simulada con macros que pasaba a C y que luego se generaba un p-code que era interpretado por un runtime. De hecho podías compilar bloques de código y guardarlos en una tabla como p-code, que luego era interpretado y ejecutado por el motor principal –más o menos lo que son ahora los operadores delta]. Y si con C se podía hacer eso, ya no os digo con C++ y una biblioteca similar.
Alguno podría pensar que la incapacidad de aprender a programar C++ podría venir de la dificultad y abstrusismo del propio lenguaje, pero os puedo asegurar que no es así. Podría compararlo con el álgebra y el cálculo. Un lenguaje como C# o Java es álgebra, mientras que C++ es análisis. Hay muchas cosas que se pueden hacer con la primera, pero hay otras que o bien son muy difíciles o bien completamente imposibles. Imagina que necesitas obtener los parámetros de una curva. Puedes representarla gráficamente usando el álgebra, y ver sus máximos y sus mínimos, y calcular una tangente por aproximación, pero si realmente quieres ver todos sus detalles, obtén su derivada primera y segunda, y obtendrás la tangente en todos los puntos y sus máximos y mínimos…
Y de igual forma que hay gente que se para en el álgebra y es incapaz de seguir con el análisis, también hay programadores que son incapaces de avanzar hacia C++, y de igual forma que un matemático que no sepa análisis no será muy buen matemático, un programador que no pueda aprender C++ tampoco será un buen programador. Ojo, he dicho que no pueda aprender, no he dicho que tenga que usar C++ para todo.
Tampoco me gustaría que se me interpretara como que si no sabes C++ no eres programador. Nada más lejos de mi intención. Existen y existirán muchísimos programadores que son buenos y no saben C++ porque no les haya hecho falta ya que ante todo, está el concepto de un lenguaje para cada tarea, que ya he avanzado un poco más arriba. Yo mismo, de hecho, hago muchas pequeñas utilidades para consumo propio en C# porque resulta mucho más rápido aunque luego el desempeño no sea el ideal, utilidades que me sirven para procesar o convertir datos y que están asociadas a proyectos más grandes. Y también tengo aplicaciones completas hechas en C#, tanto públicas (como el zxFortunes) como de uso interno o comercial (que se acompañan con el hardware que vendemos).
Esta entrada continuará la semana que viene.