Dos nuevos lenguajes de programación: Ceylon y Dart
La semana pasada en Devox se anunciaron las versiones estables de dos lenguajes de programación: Ceylon de Red Hat y Dart de Google. Ceylon es un nuevo lenguaje de tipado estático y con inferencia de tipos que se ejecuta sobre la máquina virtual Java. Este lenguaje ha sido creado por Gavin King, creador de Hibernate.
El propósito de Ceylon es mejorar deficiencias de Java, aunque a la vez pretende no ser excluyente con Java; según Gavin King, el espera que las aplicaciones Ceylon también tengan código escrito en Java y en JavaScript. Aquí tenéis un pequeño fragmento de código en Ceylon:
value list = { 0, "uno", 2, "tres", 4, "cinco" }; for (elem in list) { if (is Integer elem) { if (elem % 2 == 1) { print("Encontramos el número impar!"); break; } } } else { print("Sólamente hay números pares en la secuencia"); }
En Devox también se anunció el SDK 1.0 de Dart, un lenguaje creado por Google que pretende ser una versión mejorada de JavaScript. Dart es un lenguaje completamente orientado a objetos, basado en clases, con herencia simple y con tipado opcional (lo cual viene a significar que tiene tipado dinámico pero si el programador quiere puede especificar tipos). Dart puede compilarse a JavaScript, y por tanto puede ser ejecutado por esta ruta en cualquier navegador web moderno. Además, puede ejecutarse en su propia máquina virtual, aunque ahora mismo sólo Chrome tiene soporte para ejecutarlo de este modo.
Una crítica que se le puede hacer a Dart es que trata de resolver un problema que quizá ya no exista; trata de mejorar JavaScript, pero la realidad es que a día de hoy muy poca gente escribe directamente código en este lenguaje, sino que se suelen usar librerías del estilo de jQuery que mejoran bastante la experiencia del desarrollador. Aquí tenéis un ejemplo de una clase en Dart:
class Point { Point(this.x, this.y); distanceTo(Point other) { var dx = x - other.x; var dy = y - other.y; return Math.sqrt(dx * dx + dy * dy); } var x, y; }
Y aquí un ejemplo de una interfaz:
interface Shape { num perimeter(); } class Rectangle implements Shape { final num height, width; Rectangle(num this.height, num this.width); num perimeter() => 2*height + 2*width; }
Reader Comments (4)
Son lenguajes interesantes, como también lo son Kotlin y Xtend. Pero me parece bastante lamentable que en todos ellos se deje de lado el soporte al diseño por contrato. Se empieza de cero a diseñar un nuevo lenguaje para la JVM y se pasa olímpicamente de esa característica.
Para Java hace relativamente poco apareció Cofoja pero no está actualizado. Para Groovy existe GContracts pero me parece que ocurre lo mismo.
En .NET, sin embargo, empezaron con Spec# y de ahí derivaron a CodeContracts, que es perfectamente usable en VisualStudio.
El tema del diseño por contrato era muy interesante, de hecho lo es, pero para mí ha quedado un poco relegado por unos buenos test unitarios y, en lenguajes como escala, con la validación de propiedades, con ScalaCheck, para validación de precondiciones e invariantes.
De todas formas es algo que sigo utilizando en mis diseños.
Por otro lado, el diseño por contrato es algo que se podría implementar también con anotaciones, y, de hecho ya hubo una iniciativa hace mucho tiempo, con JContractor, http://jpmoresmau.blogspot.be/2006/11/design-by-contract-in-java-using.html . Aunque le hace falta una buena puesta al día.
Saludos
Cuando en los 80 Meyer criticaba a C++ porque no tenía diseño por contratos y Eiffel sí (entre otras cosas), Stroustroup decía "hay dos tipos de lenguaje de programación, los que todo el mundo critica y los que nadie usa". Hoy Gosling podría decir lo mismo de Darty y Ceylon. Je, je, je...
El ejemplo de código Ceylon es un poco largo, nosotros lo escribiríamos mejor así:
value list = { 0, "uno", 2, "tres", 4, "cinco" };
if (any { for (elem in list) if (is Integer elem) elem % 2 == 1 }) {
print("Encontramos el número impar!");
} else {
print("Sólamente hay números pares en la secuencia");
}