¿Por qué uso C++? (I)

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.

13 comentarios en “¿Por qué uso C++? (I)”

  1. Excelente articulo. yo opino que C++ es unico e irremplazable actualmente para el 5-10% de las cosas que se deben hacer en desarrollo, di tu: antivirus, sistemas operativos, desarrollo para hw, algunos videojuegos, aplicaciones multimedia (photoshop, 3d max etc) pero usarlo en el otro 90-95% es mayormente desgastante porque puedes obtener resultados similares con mucho menos de la mitad del esfuerzo en desarrollo y mantenimiento utilizando lenguajes como C# o java.

  2. Gran post. Totalmente de acuerdo con lo de “un programador que no pueda aprender C++ tampoco será un buen programador”. Desde la facultad no he vuelto a utilizar este lenguaje (por desgracia), pero si creo que es el lenguaje que todo programador debería aprender. La verdad es que me costó mi trabajo (por eso quizás sea un programdor normalito :)) La verdad que ahora, de C++ me acuerdo de bien poco.

    Saludos,

  3. Estupendo Rafael. Es curiosa la curiosidad que tenemos los programadores (imagino extensible a otros ámbitos y profesiones) por conocer “la caja de herramientas” y el porqué de esa elección de otros programadores. En mi caso, C++ también es la herramienta principal, la potencia y sobre todo el multiparadigma que ofrece el lenguaje es lo que me decidió a quedarme con él. Espero la segunda entrega!

  4. Desde luego no soy un experto en c++, solo he hecho algunos pinitos y reconozco que tiene una potencia increíble, si bien para un uso generalista siempre elegiría c# o java, creo que son más adecuados para la mayoría de los entornos en los que nos movemos actualmente (web, sistemas de gestión, etc), desde luego existen programas que solo pueden diseñarse con c++ y assembler, como Autocad, pero creo que c++ ofrece también una serie de problemas a muchos programadores noveles en los que si el programador no es un autentico experto convertirá rápidamente las aplicaciones un autentico caos como el manejo de punteros y memoria e infinidad de cosas más que en c++ pueden ser un auténtico infierno.

    Creo que hoy en día la abstracción es un punto importante que proporcionan lenguajes como java y .net que seguro que por debajo tienen muchas líneas escritas en c++ y proporcionan herramientas más adecuadas para el desarrollo de aplicaciones en la mayoría de entornos actuales.

    Seguro que alguno al leer tu artículo pensara, el mejor es el ensamblador que te permite sacar el máximo partido a tu procesador, creo que c++ existe desde hace tantos años porque hay una base muy grande aplicaciones que lo utilizan y aplicaciones que sin este lenguaje difícilmente hubieran visto la luz, pero el tema es más complicado, en base a tus convicciones te pregunto, ¿Cuánto tiempo hace falta para convertirte en un experto en c++?, 5 años, 10, toda la vida… ¿ Si comenzases ahora a estudiar informática, invertirías tanto tiempo en c++?, ¿ Cuanto tiempo tardarías en diseñar un sistema de gestión en c++ en comparación con pongamos clipper ? Creo que cada lenguaje tiene un entorno y unas aplicaciones determinadas y pienso que también se debe valorar la complejidad que tiene c++ para elegirlo como lenguaje principal, sobre todo hoy en día a la velocidad que va esto, aunque quizás piense así porque no he logrado ser un experto en c++, tampoco me ha hecho falta en mi entorno de trabajo, otras aplicaciones como clipper, .net, etc, me han permitido desarrollar mis programas creo que de una forma mas sencilla.

    Un saludo.

  5. “Seguro que alguno al leer tu artículo pensara, el mejor es el ensamblador que te permite sacar el máximo partido a tu procesado”.

    Eso hace tiempo qeu dejo de ser cierto. Ha dia de hoy los procesadores son tan complejos, y las optimizaciones que hacen los compiladores tan complicadas, que tu código asm hecho a mano será más lento que el compilado al no usar todas las caracteristicas del procesador y sus diferentes caches.

  6. “Ya sé que [C++] es difícil de aprender, y más todavía de usar, pero pilotar aviones también lo es y nadie se queja.”

    La mejor frase que he leído en mucho tiempo. ¡Ovación de pie!

  7. Estupendo todo lo leido. Desde luego cada lenguaje de programación tiene su ambito para trabajar. Una propuesta ideal es como no me considero bueno en todos ni en uno, sería que alguien publicará una guía, me explico. Que alguien diga para que usar idoneamente un lenguaje de otro, pues de esta manera los desarrolladores trabajaríamos en el sentido adecuado. Eso si sin excluir que todos los lenguajes son posibles y necesarios para desarrollar una única aplicación en modo cooperativo. Bueno esto es una propuesta haber quien y en que web la públican como biblia para tomar un camino antes de ponerse a desarrollar cualquier tipo de aplicación.

  8. Andrés, es que no hay un solo camino a la programación (para parafrasear a un insigne). Y a veces sólo hay uno.

    Muchas veces es más factible hacer una cosa en un lenguaje porque el programador disponible no sabe de otro lenguaje más adecuado (mi caso, a veces hago pequeños programs que encadenados realizan una acción que se podría haber hecho en memor tiempo en perl o en vbscript, pero como no sé lenguajes de script, y tampoco quiero aprenderlos…).

    Y otras veces sólo tienes uno. Yo muchas veces me las tengo que ver con versiones del año la pera de C porque ese micro/placa no tiene otra cosa… O intentar hacer un driver para Windows en VB… simplemente no es posible.

    En principio, aunque hay partes objetivas de la adecuación de un lenguaje al problema, también existe otra parte subjetiva.

    Pero bueno, abierta queda la petición.

  9. Permiteme que te responda Rafael. Estoy deacuerdo esta claro. Pero os cuento Yo soy Español y la verdad no creo en las fronteras de hecho desearía que todo los seres humanos nos unieramos en un solo país. Bueno para la filosofia, verdad!!

    Pero desde hace un tiempo los Españoles y ahora los europeos estamos volviendonos lelos. Y lo digo por que deseo crear un Google pero Español y Europeo pero los desarrolladores ni nos unimos en nuestro país ni nos ayudamos ni nada de nada.

    Nadie apoya en como desarrollar y con que herramienta en España y menos para guíar. Desearía poner a muchos parados de mi provincia a desarrollar algo unico o competitivo y crear un silicom valley en mi ciudad y no producir aceite o que se yo.

    Pagamos la tecnología y al final pagaremos por todo y quien se lo esta quedando los Norte Americanos.

    Lo unico que te decia erá que podríamos crear una guía de lenguajes e ides para que otros como nosotros que estamos en tu artículo creamos algo grande.

    Un saludo por mi rollo filosofico aunque lo pienso seriamente.

  10. Otra cosa. Repensando mi propuesta lo ideal no es una guía de que lenguaje de programación es más apropiado sino una guía de los limites que poseen todos los lenguajes y en arreglo a cada deficid de cada uno los programadores decidiriamos cual elegir para desarrollar tal o cual programa y los mismo para elegir un IDE apropiado o no.

    Listo ya no molesto más un saludo a tod@s.

  11. Jeje me encanto, apesar de que yo solo soy un joven que aùn ni entrà en la universidad.

    Eh aprendido Pascal, VB, C# y C++ de echo, me fui por programador para la creaciòn de bots para un juego que jugaba 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *