Thursday, July 05, 2012

Mi caso contra Javascript


En los últimos meses, años quizás, se ha dicho que Javascript es algto así como el nuevo BASIC, aludiendo a que en las computadoras de 8 bits el lenguaje más barato, en términos de recursos de máquina, era el intérprete de BASIC. Ahora Javascript, habiendo pasado una buena cantidad de años -y considerando los aances que han habido en lenguajes de programación- bien podría convertirse en el lenguaje de programación que fuese el más usado para un sinfín de tareas sencillas.

De acuerdo a la siempre sabia Wikipedia:

JavaScript es un lenguaje de programación interpretado, dialecto del estándar ECMAScript. Se define como orientado a objetos, basado en prototipos, imperativo, débilmente tipado y dinámico.

Se utiliza principalmente en su forma del lado del cliente (client-side), implementado como parte de un navegador web permitiendo mejoras en la interfaz de usuario y páginas web dinámicas, en bases de datos locales al navegador... aunque existe una forma de JavaScript del lado del servidor (Server-side JavaScript o SSJS). Su uso en aplicaciones externas a la web, por ejemplo en documentos PDF, aplicaciones de escritorio (mayoritariamente widgets) es también significativo.

JavaScript se diseñó con una sintaxis similar al C, aunque adopta nombres y convenciones del lenguaje de programación Java. Sin embargo Java y JavaScript no están relacionados y tienen semánticas y propósitos diferentes. Todos los navegadores modernos interpretan el código JavaScript integrado en las páginas web. Para interactuar con una página web se provee al lenguaje JavaScript de una implementación del Document Object Model (DOM).

Tradicionalmente se venía utilizando en páginas web HTML para realizar operaciones y únicamente en el marco de la aplicación cliente, sin acceso a funciones del servidor. JavaScript se interpreta en el agente de usuario, al mismo tiempo que las sentencias van descargándose junto con el código HTML.

JavaScript fue desarrollado originalmente por Brendan Eich de Netscape con el nombre de Mocha, el cuál fue renombrado posteriormente a LiveScript, para finalmente quedar como JavaScript. El cambio de nombre coincidió aproximadamente con el momento en que Netscape agregó soporte para la tecnología Java en su navegador web Netscape Navigator en la versión 2003 en diciembre de 1995. La denominación produjo confusión, dando la impresión de que el lenguaje es una prolongación de Java, y se ha caracterizado por muchos como una estrategia de mercadotecnia de Netscape para obtener prestigio e innovar en lo que eran los nuevos lenguajes de programación web.



Pues bien, hace poco decidí echarle un vistazo más serio a Javascript y me hice de un par de libros que empezaran desde cero. Asumiendo que he programado por muchos años y que los lenguajes de programación finalmente comparten los mismos preceptos, no debería sr muy pronunciada la curva de aprendizaje.

Estoy leyendo el libro "Javascript programming for the Absolute Beginner", de Andy Harris, Ed. Prima Tech., y encuentro que francamente no es el mejor para hacer de la programación una disciplina. Veamos algunos ejemplos:



Este primer programa pide un nombre del usuario (del teclado) y pone una ventana saludándolo. Hasta aquí se ve simple y fácil. La expresión:

greeting  = "Hi, " + userName + "!!";

"pega" la cadena "Hi, "con el nombre escrito por el usuario y termina pegando la cadena "!!".

Pero veamos cuando trabajamos con números:



Si corremos este programa, hallaremos que al desplegar el programa el total de la cuenta, (asumiendo, por ejemplo, que la comida costó 100 pesos y la propina fue de 15 pesos), el resultado que dará es "10015", lo cual está mal, evidentemente. Resulta que cuando se pone:

var total = meal + tip;

Hallamos que pega ambas cantidades como si fuesen cadenas de caracteres. Pero fíjense que en el caso de la siguiente línea:

var tip = meal * .15;

el sistema entiende que el valor que está en la variable "comida" es un entero y hace el cálculo correctamente.

Dicho de otra manera, Javascript no es un lenguaje que preste atención a la tipificación de variables y esto es en mi opinión un diseño que no promueve una disciplina correcta en el arte de programar. Lo adecuado sería, e incluso el inventor de Pascal, Niklaus Wirth, estaría de acuerdo conmigo es que las variables se identifiquen como de cadenas de caracteres, reales, enteras, etc. Pero no, no pasa esto y entonces hay que adivinar el comportamiento del sistema.

El problema no es el ejemplo, que finalmente se soluciona agregando

//ponemos el valor de la variable 'meal' como un número y
//y no una cadena de caracteres
meal = eval(meal);

sino la cantidad potencial de errores que pueden darse por esta situación. Es francamente ridículo que a estas alturas de los lenguajes de programación tengamos que pasar por este tipo de lenguajes no tipificados. Y por cierto, PHP hace lo mismo.

9 comments:

Emmanuel Herrera said...

Entiendo tu punto y lo comparto totalmente, la falta de rigor en JavaScript puede llevar incluso a "errores extraños", q incluso a los que tenemos varios años programando nos llegan a tomar desprevenidos de vez en cuando (al menos a mi me pasa), pero por otro lado, para bien y/o para mal, lo que es mejor no es siempre lo más popular, un debate similar se ha dado por años con respecto a HTML y XHTML, aun me toca presenciar de vez en cuando algún pseudopleito por algún detalle de rigor, entre programadores de Visual Basic y C#, C# y C++, C y Java, etc. Pero la realidad es que JavaScript será la puerta de entrada para muchos programdores nuevos, debido a todo el tema que rodea a HTML5 y a que para comenzar a jugar con el, solo necesitas un notepad (por nombrar algo) y un navegador, y es esta facilidad por la cual creo que se le compara con BASIC, los golpes que después se den en la frente estos programadores al toparse con lenguajes de mayor rigor, serán parte de, como dices, el arte de programar...solo queda suspirar y citar a Cristina Pacheco... aquí nos tocó vivir. Saludos!

@fw_gekko

Eduardo Rodríguez Ávila said...

Totalmente de acuerdo. Resulta asombroso toda la industria que se ha generado alrededor del JavaScript (sin considerar lo de Java, por supuesto).

Adicionalmente, el browser y JavaScript no son los mas adecuados para cuestiones matemáticas. Me ha pasado que al desarrollar alguna que otra página web que requiere de algún script y que no necesariamente está destinado para cálculo de precisión, me he topado con problemas de precisión al momento de los cálculos.

Por cierto, hay un "typo" en el primer párrafo, "aances" en lugar de "avances".

Armando Cifuentes González said...

Saludos.-

En primer lugar felicitarte por este blog, he visto el programa de la Oveja Eléctrica un par de ocasiones (desde que tengo sistema de televisión por cable). Cuando veo el programa procuro verlo completo. Ahora ¿cómo di a este blog? Google me mostró posibles enlaces del portal La Oveja Eléctrica (hahahaha).

Estoy de acuerdo contigo cuando mencionas que no existe algún tipo de dato en específico en este lenguaje. No existen primitivas y objetos (las primitivas avanzadas como Integer, Double, Float, etcétera), solamente "var" (que bien pudiera considerarsele como un tipo Object.

JavaScript es un lenguaje independiente de JAVA, su arquitectura es similar, pero no tiene parentesco alguno con él. Es un lenguaje de scripts nada más. Ahora ¿por qué no maneja tipos de datos? Quizás por la sencilla razón de evitar consumos de memoria (que no creo) o facilitar la vida al programador. Aprendí básico de este lenguaje en CBTiS y actualmente en el Tecnológico estoy retomando dicho lenguaje, pero además usando tecnologías como JQuery.

Leía hace poco un libro de HTML5, donde hacían alusión a la tecnología de JQuery. Puedo pasarte un correo si usted gusta para proporcionarte el enlace del libro.

Con todo esto no pretendo decir que sea un sabio de la programación, simplemente soy un estudiante en proceso de aprendizaje. Saludos.

Morsa said...

sí, mi correo es morsa@la-morsa.com.

gracias
saludos
manuel

Armando Cifuentes González said...

Ya envíe el enlace del libro a su correo. Saludos.

Morsa said...

Sí, Amando, gracias.

saludos
Manuel

Héctor Daniel Cortés González said...

Yo tampoco termino de pescarle al JavaScript. Siendo dinosaurio de la computación aprendí a programar en PASCAL. Desde hace mucho tiempo programo en Perl. Adoro el lenguaje. Puedes hacer programas siguiendo las reglas, pero también lo puedes obligar a que las rompa. Siendo Perl un lenguaje sin tipos, el operador + suma números, mientras que el operador . concatena (sic) cadenas. Como yo lo veo, tu caso contra JavaScript está sustentado en el abuso de la sobrecarga de operadores, en particular del operador + que lo mismo sirve para sumar números que para pegar cadenas.

Morsa said...

Héctor,

Yo creo que los lenguajes sin tipos no son una buena idea, excepto en Prolog.

saludos
Manuel

equinoxe said...

JavaScript en mi opinión es un lenguaje horrible, pero no tanto porque no sea "tipeado" (al final esa tarea recae en el programador) sino por la incompatibilidad enorme entre navegadores. Aunque esto se ha solucionado en los últimos años gracias a que MS ha actualizado su MSIE, aún hay incompatibilidades entre diversos motores, lo que ocasiona a veces resultados impredecibles. Otro problema que a veces es desconcertante es el mal manejo de memoria por parte de algunos motores, lo que causa que el sistema completo, que ya no el navegador, se alente. Es mejor utilizar librerías como jQuery si se quiere programar con JavaScript+DOM.