12 octubre 2011

Un brevísimo vistazo a Dart

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.

2 comentarios:

  1. Diego, tengo entendido que el esquema de módulos no está terminado y nada está escrito sobre piedra con lo cual se puede participar en el grupo de discusión y siempre que se tengan buenos argumentos se pueden hacer propuestas de mejoras. No voy a negar una pequeña desilusión respecto a las decisiones conservadoras, hay otras que suman.
    Respecto al snapshot, según lo que leí no es igual al Smalltalk en el sentido que no guarda estado, con lo que se parece más al de Strongtalk.

    ResponderBorrar
  2. Hernán!! Gracias por el comentario, si yo tambien tengo entendido que el sistema de módulos no esta terminado, ojalá se vengan con algo bueno :)

    Ya no me acuerdo donde había leído sobre los snapshots de Strongtalk (no se si fue en la lista de mails de strongtalk hace mucho tiempo o en algún paper), tengo entendido que no es exactamente igual que una imagen de smalltalk, si no que separaban código del estado del heap... voy a buscar donde lo leí, es muy probable que hagan algo parecido en Dart.

    Mas alla de que esperaba más... bueno ojala que tengan éxito, JavaScript me aburre un poco ;)

    Abrazo!!

    ResponderBorrar