Grupo Linuxero del Bajío

Descripción del lenguaje JavaScript

Víctor Manuel Jáquez Leal

En 1995, Netscape Navigator estaba en su cúspide como el navegador de Internet, cuando su recién fichaje, Brendan Eich, tuvo la genial idea de insertar un lenguaje de programación dentro del navegador, pudiendo así ofrecer páginas web cuya interfaz con el usuario fuera más dinámica.

Eich primero esbozó un lenguaje muy cercano a Scheme, un dialecto de Lisp, pero los empleados de cuello blanco pusieron el grito en el cielo: “¿cómo iba la gente a usar un lenguaje de programación funcional para hacer sus páginas?”, así que trocaron hacia un diseño ecléctico, por no decir “frankesteiniano”: Una sintaxis similar a C, un conjunto de estructuras predefinidas cuyos nombres fueron tomados de Java, y los conceptos principales de diseño fueron tomados de Scheme y del poco conocido lenguaje de programación, Self.

Así es, el lenguaje de programación JavaScript, el que recobró importancia tras el advenimiento de Ajax, tiene tanta relación con los lenguajes funcionales clásicos, como con los lenguajes imperativos como C, Pascal o Java. Y tal vez sea precisamente eso, su enfoque mixto, el motivo principal de su éxito.

El nombre de JavaScript se debe a la lamentable consecuencia de una negociación económica entre Sun y Netscape, ya que el primero quería que todo en Internet tuviera el prefijo Java y el segundo, poder distribuir la máquina virtual de Java junto con el navegador. El lenguaje tuvo, antes de su distribución al público, nombres mucho más sugerentes, como LiveScript, o, más anteriormente, Mocha.

En 1996, Netscape sometió el lenguaje a ECMA Internacional, para que, dentro de un comité internacional, se decidiera el desarrollo del lenguaje, y no estuviera a merced de intereses comerciales que conducirían a un cisma de la Web. No obstante, se rebautizó el lenguaje dentro del comité a ECMAScript. Actualmente existen varias encarnaciones de esta especificación, tal como el mismo JavaScript, JScript de Microsoft, ActionScript de Adobe, QtScript, etcétera.

Pero veamos más de cerca las características de diseño más relevantes del lenguaje:

JavaScript se considera un lenguaje simple y altamente dinámico [1]. Decir que un lenguaje de programación es dinámico no quiere decir nada desde un punto de vista formal, pero se acepta en algunos círculos que esto se refiere a que es un lenguaje de muy alto nivel, donde muchas operaciones que comúnmente suceden en tiempo de compilación, se realizan en tiempo de ejecución. Operaciones tales como el sistema de tipos, la generación y ejecución de código “al vuelo”, así como extender los objetos y sus definiciones mientras se ejecuta la aplicación.

En el caso de JavaScript, desde el sistema de tipos es dinámico: las variables no están asociadas a un tipo de dato o estructura específico; los valores son los que tiene un tipo de dato asociado y las variables pueden direccionar a estos valores, pudiendo cambiar a otro muy distinto en la siguiente instrucción.

También se considera como dinámico porque utiliza los conceptos de programación basada en prototipos para sustentar su orientación a objetos, que surgió con el lenguaje de programación Self.

Para explicar este paradigma de programación, hay que recordar que en los lenguajes de programación orientado a objetos existen las clases, que definen métodos y atributos, y las clases se instancian en objetos. Las clases por lo general son inmutables en tiempo de ejecución. Pues bien, en la programación orientada a prototipos las clases no existen, sólo los objetos.

Los objetos se definen en tiempo de ejecución a través de dos mecanismos: por definición explícita y por clonación. La primera, el programador describe el objeto y sus propiedades explícitamente; en la segunda, un objeto ya creado copia el comportamiento de otro mediante una simple asignación, teniendo así un mecanismo de herencia en tiempo de ejecución.

En JavaScript, haciendo honor a su clasificación de simple, todos los objetos no son más que simples diccionarios o hashes [2]. Cada entrada del diccionario es una propiedad del objeto que puede ser añadida o eliminada en cualquier momento a lo largo de la ejecución del programa, pudiendo así los objetos mutar, como el caso de la clonación, el cual explicamos en el párrafo anterior.

Una de las implicaciones de que los objetos pudieran definirse en términos de diccionarios, fue la creación de la notación JSON [3], que permite definir, de manera descriptiva, objetos en JavaScript.

Y las propiedades del objeto también pueden ser funciones. Es más, a diferencia de otros lenguajes orientados a objetos, no existe distinción entre métodos y funciones. Y con esto entramos en la espesura funcional.

Como mencionamos, JavaScript tiene en sus genes a Scheme, un dialecto de Lisp, con lo cual su mecanismo de abstracción primordial son las funciones de orden superior [4], que simplemente son funciones que pueden aceptar funciones como parámetros y también pueden devolver una función como resultado. Esto implica que las funciones pueden ser definidas y evaluadas “al vuelo”, y por ende se les considera como elementos de primera clase [5] dentro del lenguaje.

Como consecuencia de lo anterior, las funciones son definidas en términos de objetos, tan manipulables como cualquier otro objeto, y cuentan con el operador () que es el encargado de invocarlas. También, como consecuencia lógica de las funciones de orden superior, cualquier función puede ser el constructor de objetos, sólo hay que antecederla con la cláusula new.

Por otro lado, el ámbito léxico de las variables es relativo a la función. Dicho de otra manera, el contexto de cualquier variable definida se extiende la lo largo de toda la función, aun dentro de sus funciones anidadas.

Sumando el ámbito léxico a la función y ésta como elemento de primer orden, la habilidad de manejar closures [6] es automática.

Hasta aquí describimos los puntos más interesante del diseño del lenguaje y esperamos que les sea de utilidad para entender el espíritu mismo de su estilo a la hora de programar en él.

  1. http://www.ecmascript.org/es4/spec/overview.pdf
  2. http://en.wikipedia.org/wiki/Associative_array
  3. http://www.json.org/
  4. http://en.wikipedia.org/wiki/Higher_order_function
  5. http://en.wikipedia.org/wiki/First_class_function
  6. http://en.wikipedia.org/wiki/Closure_%28computer_science%29