2016-05-20

Volviendo a C++

En mi laburo necesitan que programe en C++ nuevamente, así que hace unos días estoy mirando y recordando C++. ¡Qué incómodo que es!

Default constructors, copy constructors, asignment operators, que encima en su versión generada por default andan mal. Métodos virtuales, ¿por qué hay otra opción, y encima no es el default? ¿Herencia virtual? ¿Functors o function pointers? ¿Punteros comunes, shared pointers, referencias? ¿Cómo obtengo el shared_pointer de this? ¿Y si hay herencia? ¿Templates? Encima los templates son simultáneamente complicadísimos y sumamente limitados. Por ejemplo, ¿cómo hacés un template que cambie el nombre de los métodos generados en función de algún parámetro? Creo que no se puede (si sabés cómo hacerlo sin usar #define decime). Escribir todo varias veces, forward declarations, declaraciones en el .h e implementaciones, con la signatura repetida, en el .cpp.

Y ni hablar de los quilombos asociados, sobre todo en Windows, que no son del lenguaje, pero que te complican la vida. Cambiás de compilador y linkea mal y, en el caso de Visual Studio también genera binarios incompatibles según el runtime que elegís. De regalo el Visual Studio que estoy usando no se da cuenta cuándo recompilar y genera mierda desactualizada.

Pero eso no es lo peor de C++. Para mi lo peor de C++ es que no te deja pensar. Tenés que esquivar tanta complejidad accidental que el código fuente no reflejo de las ideas subyacentes. Eso nos devalúa como programadores.

6 comentarios:

Leo dijo...

No creo que sea incómodo, menos que funcione mal... solo creo que no estas capacitado para usarlo. Y también me parece una falta de respeto a los expertos en múltiples lenguajes que trabajaron durante años para mejorarlo, que alguien que no lo entiende diga que esta mal.
-Que es un "nombre de los métodos generados en función de algún parámetro"?, y porque estás tratando de hacer un template que lo cambie? Me parece que no entendiste el concepto de template.
-Visual studio no genera binarios incompatibles, te da la opción de incluir el runtime estático o usarlo dinámico. Otra vez parece ser tu ignorancia la que te trae problemas.
-Que C++ no te deje pensar... no se que decir sin que parezca falta de respeto.
-Tampoco entiendo la complejidad accidental, estás seguro que no es falta de diseño/conocimiento?

Tal vez deberías dedicarte a otra cosa.
Saludos

aurelianito dijo...

Es posible que no esté capacitado para usarlo, después de todo solo tengo 20 años de experiencia en el rubro.

Con respecto a los templates con los nombres de métodos, tengo un montón de métodos que tienen la misma estructura pero varían en los tipos de datos y el nombre del método. Y sí, sé que no se puede hacer con templates de C++. Pero si agarrás cualquier lenguaje de scripting que se precie, hacer algo equivalente es re-fácil.

Y sí, si tenés un artifact generado con un runtime no podés usarlo con otro artifact generado con otro runtime. Id est, son incompatibles.

Con respecto a los "expertos en múltiples lenguajes", si querés empiezo a citar a Alan Kay en sus dichos sobre C++.

Leo dijo...

Sigo pensando que los nombres y tipos de datos de los métodos son un problema de diseño, e incluso así hay siempre hay formas de resolverlos, hay preprocesadores de código externos, macros, punteros a función, STL, Boost, etc.
Y tiene sentido que no puedas mezclar runtimes distintos, aunque si se puede a través de dlls.
C++ no es un lenguaje de scripting, con ese criterio podría decir que en C++ no puedo meter slides de PowerPoint.

Enlight dijo...

Primero: "El rubro" es muy grande, si yo tengo 20 años de experiencia haciendo "A" no voy a adquirer experiencia en "B". Asi que falso: eso no te acredita a opinar de lo que no entendés.

Segundo: Templates podes compilar condicionalmente segun los simbolos q esten definidos, con macros y condicionales es muy facil y practico crear metodos con nombres dinamicos segun necesites para cada instancia. Ej: https://msdn.microsoft.com/en-us/library/x7wy9xh3.aspx.

Tercero: falso. Si quisieras trabajar con otro runtime podés, simplemente tenes que hacer un modulo dinamico que encapsule el acceso a la libreria que usa otro runtime y simplemente no pedir memoria en un runtime y usarla en otro. Esto tambien es sencillo.

Cuarto: es facil adherir a los dichos de otro cuando respaldan tu opinión, es mucho mas difil defender la tuya propia, cuando no tenes los medios para hacerlo.

aurelianito dijo...

PD: Conozco varios Leo. ¿Nos conocemos? ¿Quién sos?

aurelianito dijo...

Enlight, no conocía el __if_exists_. Está bueno :D. Pero no veo cómo usarlo para hacer un class template que le pase un parámetro del que derive un nombre de método, ¿como sería?. Con respecto al punto 3, creo que confirma lo que estoy diciendo en mi post. Con respecto al punto 4, fue porque Leo habló de "los expertos en múltiples lenguajes que trabajaron durante años para mejorarlo". Si vamos a citar expertos, hay gente con bastante prestigio que soporta mi posición. De todas maneras, fijate que no los cité en mi post original, ya que preferí elaborarlos yo mismo.