miércoles, 12 de octubre de 2011

Dart : Structured web programming

Hace par de días Google anunció su rumoreado lenguaje de programación del cual les había informado en eliax, y lo ha bautizado Dart (como "Dardo"), y he estado estudiándolo y hoy les doy mis primeras breves impresiones.

Noten antes de continuar que Dart está en una etapa muy temprana de su desarrollo. Google lo considera un "Technology Preview" (un avance sobre lo que será), y no una versión final, destacando explícitamente que muchas cosas podría cambiar de aquí a la primera versión oficial.

Lo primero a destacar de Dart es la razón de su existencia, las razones son potencialmente las siguientes:

1. Javascript, el lenguaje por defecto para programar aplicaciones web en navegadores está fuera de control. Inició como algo sencillo, pero se ha vuelto toda una bestia, y al no tener estructura promueve demasiado la producción de "código spagetti" en donde al programa le falta estructura y en donde todo se vuelve difícil de mantener, en particular en proyectos grandes (algo que he vivido en carne propia).

2. Con HTML5, es complicado y tedioso cambiar contextos con distintos lenguajes de programación y declarativos, siendo la norma el combinar en un solo código fuente a Javascript, HTML, CSS, y algún otro lenguaje de servidor (como puede ser PHP, JSP, ASP, etc). Esto es algo que los que programamos con frecuencia aplicaciones web nos enfrentamos constantemente.

3. Siguiendo el punto anterior, otro problema es que la aplicación web típica por lo general se divide en dos lenguajes de programación distintos. Uno para el cliente (Javascript) que se ejecuta localmente en el navegador, y otro para servidores (PHP, JSP, ASP, etc). En vez de uno poder programar todo en un solo lenguaje.

4. Lenguajes como Javascript y PHP no fueron diseñados para escalar masivamente de forma horizontal.

Dart promete resolver todo esto, con un lenguaje super sencillo y que resultará familiar para toda persona que tenga al menos un conocimiento básico de Java, C#, o similares.

Dart parece un cruce entre Java y Javascript, por un lado soportando las estructuras de Java (Classes, Interfaces), pero por otro permitiendo opcionalmente la declaración de variables sin tipos explícitos (de forma similar a Javascript, Visual Basic o ColdFusion).

Dart además fue pensado para escalar masivamente, de modo que aplicaciones creadas en Dart para ambientes de servidores podrían por ejemplo comportarse como las de Google en sus inmensas granjas de servidores, tomando ventaja de patrones de alta escalabilidad.

Por ejemplo, algo que noté curioso sobre Dart es que intencionalmente es single-threaded (es decir, soporta un solo hilo de ejecución), lo que a primera vista aparenta una gran restricción, pero al leer la especificación técnica se hace evidente que reemplazaron el concepto de multi-threading por el concepto de Isolates (popularizado por el lenguaje Erlang).

Isolates en esencia es bastante similar a programar Processes en C bajo ambientes UNIX. Es decir, es como hacer un fork (o bifurcación de código) de un nuevo programa, en esencia separando el Isolate de tu programa por completo.

Esto tiene como gran beneficio que ahora tanto tu programa como los que desprendas de él en forma de Isolates se pueden paralizar de forma sencilla y altamente escalable.

Obviamente es necesario poder uno comunicarse entre el programa principal y los Isolates desprendidos, y para eso se adoptó un sistema de mensajería por queue.

Según Google, estas facilidades de Dart permitirán crear desde pequeños programas por un solo desarrollador, hasta complejos mega-sistemas con grandes equipos de desarrolladores, programando desde aplicaciones móviles hasta aplicaciones en la nube para millones de usuarios, todas con un solo lenguaje y entorno de ejecución.

Por si no lo han notado, Dart entonces apunta no solo a ser un reemplazo de Javascript en navegadores web al largo plazo, sino que además un reemplazo de Java, .Net, Metro, Objective-C, PHP y todo otro lenguaje que se puedan imaginar.

Esa es una meta bastante ambiciosa, pero creo que dado que Dart es apoyado por Google (lo que significa que no tardaremos en ver entornos de ejecución nativos de Dart en Google Chrome y Android OS), y que Dart intrínsecamente es un lenguaje sencillo de rápido aprendizaje y con una sintaxis que resultará familiar a muchos, que tiene buenas posibilidades de tener éxito.

Y hablando de entornos de ejecución, Dart funciona de dos maneras: La primera y más obvia es en una máquina virtual Dart, similar a como ejecuta Java, lo que podemos llamar la forma "nativa" de ejecutar aplicaciones Dart.

La otra manera es con un convertidor que convierte programas Dart a Javascript, lo que permitiría a desarrolladores ir trabajando con Dart mientras migran de Javascript y esperan que los proveedores de navegadores web adopten el lenguaje.

Por el momento el convertidor funciona con versiones recientes de Chrome, Firefox y Safari (todavía no con Internet Explorer). Lo ideal obviamente sería que Mozilla, Apple y Microsoft implementaran la máquina virtual de Dart en sus navegadores, pero habrá que esperar a ver si estas instituciones y empresas no se sienten amenazadas por Dart y están dispuestas a adoptarlo.

Una buena noticia es que Google ha hecho a Dart 100% Open Source, con la esperanza sin duda de que Dart se convierta en un estándar por-defecto, y que quizás sea adoptado por competidores bajo la promesa que al igual que HTML5, la industria sería quien defina su futuro (aunque bajo la tutela de Google, muy posiblemente).

Personalmente, este es el primer lenguaje de programación que verdaderamente me emociona desde los días del inicio de Java, pues con su simpleza se presta mucho a uno ser muy productivo rápidamente.

En nota relacionada, les traigo lo que para muchos quizás sea una primicia relacionada a Dart: Todos los rumores apuntan a que Google está desarrollando también un IDE (un entorno de programación visual integrado) que se ejecutará como un servicio "en la nube" al cual internamente llaman "Brightly" ("Brillante").

La idea de Brightly sería una que he mencionado varias veces en muchas de mis charlas en vivo: El desarrollo de un IDE que funciona al 100% dentro de tu navegador Web, con todos tus archivos fuentes archivados en la nube, lo que significa que podrás trabajar desde cualquier lugar, a cualquier hora, en cualquier máquina que tenga un navegador web moderno, y quizás con un simple clic arrancar la aplicación en un ambiente de prueba o producción (como bien podría ser el Google App Engine).

Una nota final que quiero agregar es que no se apresuren a declarar la muerte prematura de Javascript. Javascript estará con nosotros por mucho tiempo más, en particular dada las millones de páginas web que dependen de ese lenguaje en la actualidad, y del hecho que Dart aun está en etapa de desarrollo, por lo que aun si se convierte en todo un éxito su impacto no se empezará a sentir por al menos 2 años más.

Sin embargo, si tienen un tiempo libre, no estaría mal que le dieran una repasadita a los documentos técnicos de Dart, e incluso que prueben crear un par de programas en el lenguaje, o hasta sugerir cambios a Google en esta etapa abierta para comentarios. Este bien podría ser parte del futuro de la web...

Dart : Structured web programming