El lunes pasado - 10/10/2011- Google
presentó un nuevo lenguaje de programación llamado
Dart.
La presentación realizada por
Gilad Bracha y
Lars Bak había sido anunciada hace unos meses atrás.
Dado que estos dos personajes hicieron cosas interesantes y tienen un
pasado común en Smalltalk, el anuncio me genero mucha expectativa.
Después de leer un poco el sitio (por ahora solo el código fuente esta disponible para el publico general), mis expectativas decayeron: al menos en la superficie Dart no es muy distinto a lo que vienen produciendo otros lenguajes como Scala o Groovy.
Debido al trabajo de Gilad Bracha en
Newspeak, y a que JavaScript es un lenguaje basado en prototipos, yo esperaba un lenguaje estilo Newspeak pero con sintaxis ala JavaScript. (En
este video G. Bracha habla justamente que Dart es un lenguaje más "conservador" en comparación con Newspeak)
Tampoco voy a ser tan negativo, el gran punto a favor que tiene Dart es que si Google decide promocionarlo puede hacerlo a través the Chrome y Android. Y si logra que Mozilla lo adopte puede lograr algo similar a lo que ocurrió con HTML5: que IE tambien lo adopte como standard.
Lo más interesante es que si las herramientas que provee el lenguaje son las adecuadas e incursionan en herramientas del lado servidor, pueden lograr un lenguaje de programación ubicuo. Hoy en día JavaScript con
node.js lo es, aunque las limitaciones del lenguaje respecto del manejo de módulos y la disponibilidad de herramientas no lo hacen para mi una opción fuerte del lado servidor.
Según lo que pude leer del material disponible, Dart es todavía un "work in-progress", y no se definieron ciertas cosas importantes sobre como va a ser el manejo de modularidad. En resumen algunas características de este lenguaje son:
- Se va a poder utilizar en el browser, directamente si es Chrome (al menos en el futuro), o compilando JavaScript si no (como CoffeScript).
- Es un lenguaje con clasificación con tipado opcional (como Strongtalk o Groovy).
- Al igual que en muchos lenguajes dinámicos, se pueden re-definir operadores y tiene algo de syntax sugar como strings con variables del estilo "Hola $mundo"
- Tiene generics y están reificados (los generics pueden ser opcionales como en Java y la información se mantiene "en runtime" como en C#).
Hasta ahora nada mal pero tampoco demasiado novedoso, lo que si destaco es:
- Tiene un modelo de actores (como Erlang), llamado Isolates. Me parece una forma buena de encarar concurrencia.
- Un programa compilado se puede guardar en un "snapshot" que es como una imagen de Smalltalk (de hecho esta idea viene de Strongtalk, donde creo tambien se llama snapshot). Eso es interesante por que si logran agregar el soporte adecuado en los browers, quizás logren hacer lo que Java no pudo lograr: un lenguaje con bytecode multiplataforma que funcione directamente en todos los browsers.
Lo que no me gusto de lo que leí hasta ahora es:
- No vi absolutamente nada relacionado al manejo de "módulos" (de hecho ni siquiera existe el concepto de namespace o paquete), eso puede ser bueno: Gilad Bracha escribió artículos muy interesantes sobre este tema en su blog, asi que puede significar que todavía están evaluando la mejor forma de hacerlo. O bien puede ser malo, en los ejemplos vi unos #import que funcionan como un include C que huelen muy mal.
- Factories e interfaces. No sé si poner esto entre las cosas buenas o malas. Se me ocurren varios casos donde puede ser bueno: refactoring de una clase concreta a una interfaz, usos de implementaciones comunes por default (ej. en Java: HashSet o ArrayList). Sin embargo tienen un lado malo: funciona como un mecanismo rudimentario para manejo de dependencias estilo "service locator", algo que en Java demostró ser muy problemático.
- Uso de underscore para indicar que algo es privado (Lang Spec sección 3.2). Es un shortcut aceptable para las variables de instancia, pero para los métodos me parece demasiado que quienes lo invocan sepan si lo que usan es privado o publico.
- Las librerías "core" son una copia de las de Java, hubiese estado bueno que cambien algunas cosas como por ejemplo tener listas mutables e inmutables (ala Scala).
- No vi que los generics se puedan acotar, por ejemplo HashSet<E> no es un HashSet<E extends Hashable> (Object en Dart no implementa hashCode, hay una interfaz Hashable).
En fin veremos que depara el futuro, es difícil hacer predicciones en estas cosas, pero creo que no es necesario que el lenguaje sea bueno para que tenga éxito si no que la plataforma lo sea. Si Google decide usar Dart para hacer aplicaciones Android nativas, y programar en el web browser, entonces puede que se convierta en el sucesor de Java. Sin embargo no creo que eso pase, desde afuera parece que la estrategia de Google es apostar a muchas cosas para ver que queda.