viernes, 30 de diciembre de 2011

Empezando con Node.js

El pasado día 27 de diciembre estuve en la charla organizada por el grupo MadridJS sobre Node.js y Heroku. Acudí porque había leído algo sobre el tema y tenía curiosidad por saber de qué trataba realmente este proyecto. En la charla se dió una explicación inicial de lo que es y para qué sirve e incluso se vió algún ejemplo real, pero además se habló de algunos otros proyectos y tecnologías relacionadas con Node.js, como es el manejo de WebSockets con la librería Socket.IO.

A partir de lo visto en dicha charla me ha picado la curiosidad y en lo últimos días he estado buscando información sobre Node.js para poder conocer algo más sobre este proyecto. Node.js lleva la programación en Javascript al lado del servidor. Es una plataforma que permite el desarrollo de servidores de alta concurrencia y que se ejecuta sobre la máquina de Javascript de Google V8. Se basa en el paradigma de programación orientada a eventos de entrada y salida de forma asíncrona.

¿Y cuál es la principal ventaja de Node.js? Pues su rapidez y el menor número de recursos que consume. Un servidor de Node.js se ejecuta en un único hilo y no crea un nuevo proceso o un nuevo hilo por cada petición entrante, con el consumo de recursos que esto supone. Sin embargo, las operaciones en Node.js se ejecutan de forma no bloqueante en base a eventos, por lo que se pueden aprovechar los tiempos muertos de las operaciones de entrada/salida para servir otras peticiones y aumentar la rapidez.

¿Que significa que las operaciones se ejecutan de forma no bloqueante y en base a eventos? Pues que todas las operaciones de entrada/salida se realizan de forma asíncrona. Cuando se llama a una operación de entrada/salida se le pasa una función callback que será el manejador del evento de ejecución y pasa a ejecutarse en segundo plano, continuando con la ejecución del programa. Cuando la operación de entrada/salida haya finalizado saltará el evento correspondiente y se llamará a la función callback que lo maneja, que dispondrá de la información recuperada y podrá trabajar con ella.

Además de los módulos que Node.js incorpora en su instalación, existen multitud de módulos adicionales que puedes ser usados, los cuales se pueden instalar a través de la herramienta de gestión de paquetes de Node.js: NPM (Node Package Manager). Dichos módulos permiten el acceso al sistema de archivos, bases de datos, ofrecen una implementación del patrón MVC... Dichos módulos están organizados según el estándar CommonJS.

En vez de incluir aquí un ejemplo de cosecha propia, voy a remitir a quien quiera profundizar más a “The Node Beginner Book”, un tutorial estupendo para iniciarse en Node.js y empezar a entender su forma de trabajar.

Otras referencias sobre Node.js:
Página oficial de Node.js
Node.js en español
Introducción a Node.js de Rafa Muñoz
Introducción a Node.js en debugmodeon
Understanding Node.js
How to Node
Understanding the Node.js event loop
Colección de enlaces sobre Node.js

viernes, 23 de diciembre de 2011

La evolución de JavaScript

En los últimos meses, y viendo la popularidad de JavaScript debido a fenómenos como HTML5 o NodeJs, me he propuesto ponerme al día con JavaScript, ese lenguaje que normalmente utilizo para hacer validaciones en mis páginas HTML, pero que, en realidad, permite mucho más que eso.

Lo cierto es que, debido al boom que está sufriendo este lenguaje, lo que más me está costando es saber cuál es el estado en que se encuentra y hacia donde se encamina. Por ello, sirva este post para recopilar las ideas que sobre ello he ido encontrando y para, a partir de él, seguir profundizando en el lenguaje y sus capacidades, tanto nuevas como antiguas.

JavaScript surgió como un lenguaje de script en el navegador que apareció por primera vez dentro de Netscape Navigator 2 allá por 1995, y que se basaba en el lenguaje CEnvi desarrollado anteriormente por Nombas.

Fue tal el éxito de JavaScript que Microsoft decidió incorporar su propia implementación de este lenguaje, llamada JScript, en la versión 3 de su navegador Internet Explorer.

Debido a los problemas que entrañaban las diferencias entre implementaciones, se envió la versión JavaScript 1.1 como propuesta a ECMA para su estandarización, que culminó con el estándar ECMA-262. Este estándar dicta la base del lenguaje ECMAScript a través de su sintaxis, tipos, sentencias, palabras clave y reservadas, operadores y objetos, y sobre la cual se pueden construir distintas implementaciones. La versión JavaScript 1.3 fue la primera implementación completa del estándar ECMAScript.

Actualmente, las implementaciones de JavaScript de los navegadores implementan la versión 3 del estándar ECMAScript, que data de 1999, y cuyas últimas mejoras han sido:
  • Soporte de expresiones regulares.
  • Nuevas sentencias de control.
  • Manejo de excepciones (bloque try-catch).
  • Definición de errores más precisa.
  • Formateo de salidas numéricas de datos.
  • Manejo de strings más avanzado.

Cuando en 2004 se empezó a trabajar en la evolución de JavaScript, surge la revolucionaria propuesta ECMAScript 4, que pretende convertir JavaScript en un nuevo lenguaje con nuevas reglas, principalmente introduciendo el tipado de variables y el concepto tradicional de clases e interfaces al estilo de lenguajes como Java.
Debido a la revolución que estos cambios en JavaScript suponían, surge ECMAScript 3.1 como contrapropuesta, que evita introducir nuevos conceptos y añade en su lugar características adicionales al lenguaje.

Finalmente se llegó a la decisión de enfocarse en la propuesta ECMAScript 3.1, que se ha cambiado de nombre, pasando a ser ECMAScript 5. ECMASCript 4 ha quedado relegada al proyecto Harmony. Harmony, que a su vez parece que pasará a ser ECMAScript 6, pretende incorporar a posteriori en ECMAScript 5 algunas de las mejoras propuestas inicialmente por ECMAScript 4.

Las características que se incluyen en ECMAScript5 son las siguientes:
  • Getters y setters.
  • Array extras y reductions.
  • Cambios en Object:
    • Rediseño de los atributos internos de las propiedades.
    • Introducción de métodos estáticos de Object, que permiten:
      • Acceder a la información del prototipo.
      • Manipular las propiedades de un objeto.
      • Crear objetos de forma dinámica.
      • Obtener los nombres de las propiedades.
      • Impedir que un objeto sea modificado.
    • Cambios a las funciones:
      • Soporte nativo del function currying a través del método bind.
    • Cambios en el objeto Date.
  • Soporte nativo de JSON.
  • Modo de ejecución strict, que define reglas de codificación más estrictas que el modo de ejecución estándar.

Los cambios que podrían ser introducidos en ECMAScript 6 se mencionan en esta charla de Dave Herman, ingeniero de Mozilla Labs y representante del TC39:
  • Módulos.
  • Ámbito a nivel de bloque (sentencia let).
  • Generators.
  • Proxys.
  • Destructuring assignments.
  • Rest y default arguments.
  • Name objects.
  • Iterators.
  • Array comprehensions.
  • String templates.
  • Hash tables y weak maps.

También parece que se podría incluir:
  • Constantes.
  • Clases y herencia.
  • Tipos Map, Set y StructType.

Algunos navegadores ya han ido incluyendo estas y otras mejoras del lenguaje, como se indica en estos datos obtenidos de Wikipedia:
  • Javascript 1.5 (Firefox 1.0, IE 8-, Opera 6, Safari 5-, Chrome 10-):
    • ECMAScript 3.
    • Constantes.
    • Getters y setters.
  • Javascript 1.6 (Firefox 1.5):
    • Array extras.
    • Array y String Generics.
  • Javascript 1.7 (Firefox 2.0):
    • Ámbito a nivel de bloque.
    • Generators.
    • Iterators.
    • Array Comprehensions.
    • Destructuring assignments.
  • Javascript 1.8 (Firefox 3.0, Opera 11.50):
    • Expression closures.
    • Generator Expressions.
    • Array Reductions.
  • Javascript 1.8.1 (Firefox 3.5):
    • Soporte nativo de JSON.
  • Javascript 1.8.2 (Firefox 3.6):
    • Actualizaciones menores.
  • JavaScript 1.8.5 (Firefox 4, IE 9):
    • 1.8.2.
    • ECMAScript 5.

Referencias:
- JavaScript en Wikipedia.
- ECMAScript en Wikipedia.
- Presentación sobre ECMAScript 5.
- ECMAScript 5: The Definitive Slides.
- Otra presentación sobre ECMAScript 5.
- Video: "Changes to JavaScript, Part 1".
- Video: "Dave Herman: The Future of JavaScript (ECMAScript 6)"