Archive for the '16366' Category

Dart Programming Language: el matador de Javascript?

Tuesday, October 11th, 2011

Ayer, lunes, fue el día: Google corrió el velo y presentó en sociedad a su nuevo “hijo”: el lenguaje de programación Dart. Primero, algunos enlaces:

Mi anterior post: Dart Programming Language: the new kid on the block
La Keynote de anuncio en la Goto Conference

El post de ayer de Lars Bak
Dart: a language for structured web programming
http://googlecode.blogspot.com/2011/10/dart-language-for-structured-web.html

Vean la interesante presentación (historia, motivación para Dart, enlaces, relación con otros lenguajes y JVM): Presentación

El sitio oficial
http://www.dartlang.org

El código del proyecto
http://code.google.com/p/dart/

Clásico ejemplo: Hello World
http://www.dartlang.org/docs/getting-started/index.html

Especificación del lenguaje
http://www.dartlang.org/docs/spec/index.html

Gramática de Dart

Algunas noticias:

Google unveils Dart, its new programming language for building web applications
http://thenextweb.com/google/2011/10/10/google-unveils-dart-its-new-programming-language-for-building-web-applications/

Google starts to detail Dart
http://www.i-programmer.info/news/98-languages/3174-google-starts-to-detail-dart.html

Google debuts Dart, a JavaScript alternative
http://news.cnet.com/8301-30685_3-20117924-264/google-debuts-dart-a-javascript-alternative/

Bien, veamos algunos ejemplos, con comentarios cortos. El lenguaje parece simple, entendible. Vean el “Hello, World”:

main() { 
    var name = 'World'; 
    print('Hello, ${name}!');
} 

Los objetivos de diseño (tomados de Technical overview)

  • Create a structured yet flexible programming language for the web.
  • Make Dart feel familiar and natural to programmers and thus easy to learn.
  • Ensure that all Dart language constructs allow high performance and fast application startup.
  • Make Dart appropriate for the full range of devices on the web—including phones, tablets, laptops, and servers.
  • Provide tools that make Dart run fast across all major modern browsers.

A primera vista, sí, es simple, familiar (no es Objective-C ni APL ;-). Incluye clases y herencia. Tipos de datos son opcionales. Notablemente, puede ejecutarse de dos formas: en una máquina virtual nativa para Dart o traducido a Javascript. Leo en Lars Bak blog:

Dart code can be executed in two different ways: either on a native virtual machine or on top of a JavaScript engine by using a compiler that translates Dart code to JavaScript. This means you can write a web application in Dart and have it compiled and run on any modern browser. The Dart VM is not currently integrated in Chrome but we plan to explore this option.

Según the Technical overview, los problemas a atacar (para desarrolladores web):

  • Small scripts often evolve into large web applications with no apparent structure—they’re hard to debug and difficult to maintain. In addition, these monolithic apps can’t be split up so that different teams can work on them independently. It’s difficult to be productive when a web application gets large.
  • Scripting languages are popular because their lightweight nature makes it easy to write code quickly. Generally, the contracts with other parts of an application are conveyed in comments rather than in the language structure itself. As a result, it’s difficult for someone other than the author to read and maintain a particular piece of code.
  • With existing languages, the developer is forced to make a choice between static and dynamic languages. Traditional static languages require heavyweight toolchains and a coding style that can feel inflexible and overly constrained.
  • Developers have not been able to create homogeneous systems that encompass both client and server, except for a few cases such as Node.js and Google Web Toolkit (GWT).
  • Different languages and formats entail context switches that are cumbersome and add complexity to the coding process.

Bien que mencionen a Node.js. Lars Bok escribe:

Dart targets a wide range of development scenarios: from a one-person project without much structure to a large-scale project needing formal types in the code to state programmer intent. To support this wide range of projects, Dart has optional types; this means you can start coding without types and add them later as needed. We believe Dart will be great for writing large web applications.

The language comes with a set of basic libraries and tools for checking, compiling, and running Dart code, all of which will evolve further with your participation. We’ve made the language and preliminary tools available as open source on dartlang.org. Check out the site to give feedback, learn more about Dart, and participate in its development.

Un ejemplo con clase, interfaz, tipos:

interface Shape {
  num perimeter();
}
class Rectangle implements Shape {
  final num height, width; 
  Rectangle(num this.height, num this.width);  // Compact constructor syntax.
  num perimeter() => 2*height + 2*width;       // Short function syntax.
}
class Square extends Rectangle {
  Square(num size) : super(size, size);
}

Noten el tipo num: Dart soporta int y double como subtipos de num. Vean la Core Library (subject to change).

Podría usar el código de abajo en mi proyecto javascript AjDraw 😉

class Point {
  var x, y;
  Point(this.x, this.y);
  scale(factor) => new Point(x*factor, y*factor);
  distance() => Math.sqrt(x*x + y*y);
}
main() {
  var a = new Point(2,3).scale(10);
  print(a.distance());
}

Vean la notación => para las funciones (también pueden definirlas normalmente). ¿No hay código en los constructores? Sí, lo hay, pueden escrirlo. Pero en el ejemplo de arriba se ve la notación para asociar los parámetros recibidos con las variables del objeto. Notablemente, hay constructores con nombre:

class Point {
  num x, y;
  Point(this.x, this.y);
  Point.zero() : x = 0, y = 0;
  Point.polar(num theta, num radius) {
    x = Math.cos(theta) * radius;
    y = Math.sin(theta) * radius;
  }
}

Más detalles en Idiomatic Dart: vean setter, getters y campos, constructores factoría, declaración de funciones, el uso de =>, interpolación de string (todos se copian de AjSharp ;-), igualdad (hmm, tienen == y ===).

Update: Veo que tiene comunicación con Isolate, que permite escribir código que se ejecuta en paralelo. Pero no hay soporte DIRECTO de threads (es decir, no se puede lanzar un thread, la máquina virtual los maneja internamente). Vean el uso de port:

class Printer extends Isolate {
  main() {
    port.receive((message, replyTo) {
      if (message == null) port.close();
      else print(message);
    });
  }
}
main() {
  new Printer().spawn().then((port) {
    for (var message in ['Hello', 'from', 'other', 'isolate']) {
      port.send(message);  
    }
    port.send(null);
  });
}

Primeras impresiones: hmmm… es más claro que Javascript, pero habrá que ver si gana en momento, si se forma un ecosistema activo. Parece que está preparado para ejecutarse en varios browsers. Al menos puede compilarse a javascript, para ejecutarse en donde se acepte javascript. Y al parecer, es fácil de entender.

Mis enlaces:

http://www.delicious.com/ajlopez/dart

Es tiempo de escribir un intérprete/VM de Dart en C#, y compilarlo a C#, aprovechando CLR y las librerías .NET (me gustaría que accediera a esas librerías, como ahora hace AjSharp). ¿Será tiempo de un DartSharp? 😉 https://github.com/ajlopez/DartSharp

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez