Ceylon (lenguaje de programación)

Ceylon
Información sobre la plantilla
Parte de la familia Lenguaje de programación orientada a objetos.
Ceylon00.jpg
El propósito de Ceylon es mejorar deficiencias de Java, aunque a la vez pretende no ser excluyente de este.
CreadorGavin King
DesarrolladorRed Hat

Ceylon es un lenguaje de programación orientada a objetos, desarrollado por Red Hat. El lenguaje en sí mismo toma mucha de su sintaxis de Lenguaje de programación Java. Es de tipado estático y con inferencia de tipos que se ejecuta sobre la máquina virtual Java o también puede compilar a JavaScript. 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 de este; sino que también tengan código escrito en Java y en JavaScript.

Características

Ceylon, un lenguaje de tipo estático que mantiene algunos de los mejores dispositivos del lenguaje Java (y ejecuta en la JVM) pero mejora la legibilidad de ese lenguaje, la modularidad integrada y la incorporación de dispositivos de lenguaje funcional, como funciones de orden superior. Ceylon también incorpora dispositivos de C y Smalltalk. Así como el lenguaje Java, ese nuevo lenguaje enfoca la computación empresarial, pero también es flexible y útil en otras áreas.

Algunos llaman Ceylon de "matador de Java" (quizás debido a dudas acerca del futuro del lenguaje Java) pero en realidad Ceylon ejecuta en la JVM, por tanto, no es una sustitución, sino una ampliación de la tecnología Java. El uso de la JVM para soportar la ejecución de Ceylon es un modelo ideal, pues significa que Ceylon (como Java) es portátil a lo largo de una gran variedad de arquitecturas que actualmente soportan la JVM.

La mayoría de los lenguajes actuales desafían una categorización simple y, en lugar de eso, representan una variedad de estilos de programación. Ceylon no es diferente. Es un lenguaje de tipo estático (es decir, la verificación de tipo ocurre en el tiempo de compilación, diferentemente de los lenguajes de tipo dinámico como Lisp, en el cual la verificación de tipo se realiza en el tiempo de ejecución). Ceylon es un lenguaje orientado a objetos, como el lenguaje Java, y también soporta funciones de orden superior (lo que significa que las funciones pueden tomar funciones como entrada o salida) con un estilo de sintaxis típico de C. Las funciones de orden superior no son soportadas directamente en el lenguaje Java; por tanto, esa funcionalidad representa una diferencia exclusiva en los dos lenguajes.

Sin embargo, a veces las mejorías tienen más que ver con lo que un lenguaje elimina, y no con lo que añade. Ceylon simplifica y elimina elementos del idioma Java, sustituyéndolos por un esquema más simple. Un ejemplo de simplificación es la eliminación de las palabras clave public, protected y private. En lugar de eso, Ceylon simplemente incluye la anotación shared, que define los elementos de una clase que son visible externamente. Ceylon también elimina la capacidad de sobrecargar, pero proporciona algunas soluciones alternas para esa funcionalidad (como parámetros con valores predeterminados y secuenciados) con sintaxis más simple.

Incluye soporte de herencia, secuencias (matriz o construcción de lista), genéricos, argumentos nombrados, etc. Incluye dispositivos para gestión de tipo en tiempo de ejecución. El lenguaje se encuentra en desarrollo activo, por tanto, el conjunto final de dispositivos sigue abierto.

Objetivos de Ceylon

  • Ser fácil de aprender tanto para desarrolladores Java como C#.
  • Eliminar la verbosidad de Java pero manteniendo la legibilidad.
  • Mejorar el tipado estático de Java.
  • Proveer una expresión declarativa para eliminar dependencias con xml.
  • Apoyar y fomentar un estilo de programación más funcional.
  • Proveer soporte para meta-programación.
  • Proveer construcción modular.

Filosofía de diseño

Los principios de diseño de Ceylon no giran alrededor de capacidades tecnológicas (ej. concurrencia, garbage collection) sino de cómo funcionan los proyectos de software, especialmente software empresarial de gran escala. Aquí algunas de las características de este tipo de proyectos:

  • Son sistemas grandes, medidos en el orden de decenas de miles de líneas de código.
  • Los equipos de integrantes son grandes (más de 10 personas), diversos, distribuidos geográficamente y con alta rotación.
  • Una vez liberados a producción, los sistemas requieren un alto grado de mantenimiento para incorporar cambios y mejoras. Y lo más probable es que las personas encargadas de hacer esto sean un grupo distinto a quienes lo desarrollaron.

Es por ello que los principios de diseño fundamentales de Ceylon son:

  • Legilibilidad. El código en Ceylon busca ser altamente legible y fácil de entender por terceros. Ceylon no se enfoca puramente en tener una sintáxis ni breve ni elaborada, sino fácil de entender.
  • Predecibilidad. Cuando hay errores de compilación o ejecución, estos deben ser fáciles de entender y rastrear hacia su causa raíz.

Tipos de datos en Ceylon

Ceylon incorpora un conjunto tradicional de tipos que se implementan como clases ordinarias. Esos tipos son:

  • Natural. Enteros no firmados, incluyendo cero
  • Integer. Enteros firmados
  • Float. Punto flotante
  • Whole. Enteros firmados con precisión arbitraria
  • Decimal. Decimales con precisión y escala arbitrarias

En forma predeterminada, los tipos Natural, Integer y Float son de 64 bits, pero usted puede anotarlos con small para especificar la precisión de 32 bits.

Clase de Ceylon

Ya que Ceylon es un lenguaje orientada a objetos, escribe código con el concepto de clases. Una clase es un tipo en Ceylon que encapsula un conjunto de operaciones (llamadas métodos) y declara también una definición de cómo se inicializa el estado cuando se inicializa un objeto de la clase (el inicializador de clase, semejante al constructor).

Una clase simple ayudará a entender el enfoque de Ceylon. la clase se define con un valor opcional, lo que significa que el usuario puede proporcionarlo o no, y es denotado con el patrón Type?. En lugar de un constructor, el cuerpo de la clase contiene el inicializador de la clase. Ese código define la variable privada (nada es visible a no ser que sea anotado como compartido) y luego la lógica de inicialización. Se comienza verificando si la variable inicial existe. Si existe, se usa como el valor inicial para su conteo. Su primer método, anotado como shared y, por tanto, visible externamente desde la clase, define el incrementador. Cuando es llamado, ese método simplemente incrementa su contador.

Finalmente, se define un método getter que retorna el valor actual del contador para el usuario y un método setter que define el valor actual del contador con un valor proporcionado por el interlocutor. Note el uso de la palabra clave assign aquí para crear un atributo de variable para definir el valor del contador. Además de manipular los constructores en forma diferente (código integrado dentro de la clase), no hay deconstructor y no hay una forma de implementar varios constructores (sólo una de las diferencias respecto al lenguaje Java).

01    doc "Simple Counting Class"
02    class Counter( Natural? start ) {
03    
04      doc "Class Initializer"
05      variable Natural count := 0;
06      if (exists start) {
07        count := start;
09      }
10    
11      doc "The incrementer"
12      shared void increment() {
13        count++;
14      }
15    
16      doc "The getter"
17      shared Natural currentValue {
18        return count;
19      }
20
21      doc "The setter"
22      shared assign currentValue {
23        count := currentValue;
24      }
25
26    }

Con la clase simple definida, vamos a ver cómo usarla. A continuación se muestra un bloque de código que usa la clase Counter. Comienza por la instanciación de la clase del objeto cnt. Observe que no hay la palabra clave new en Ceylon. Con su nuevo objeto Counter definido, usted llama el método increment y luego emite el valor Counter usando su método getter. Observe que los operadores = y := son diferentes en Ceylon: se usa el especificador = sólo para valores inmutables, mientras que la asignación de variables es realizada con el operador :=

01    Counter cnt = Counter(1);
02    cnt.increment();
03    writeLine( c.currentValue );

Ceylon incentiva el uso de atributos inmutables siempre que posible. Eso significa que un objeto es inicializado con un valor y no reasignado.

Reconocimiento de debilidades de Java

Aunque Ceylon trata de aprovechar las fortalezas de Java, también reconoce sus debilidades y busca aprender de cómo hacen las cosas mejor otros lenguajes. Un ejemplo es el caso de la modularidad. La modularidad (o falta de) siempre ha sido uno de los puntos débiles de Java. ¿Por qué tenemos que instalar el JRE completo para ejecutar un "hola mundo"? Ceylon reconoce la belleza/simplicidad de usar gemas en Ruby, o paquetes en Node, e incorpora algo similar.

Aprovechamiento de herramientas

Ceylon es un lenguaje de tipado estático (statically typed). Este tipo de lenguajes típicamente requiere más líneas de código que los lenguajes dinámicos, y por lo tanto pueden ser considerados menos productivos. Esto puede ser cierto cuando programas todo manualmente desde un editor de texto, pero cuando te apoyas en ambientes de desarrollo moderno el usar tipado estático se convierte más en una ventaja que desventaja. Dado que las herramientas pueden entender mejor tu código, pueden ayudarte más con él: a generarlo, depurarlo y probarlo. Y esto se extiende también al uso de librerías y frameworks. Otra ventaja de usar tipado estático es poder detectar errores desde compilación, y no hasta ejecución.

Referencias