Aclaración: ODIO JAVA (y un poco de switch/case)

Posted by

Java es un lenguaje arcaico, increíblemente lento, y redundante. Si lo enseñé alguna vez, fue porque:

  1. El director del Instituto que me lo pidió inicialmente, se confundió… pensó haber leído en mi currículo que yo había sido docente en la UNICA (ahí dice claramente que fui Tech Support. Fue un momento bastante jocoso, la verdad),
  2. Parece que no existia nadie más en Ica que enseñara eso, y
  3. Me pareció paja la idea de ser profe 🙂

Es un error que no volveré a repetir. Quiero enseñar/exponer sobre Linux, Gambas, Blender, Python, y cualquier otro software libre que sea emocionante 🙂

¿Por qué digo que Java es arcaico y redundante? Porque su sintaxis es una copia de C. Y la sintaxis de C sólo tiene razón de ser en C, ya que el compilador de éste optima el código para convertirlo en lenguaje máquina, y ganar velocidad. Los lenguajes de programación de más alto nivel ya no compilan a lenguaje máquina directamente, usualmente lo hacen hacia un bytecode, y las optimizaciones de velocidad precisas de C pierden sentido. Para muestra, un botón: La sentencia switch, de C.

Si te has preguntado por qué tienes que escribir un break después de cada segmento case en una sentencia switch en Java, es por que tu inconsciente también sabe que Java es feo 😀 Básicamente, un switch es un montón de ifs anidados, y es lo mismo usar uno u otro (python, por ejemplo, no tiene una instruccion switch, y te recomienda usar simplemente ifs), no hay beneficio de velocidad.

Excepto en C. La sentencia switch en C crea una tabla de saltos, donde el puntero de ejecución es empujado cierta cantidad de instrucciones según el valor numérico que se le pasa a la sentencia switch. Al no haber comparaciones (esto es, ifs), es mucho más rápido. Entonces cada keyword case marca un punto donde debe de saltar el puntero de ejecución. Aquí viene lo interesante: case no es una sentencia, no produce código máquina, solo lo usa el compilador para armar la tabla de saltos. Cuando se ejecuta el programa, no hay forma de saber dónde acaba las sentencias que le corresponde a cada case, por lo que uno manualmente tiene que marcar el fin, indicando que salga del bloque switch usando la sentencia break.

Esta forma de trabajar de switch permite hacer optimizaciones bastante locas (como el dispositivo de Duff). Otra cosa a notar aquí, es que el valor que se le proporciona a switch debe ser únicamente numérico (o pueda ser casteado a numérico), ya que este valor será sumado al valor del puntero de ejecución.

Es poco probable que ese tipo de sentencia switch se use en estos tiempos, incluso lenguajes feos como Visual Basic tienen un switch mucho más moderno (su SELECT CASE, que permite hacer comparaciones de mayor, menor, y de cadenas, obviamente es internamente IFs anidados)

¿Aún sigues pensando que Java es moderno? Allá en 1995, adoptaron la sintaxis de C para hacerlo familiar con los programadores, y modificaron cosas que trae problemas en C (como punteros, recolectores de basura, etc.) Cumplió su objetivo, y se volvió muy popular. Y el mismo bodoque siguen usando hasta ahora, por mucha presión de grandes billeteras. Suena un poco a la historia de Windows 🙂 Ahora hay muchos lenguajes de programación, como Python, o Ruby, que son infinitamente mejores, modernos, y se enfocan en la velocidad de desarrollo, que es lo que realmente importa en estos tiempos.

Si, es cierto: PHP tiene también la sintaxis de C. Por eso estoy en el proceso de dejarlo 🙂

(Desde el Wayback Machine)

Update 18 marzo, 2016: No, no lo dejé. Después de un par de años de estar enseñándolo, me di cuenta que se ha vuelto menos feo, así que le he dado una nueva oportunidad (obviando usar estas cosas obsoletas, como switchs y fors). Incluso he hecho un framework para PHP, llamado Vendimia 🙂

Leave a Reply

Su dirección de correo no se hará público. Los campos requeridos están marcados *