noesbuenosersincero.blogspot.com/2010/12/krita-o-lo-que-g... por
--16411-- el 22-08-2011 07:25 UTC publicado: 22-08-2011 13:50 UTC

El mundo del software libre como otros tantos se mueve a través de mitos, tradiciones y todo tipo de leyendas. Esto hace que haya programas intocables, y el ejemplo más claro de esto es GIMP un software desfasado desde hace años y que hace a medias todo, pero que cuenta con un apoyo ferviente de parte de los talibanes de la comunidad. Hay gente que piensa que algo por el simple hecho de llevar el sello de "Software Libre" debe ser mejor que lo demás, lo cual bloquea cualquier evolución...
etiquetas: gimp, diseño, software libre, retoque, krita, mypaint negativos:
7 usuarios:
258 anónimos:
220
Uhmmm, creo que para cualquiera que no se dedique a ello de manera profesional no le compensa.
Mira, tienes razón en que todo lo que hace C++ se puede implementar en C (de hecho, en ASM también), pero cuando ves la gran diferencia es cuando trabajas en un proyecto con muchos programadores (sin llegar a cientos, que también).
A uno, programando solo, le puede parecer irrelevante declarar los miembros de una clase como public, private o protected, por poner un ejemplo sencillo, y eso solo se puede hacer en C++. Ciertamente el código generado no varía, pero cuando meten mano a un repositorio muchos programadores, un proyecto C es muy dificil de mantener (uno en ASM, aún peor). Sin embargo, esos detalles aparentemente irrelevantes como declarar correctamente los private de una clase ayudan a mantener un cierto orden dentro del caos que a la larga, ahorra muchísimos bugs. La abstracción (muchas veces con tendencia a la sobre-abstracción, como bien dices), también simplifican mucho la programación entre muchas personas, al hacer clases que son autonómas por si mismas y mucho más fáciles de mantener.
En mi experiencia, cuanta más gente mete mano en el código, más se aprecian las virtudes del C++, que no son efectivamente en pro de una mayor velocidad de ejecución si no de una mayor robusted y/o modularidad. Más sencilllo de mantener, en definitiva.
Las herencias son una herramienta muy potente de C++ que si bien pueden implementarse en C, son un poco follón de hacer. Abusando o mal implementando pueden ser horribles, pero bien usadas ahorran una barbaridad de trabajo y el código no tiene por qué perder eficicencia. Creo que la mayoría de los programadores de C abrazan definitivamente el C++ cuando aprenden a usar bien las herencias y descubren la potencia de utilizar las clases de una forma abstracta. Pensar "en C++" no es lo mismo que pensar "en C". Cuando un programador ASM empieza a programar en C, se nota, hace C al estilo ASM. Lo mismo cuando un programador de C pasa a C++, tarda un tiempo en apreciarlo y sacarle jugo (más si va con prejucios).
En cuanto a las redefiniciones caóticas de operadores como new, u otros operadores, el abuso es un vicio en C++ que debe evitarse o manejarse con precaución. En principio, el operador new estándar no tiene mucho misterio, es un malloc o bien un alojamiento en el stack de los datos de una clase y posterior llamada al constructor. Puedes ver el código en el runtime estándar o puedes desensamblarlo.
Yo que no tengo ningún prejucio a priori con ningún lenguaje (en el mismo proyecto puedo usar ASM, C, C++, PHP y Bash Script, por decirte algo), te animaría a que te acercases al C++ con la mente abierta, y descubras las grandes ventajas que tiene. Hay por ahí un libro, "Think in C++", que te recomiendo encarecidamente. Un saludo.
Otra cosa es que sea necesario para correcciones típicas de nuestras fotos.
Para empezar, C++ tiene genéricos, que no es lo mismo que un puntero void. Ya que los genéricos, el compilador se encarga de detectar posibles errores en tiempo de compilación. Y posiblemente este es uno de los puntos mas fuertes de C++ enfocada a la meta programación. codeando.blogspot.com/2006/11/metaprogramacin-por-medio-de-templates.h
Luego tenemos, las múltiples cosas que nos ofrece el paradigma orientado a objetos. Como la herencia, la ligadura dinámica, clases abstractas, etc... mírate la teoría de la orientación a objetos. Que es muchísimo mas que simples clases y objetos.
Pero vamos, por ti seguiríamos programando en ensamblador de 8086.
Por cierto, vete mirando una cosa llamada Scala. Buen lenguaje.
De ser por mí, utilizaría un lenguaje cuya sintaxis se pudiese definir dentro del propio lenguaje (sin necesidad de una máquina virtual o algo así). Y C no hace eso, pero tiene sus trucos. No sé, hasta el momento C++ no me ha enseñado nada que no pueda hacer con C con mayor control.
He mirado Scala y tiene buena pinta (lo de mezclar programación funcional con objetos es muy atractivo), lo que es una lástima es que corra bajo una máquina virtual de Java. Quizá chapucee un poco con él un día de estos.
No digo que sea la panacea, pero tampoco es que haya tanta distancia (técnica) entre los scripts de GIMP y los de Krita.
En informática se aplica "óptimo" como sujeto del acto de optimizar (intentar convertir algo, normalmente un programa, en lo "mejor" posible), aunque en efecto tal sujeto no haya sido mejorado hasta el extremo, sino sólo en cierto grado (y por tanto no sea "óptimo"). Podría compararse con que si tengo un lienzo y le aplico un tinte para dejarlo completamente negro (lo "ennegrezco"), pero dejo el proceso cuando todavía está gris, quizá diga que el lienzo está "ennegrecido", cuando en realidad está "engrisecido".
Al igual que de dos lienzos diría que el "más ennegrecido" (o incluso "más negro") es aquel que, siendo gris (no negro), es más oscuro (aunque técnicamente la cualidad de "negro" no es gradable: o se es negro, o no se es), también se dice de dos programas que el "más óptimo" es aquel que, siendo bueno (no óptimo), es mejor (aunque técnicamente la cualidad de "optimo" no es gradable: o se es óptimo, o no se es).
Como han dicho ya en un comentario anterior, a día de hoy C es un subconjunto de C++. Es decir, ciertamente puedes hacer igual los programas que haces con C++ con lo que hay en C, pero renuncias a las facilidades que te da C++.
Es como si me dices que al pueblo de al lado puedo ir en bicicleta o en coche. La diferencia de tiempo es despreciable y en cambio me ahorro el combustible, el seguro, el mantenimiento abusivamente más caro del coche... y te daría la razón. El problema vendría cuando en lugar de ir al pueblo de al lado, quiera hacer un trayecto Madrid-Barcelona. Y el problema es cuando has visto el pueblo de al lado, luego quieres ver otros pueblos. Cuanto más viajas, más te interesa el coche.
Cierto es que se pueden implementar las características de C++ con C (los primeros compiladores de C++ se escribían en C). Pero es como si me dijeses que si a tu bicicleta le pusieses 2 ruedas más, un motor, frenos de disco, un volante con dirección asistida... haría lo mismo que el coche. Aunque claro, entonces la pregunta que te haría yo ¿vas a hacer el coche desde 0 solo pq no te interesa que el coche lleve elevalunas eléctrico?
En fín, por no alargar más esta explicación, pregúntale a alguien que tenga que hacer un programa medianamente grande (y GIMP por ejemplo lo sería), si lo haría con C o C++. Solo por la gestión de las cadenas en C++, ya vale la pena...
Y bueno, lo de aplicaciones medianamente grandes es un ejemplo nefasto. Gimp está en C. Linux está en C (cuando podría estar en objective-C como NeXT o C++ como el kernel de Liedtke). Gnome está mayoritariamente en C (cuando existen bindings a muchísimos lenguajes orientados a objetos). Aplicaciones de Windows en C ya se me escapan un poco porque no suelo usarlo, pero seguro que hay algunas cuantas.
Todo es cuestión de la calidad de las abstracciones que uses.
#114, me prometí aprender LISP este verano, pero al final entre pitos y flautas no hice nada. Llevo con la promesa de LISP varios años ya, pff.
Linux está C porque cuando se empezó a programar, se hizo en C (observese que Linux viene de Minix). Gnome está en C porque cuando se empezó a desarrollar C++ no estaba suficiente establecido aún...
Si, la mayor parte de proyectos grandes que me puedas mencionar están hechos en C, pero no precisamente porque C sea más rápido, si no porque (al menos entonces) la base de programadores de C es más grande que la de C++. También influye el que inicia el proyecto qué lenguaje domina (pregúntales a los que mantienen el aMSN si dejarían de usar tcl/tk a pesar de que hay lenguajes que le ganan por goleada en más de un sentido).
Además, la discusión es un poco absurda. En el peor de los casos con C++ puedo hacer exactamente lo mismo que con C. Con C también puedo llegar a hacer lo mismo que C++... pero tengo que programarlo. Y hacer una librería para que C tenga de manera "artificial" lo que me proporciona C++ y que además lo supere en rendimiento... no es moco de pavo.
Insisto en lo mismo, que un código en C++ que haga lo mismo que otro en C obtenga un rendimiento inferior, habla más de la capacidad del programador que del lenguaje. Porque insisto en lo mismo, el mismo código en C (con ligerísimas modificaciones) me compila en C++. Así que utilizando las ventajas que cada lenguaje me proporciona, y configurando el compilador de forma adecuada, difícilmente notaré diferencias de rendimiento entre un lenguaje y otro. A no ser, claro está, que se abuse de la abstracción, como también han comentado anteriormente.
Linux está en C porque se decidió hacer en C. Linux no está basado en Minix. Está inspirado en Minix, pero está muy lejos de estar basado en él. No comparten código.
Gnome se empezó a desarrollar a finales de los noventa. Y en cualquier caso, esto no es lo importante del debate.
A ver, la comparativa no tiene sentido en lo que ambos lenguajes comparten porque en ambos es lo mismo. La comparativa debe hacerse con lo que un lenguaje proporciona y el otro no. Por eso mencioné el operador new (lo que yo dije, ejemplo de redundancia), los vectores o las cadenas. ¿Puede hacerse una biblioteca de tratamiento de cadenas en C más o menos eficiente que la de C++? ¿"Crear instancia" necesita un operador propio? Etc, etc.
Por cierto, este flame está siendo un canteo ya. ¿No podemos seguir por el IRC o algo así?
De todas formas, no voy a seguir más con el debate, porque está claro que hablaríamos mil años sobre el mismo tema y no llegaríamos a un acuerdo y tengo el arroz en el fuego...
Si bien es cierto que la implementación de templates de C++ no es una solución muy limpia por el diseño del lenguaje (medio nivel, fuertemente tipado, no basado en objetos, etc, etc..), las posibilidades y la calidad del resultado dista mucho de lo que puedas hacer con macros.
Es bastante habitual que uno se crea que está escribiendo código más rápido simplemente por usar un lenguaje de más bajo nivel, pero en la realidad casi siempre es lo contrario. Por ejemplo, la mayoría de la gente se preocupa por estupideces como el coste de la llamada a una función (que en C++ requiere niveles de indirección adicionales frente a C) y deja de lado aspectos realmente importantes como el coste de la creación, destrucción y acceso a memoria.
Con estas premisas viene uno de estos, lo programa en C, se crea sus propias estructuras de datos y obtiene una implementación más lenta que otro con un nivel de conocimiento similar que lo hizo en C++ con STL directamente. Además, (el primero) con mayor probabilidad de contener bugs, leaks y que el código sea complicado o directamente imposible de mantener.
Ahora viene un tercero, lo implementa en Java en la menos de la mitad de tiempo y se ríe de los otros dos porque la diferencia de rendimiento resulta inapreciable.
krita.org/component/content/article/10-news/90-draw-comics-in-krita-dv
En la polémica, paso de entrar. Que cada uno use el que quiera.
Dejadme que explique mi sesudo argumento: A raíz del este artículo de meneame me instale krita (Ubuntu 11.04) y hoy decido probarlo con una foto. Una prueba sencilla.
Abrir JPG -> Scale Image -> Grabar cambios
Al darle al botón de grabar ha petado todo. Si, muy bonita la ventana con su backtrace y demás, pero lo que es la aplicación, ha cascado que da gusto. Redimensionando una imagen... Pero lo mejor viene ahora, hago doble clic en el JPG anterior y... ¡fichero corrupto!. Resultado: imagen perdida, de la cual no tenía ninguna copia.
Me vuelvo a mi GIMP y el krita se lo pueden meter sus autores por donde les quepa.