lunes, 30 de marzo de 2009

JavaScript: El Lennguaje de Programación Más Malentendido del Mundo

(Aquí les dejo traducido, el primer texto que leí de Douglas Crockford, y con el que me introduje en el interesantisimo mundo de javascript)

Javascript tambien conocido como: Mocha, LiveScript, JScript, ECMAScript es uno de los lenguajes de programación más populares del mundo. Virtualmente todo computador personal en el mundo tiene, al menos, ún interprete de JavaScript instalado en él, y en uso activo. La popularidad de JavaScript se debe enteramente a su rol como lenguaje de scripting de la WWW.
A pesar de su popularidad, solo algunos saben que JavaScript es un muy buen lenguaje de programación dinámico, orientado a objetos, de proposito general. Cómo puede ser esto un secreto? Porqué este lenguaje es tan malentendido?

El Nombre

El prefijo Java sugiere que JavaScript está, de alguna manera, relacionado a Java, que es un sub conjunto o una version menos poderosa de Java. Resulta que el nombre fué intencionalmente seleccionado para crear confusión, y de la confusión viene el malentendimiento. JavaScript no es Java interpretado. Java es Java interpretado. JavaScript es un lenguaje diferente.

JavaScript tiene una similitud sintáctica con Java, tanto como Java la tiene con C. Pero no es un sub conjunto de Java, tanto como Java no es un sub conjunto de C. Es mejor que Java en la aplicación para la que Java (oak) fue creado.

JavaScript no fué desarrollado en Sun Microsystems, el hogar de Java. JavaScript fué desarrollado en Netscape. Fue originalmente llamado LiveScript. Pero el nombre no era lo suficientemente confuso.

el sufijo Script sugiere que no es un lenguaje de programación real, que un lenguaje de scripting es más que un lenguaje de programación. Pero en realidad es una cuestión de especialización. Comparado con C Javascript tiende al performance para poder expresivo y dinaminsmio.

Lisp vestido de C
La sintaxis parecida a C, incluyendo las llaves y la manca sentencia for, lo hacen parecer un oridinario lenguaje de programación procedural. Esto está malinterpretado, porque JavaScript tiene más en común con lenguajes funcionales, como Lisp o Scheme, que con C o Java. Tiene arreglos en vez de listas y objetos en lugar de listas de propiedades. Las funciones son de primera clase (first class). Tiene cerraduras (closures). Tiene lambdas sin tener que balancear todos esos parentecis.

Encasillamiento (Typecasting)
JavaScript fué diseñado para correr en Netscape Navigator. Su éxito allí lo llevó a convertirse en un equipamiento estandar de virtualmente todos los navegadores web. Esto lo llevó al encasillamiento. JavaScript es el George Reeves de los lenguajes de programación. JavaScript se ha adaptado bien a una gran cantidad de aplicaciones no relacionadas con la web.

Objetivo Cambiante
La primer versión de JavaScript fué muy debil. Carecía de manejo de excepciones, inner functions, y herencia. En su forma actual, es ahora un completo lenguaje de programación orientado a objetos. Pero muchas de las opiniones sobre el lenguaje estan basadas en sus comienzos inmaduros.

El comite ECMA, que tiene el control sobre el lenguaje, esta desarrollando extensiones que, aunque bien intencionadas, van a agrabar uno de los problemas más grandes del lenguaje: Ya existen actualmente demasiadas versiones. Esto crea confusión.

Errores de Diseño
Ningún lenguaje de programación es perfecto. JavaScript tiene su porción de errores de diseño, como la sobrecarga del operador + para significar ambos, la suma y la concatenacion con coerción de tipos y la errorosa (error-prone) sentencia with, que deben ser evitados. La política de palabras reservadas es muy estrícta. La insercion del punto y coma (;) fue un gran error, como lo es la notacion para literales de expresiones regulares. Estas equivocaciones han llevado a errores de programación, que han puesto en cuestionamiento todo el diseño del lenguaje. Afortunadamente, muchos de estos problemas pueden ser mitigados con un buen programa lint. El diseño del lenguaje en general es bastante cuestionado. Sorprendentemente el comite ECMA no parece estar interesado en corregir estos errores. Quizas estan más interesados unos cuantos más.

Malas implementaciones
Algunas de las primeras implementaciones de javascript estaban llenas de errores. Esto se reflejó en el lenguaje de mala manera. Para complementar esto, esas implementaciones estaban embebidas en navegadores web horriblemente llenos de errores.

Malos libros
Practicamente todos los libros acerca de JavaScript son muy malos. Contienen errores, malos ejemplos, y promueven malas prácticas. Las carateristicas importantes del lenguaje son pobremente explicadas o dejadas de lado. He revisado docenas de libros de JavaScript y solamente recomiendo uno: JavaScript: The Definitive Guide (5th Edition) de David Flanagan.

Un estandar por debajo de lo normal
La especificación oficial del lenguaje es publicada por el ECMA. La especificación es de extrema mala calidad. Es dificil de leer y muy dificil de entender. Esto ha sido una contribución al problema de los malos libros porque los autores han sido incapaces de usar la documentacion del estandar para mejorar su propio entendimiento del lenguaje. Los comités del ECMA y él TC39 deberían estar profundamente avergonzados.

Amateurs
La mayoria de las personas escribiendo en JavaScript no son programadores. No poseen el entrenamiento y la disciplina para escribir buenos programas. JavaScript tiene tanto poder de expresión que ellos son capaces de hacer cosas utiles en él de cualquier manera. Esto le ha dado a JavaScript la reputación de ser estrictamente para amateurs, y que no se adapta para programación prefesional. Ese, simplemente no es el caso.

Orientado a Objetos
Es JavaScript orientado a objetos? tiene objetos, que pueden contener datos y métodos que actuen sobre esos datos. Los objetos pueden contener otros objetos. No tiene clases, pero tiene constructores que hacen lo que las clases hacen, incluyendo actuar como contenedor para las variables de clase y los métodos. No tiene herencia orientada a clases, pero tiene herencia prototypal.
Los dos principales caminos para construir sistemas de objetos son herencia (es ún) y agregación (tiene ún). JavaScript hace ambos, pero su naturaleza dinámica le permite ser elegante en la agregación.
Algunos argumentan que JavaScript no es verdaderamente orientado a objetos porque no provee ocultación de la información. Eso es que los objetos no pueden tener variables privadas o métodos privados. Todos los miembros son públicos.
Pero resulta ser que los objetos de JavaScript pueden tener variables privadas y métodos privados (haz click aquí si quieres saber cómo). Por supuesto solo algunos van a entender esto, porque JavaScript es el lenguaje de programación más malentendido del mundo.
Algunos argumentan que JavaScript no es verdaderamente orientado a objetos porque no provee herencia. Pero resulta ser que JavaScript no solamente soporta herencia clásica, sino tambien otro tipo de patrones de reutilización de código

Copyright 2001 Douglas Crockford. All Rights Reserved Wrrrldwide.

Si quieres leer el original en ingles puedes encontrarlo aquí

5 comentarios:

  1. tremenda traduccion...

    "cerradura" -> cierres lexicos

    .. y muchos mas

    ResponderEliminar
  2. 1. "que un lenguaje de scripting es más que un lenguaje de " ...Menos no 'más'.

    2. "Comparado con C Javascript tiende al performance para poder expresivo y dinaminsmio." ...Comparado con C Javascript 'sacrifica' rendimiento por poder expresivo y 'dinamismo'.

    Tremenda traduccion... Gracias por compartir!

    ResponderEliminar
  3. Pa muchas gracias por la info. Nunca se me habria ocurrido usar un closure para variables privadas.

    Saludos.

    ResponderEliminar
  4. :D gracias por la laborr... Interesante las cosas que no sabemoss. Un saludo.

    ResponderEliminar
  5. Quisiera saber cuales son los estándares de javascript

    ResponderEliminar