domingo, 6 de julio de 2008

La Tortuga y la Liebre


Este escrito va de lenguajes de programación, por lo que es algo geek. Solo doy algunas opiniones y reflexiones, y ni por asomo pretendo llegar al nivel de una discusión entre Rafael y Eduardo al respecto, pero el caso es que si no eres un computista, quizás prefieras no leerlo.

ok, ya hablé. Considérate avisado.

No me considero un especialista en Java, a pesar de que me gano la vida con él. Conozco las bases, las no-bases, y uno que otro truco o misterio que solo los iniciados son dignos de conocer, pero de ahí a considerarme poseedor de los secretos, guardián de las llaves, y señor del baile, hay un trecho.

Y, sinceramente, opino que desconozco muchas, muchas, muchas cosas de ese lenguaje que me da el pan mío de cada día.

Aún a pesar de ello, me hierve la sangre cada vez que alguien sale con la conocida cancioncita de "C es más rápido que Java", con ese tonillo de saberse poseedor de la verdad universal, y de que si todos aceptaran la velocidad de C, el mundo sería un lugar mejor.

(Entre eso y "Unix es mejor que Windows", en verdad que ya no vale la pena tener una discusión en ambientes computistas...)

Y no es que no acepte que C no sea más rápido que Java. C es un lenguaje de programación que habla el mismo idioma que la máquina en la que corre; lo habla tan bien, que la puede convencer hasta de volarse la tapa de los sesos, si al programador le da por ahí. Java en cambio monta una capa intermedia, ganando así la habilidad de poliglotismo, independencia y salvaguarda del patrimonio nacional, pero lógicamente metiendo más intermediarios en la traducción de idiomas usados, lo que a simple vista ya dice que debería correr algo más lento.

Por ello, puedo aceptar que lo que en C corre en un minuto, a Java le requiera un minuto y un segundo para ejecutarse. Pero de ahí a pensar que necesitará dos minutos o dos horas, hay un trecho. Y esa es precisamente la opinión de los miembros de la iglesia de C.

Lo que más risa me da del asunto es que ninguna de las personas con las que he hablado -ni yo, lo acepto- se han tomado la molestia de escribir el mismo programa en ambos lenguajes para, al menos, tratar de hablar con conocimiento de causa.

(Lo cual, acoto, seguramente sería bastante inútil, porque siempre quedaría la duda del "lo habré hecho bien" o "lo habré configurado para que vaya rápido?". Sigue leyendo para que veas).

Es difícil, sí, juzgar la "velocidad" de un lenguaje de programación con un simple programita. Dependería de la habilidad del programador en ambos lenguajes, o de la buena voluntad de los implicados si dos personas distintas hacen los programas. Habría que tomar en cuenta si se permitirá cierto caching o no, o si el programa no será escalable por culpa de los manejos hechos para que corra más rápido. Y las posibles opciones de compilación y corrida? Hasta el hecho de con qué compilador compilamos! Hay una larga, largísima, casi interminable lista de cosas a tomar en cuenta, pero al menos, si probamos, tendremos una base para despotricar, no?

Para todos aquellos que odian a Java (que, normalmente, son los que aman C), Java es una tortuga. Un lenguaje indigno de llamarse tal, quizás porque evita que se puedan dar un tiro en el pie, o quizás porque... No lo sé. El caso es que, cada día más, Java va siendo aceptado por los conocedores como un lenguaje rápido. Más aún (tiemblen), se dice que Java 1.6 es incluso más rápido que C. Claro, lo dicen amantes de Java.

Veámoslo así: Se han fijado que cada vez que un programa en Java corre lento, se culpa a Java? Pero cuando un programa en C corre lento, se culpa a la red. Por qué la mala fama?

Creo que el problema podría ser incluso edades: C es veinte años mayor que Java, y fué el líder indiscutible hasta que éste llegó. Es natural que haya sido trabajado al derecho y al revés en esa época. Java ni siquiera tiene veinte años en el mercado, mucho menos en los centros de enseñanza... Así que tenemos que Java es un poco como el Dominó o el Ajedrez: mucha gente sabe poner o mover las piezas, y por ello creen saber jugar.

Y, creo yo, es por ello que normalmente un sentimiento de lentitud es asociado a los programas en Java, justa o injustamente.

Soy de la opinión de que se dice que Java es lento porque normalmente los desarrolladores Java tienden a no hacer las cosas bien. Y no me refiero solo a generar bytecode en Java, o configurar la máquina virtual para mejorar su rendimiento, sino a conocer el detalle de la herramienta, para poder elegir correctamente entre Vector, ArrayList o arreglo.

En lo personal, a veces he mejorado procesos en Java de formas asombrosas, y como les dije, no me considero un especialista... Pero es que hay mucha gente peor que yo. Hace algún tiempo, con un cambio tonto, bajé la duración de un proceso de diez minutos a menos de un minuto. Como parte de la mejora de un proceso masivo, hemos hecho que el tiempo en el que cada unidad de trabajo es procesada baje de seis minutos a una por segundo...

Es sólo cuestión de proponérselo.

Tristemente, hoy en día cualquiera "programa", cualquiera escribe en internet, y cualquiera da hay opiniones tan "sólidas" y "pensadas" como que "velocidad de desarrollo es mejor que velocidad de ejecución", o que hay código que en Java corre en un segundo, y en C en un mes (Genio, no has pensado que quizás la optimización del compilador elimina cosas inútiles como tus ciclos vacíos?).

Java se encarga de muchas cosas engorrosas del proceso de programación. Eso tiene cosas buenas y malas. Buenas, como el hecho de que permite que te concentres en lo que importa, por lo que se dice que en general se codifica más rápido en Java que en C. Malas, como el hecho de que asumes muchas cosas y te olvidas de hacerlas bien.

Insisto: Java no es lo más rápido, pero tampoco es notablemente lento. Y el detalle es que, sea más rápido o no lo sea, lo importante -considero yo- es que aceptemos tres cosas: Primero, espero que de ahora en adelante al menos se tomen la molestia de probar antes de hablar. Segundo, la velocidad de Java es comparable a la de C; en efecto, para cualquier desarrollo excepto los más rebuscados, la velocidad ya no es un factor de decisión al tratar de elegir entre ellos. Y tercero, si programas similares tienen diferencias notorias en velocidad entre uno y otro lenguaje, lo más probable es que se deba a la inexperiencia del desarrollador.

No olviden la frase de papá Weinberg: casi con total seguridad, el problema es la gente. Siempre.


Aquí les dejo unos linkcitos a los interesados. Algunos son interesantes, y otros son rebuznos. Diviértanse averigüando cuál es cuál.

3 comentarios:

Yukino M. dijo...

A mi me cae mejor Java porque es ... así como "cute"... (a que alguno se engrinchó con ese comentario X-D ). Pero qué más da, si yo lo que sé de programación sos dejos de divertimentos pseudo-estudio-laborales de html-ccs, javascript (sí, sí, yo sé que no es lo mismo ni se le parece) y mi amado actionscript.

Pero más allá de eso, le tengo seriamente respeto a Java porque, como una simple usuaria, me ha dado grandes satisfacciones: Simple, más rápido y mucho más eficiente que varios otros programas semejantes... ¿Más rústico? Sí. Pero me funcionó.

Ahí quería llegar con el palabrerío (¿inútil?)

El resultado final: ¿Es fácil de manejar? ¿Es eficiente? ¿Lo logra en un tiempo decente? Es lo único que me interesa. Cuál es el lenguaje de programación, cuánto te tardaste, o qué problemas te dio, a mi, como usuaria, no me interesa. Lo más que vas a lograr es una mentada si la vaina se guinda.

No es insulto, es realidad. Es saber dónde se está parado!

Vamos, que los programadores no deben llegar ni al 10% de usuarios de computadoras.

Y el mensaje no es con obscuridad, ojo, sino con los puristas... porque se extiende a cualquiera.

En mi área, el diseño, es la misma vaina. El cliente es el mayor objeto de burla y de queja. El SO y los programas usados son objeto de discusión. Pero el que me paga a mi para hacerle un anuncio ¿acaso le importa saber si para un "brillito" de su anuncio utilicé dos días de mi vida para crearlo lo más realista posible? ¿y si el "brillito" ni siquiera le parece que le queda bien? Lo que le importa es obtener lo que pidió, y que aumenten sus ventas. Punto.

Cada quien que experimente como le venga en gana (eso es arte), pero a la hora de trabajar... el único que importa es el usurio(s) final ¿no? ¿o para quién trabajan?

Besos.

Alberto dijo...

Al final, lo que verdaderamente importa no es si Java es mas eficiente que C o viceversa, sino la calidad de tu trabajo como programador. Si a la hora de hacer el código buscas optimización y sencillez al mismo tiempo, no importa el lenguaje de programación.

Ahhhh, tengo ganas de ver a esos puristas del lenguaje trabajar en Ensamblador, que es el verdadero campeón en cuanto a velocidad de ejecución, peso del ejecutable y rendimiento.

:)

Soronthar dijo...

En realidad, no se puede decir con certeza quien es mas rapido (si C o Java) porque depende de muchos factores. Es una discusion inutil e infructuosa.

Es posible que el programa en Java ejecute hasta un 100% mas rapido (si, el doble de rapido) que su equivalente en C. Esto es porque el compilador de C tiene una unica oportunidad de optimizar el codigo (algo que hace bastante bien, por lo demas), mientras que un programa en Java es optimizado en dos fases: primero por el compilador, y segundo por el JIT de la maquina virtual que puede realizar optimizaciones imposibles de realizar por el compilador.

Ahora, es cierto que Java era un caracol en sus versiones 1.0 y 1.1, epoca en que se popularizaron los Applets. Ellos son los principales causantes de la impresion que Java es lento.

Ironicamente algunas de las tecnicas de optimizacion de codigo en C (como loop unrolling y alternar la direccion por la que se recorre un arreglo) no funcionan en Java y, de hecho, hacen que el programa sea mas lento.

Lo que si es inegable es que el tiempo que se toma para poder "comenzar a ejecutar" un programa en Java es infinitamente mayor que el que se requiere para ejecutar un programa compilado, ya que primero la JVM debe inicializarse, y luego es que el programa en Java se ejecuta.

Esta dependencia de la JVM causa que muchos los microbenchmarks que "demuestran" que C es mas rapido que Java esten irremediablemente prejuiciados en favor de C: Al ejecutar el codigo por poco tiempo, el JIT no tiene oportunidad de trabajar.

Es Java perfecto? No, no lo es. Es un lenguaje deliberadamente simplificado para permitir realizar el 80% del trabajo que requieren los negocios actuales. Y justamente esa es su fortaleza: Es simple y suficientemente poderoso como para hacer el trabajo para el que fue diseñado.

Como nota final y curiosa, te dejo este link: El dueño del blog lanzo un desafio de programacion, y la version mas rapida (por mucho) esta hecha en Java :)