Ceylon: ¿verdadero avance o sólo otro lenguaje?

Programación orientada a objeto y funcional para el pueblo

La carretera de los lenguajes en la ciencia de la computación está llena de esqueletos de lo que debería ser el "próximo gran avance". Y aunque algunos lenguajes de segmentos específicos encuentren alguna adopción en la creación de scripts o aplicaciones especializadas, resulta difícil desplazar C (y sus derivados) y el lenguaje Java. Sin embargo, Ceylon de Red Hat parece ser una combinación interesante de dispositivos de lenguaje, a través de una sintaxis bien conocida al estilo de C, pero con soporte de la orientación a objetos y aspectos funcionales útiles, como también una énfasis en la brevedad. Explore Ceylon y descubra si ese futuro lenguaje de VM puede encontrar un lugar en el desarrollo de software empresarial.

M. Tim Jones, Platform Architect, Intel

author photo - M. Tim JonesM. Tim Jones es arquitecto de firmware integrado y el autor de Artificial Intelligence: A Systems Approach GNU/Linux Application Programming (ahora en su segunda edición), AI Application Programming (en su segunda edición) y de BSD Sockets Programming from a Multilanguage Perspective. Su experiencia en ingeniería va desde el desarrollo de kernels para vehículos espaciales geo-sincronizados hasta arquitectura de sistemas incorporados y desarrollo de protocolos de redes. Tim trabaja en Intel y vive en Longmont, Colorado.



08-08-2011

Linux y el código abierto normalmente están asociados a lo más avanzado en el diseño de lenguajes. Es posible que las herramientas disponibles que soportan el desarrollo de lenguajes o la apertura de la plataforma ocasionen el avance del diseño de idiomas. O quizás los lenguajes abiertos (como la familia GNU Compiler Collection, Ruby, Python y Perl) basadas en las tecnologías de código abierto sean excelentes porque incentivan y promueven la experimentación y el uso (sin mencionar que Red Hat es la compañía detrás de Ceylon). Sea cual sea la razón, los desarrolladores de Linux tienen acceso a una amplia variedad de lenguajes — de los lenguajes históricos menos utilizados a las ofertas más nuevas y de vanguardia.

Ceylon no es Java

"Ceylon no es Java, sino un nuevo lenguaje profundamente influenciado por Java, proyectado por personas que son fanáticos declarados de Java. Java no morirá en breve; así que nada lo está matando". — Gavin King

Sin embargo, en un mundo de C/C++, el lenguaje Java™ , Scala, Ruby, Python, Perl, Erlang, Lua, Scheme y muchos otros, ¿deberíamos preocuparnos por el anuncio de un nuevo lenguaje enfocado en el desarrollo de software empresarial orientado a los negocios? En muchos casos la respuesta es "no", pero vamos a explorar la futura oferta de lenguaje de Red Hat, llamada Ceylon, para ver si puede ocupar el puesto de los lenguajes más populares de la actualidad.

Presentando Ceylon

Ceylon es un nuevo proyecto de Red Hat liderado por Gavin King. King es el fundador del proyecto Hibernate, una solución de persistencia dentro del lenguaje Java. Aunque King sea un fanático de la tecnología Java — fue uno de los primeros lenguajes adecuados para el desarrollo en gran escala — se dice que él tuvo varias frustraciones con el lenguaje (incluso las complejidades del lenguaje, como genéricos, el SDK obscuro y proyectado apresuradamente, una sintaxis de anotación difícil de manejar, estructura de bloques rota, dependencia de XML, etc.).

Por tanto, King hizo la pregunta: ¿cómo se vería un lenguaje con las lecciones aprendidas a través de las ventajas y desventajas del lenguaje y SDK Java? Su respuesta es 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.


Dispositivos del lenguaje Ceylon

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. Ceylon 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 valor predeterminado y secuenciados) con sintaxis más simple.

Ceylon 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 (exploraremos un ejemplo de eso en la próxima sección). El lenguaje se encuentra en desarrollo activo — por tanto, el conjunto final de dispositivos sigue abierto.


Ceylon ilustrado

Aunque en la época en que ese artículo fue escrito no existía un compilador para uso público, la estructura del lenguaje Ceylon está definida, lo que permite el desarrollo de aplicaciones de muestra para explorar y razonar acerca de su uso y legibilidad. Esa sección examina algunas aplicaciones de muestra en Ceylon que ilustran esa estructura.

Hello World

Utilizaré el programa "Hello World" para ilustrar la creación de un programa simple para emitir una cadena de texto simple para el monitor. El ejemplo mostrado en el Listado 1 muestra un método de nivel superior llamado hello, que usa el método writeLine para emitir una cadena de caracteres para la salida estándar.

Listado 1. El programa Hello World en Ceylon
doc "Hello World Program"
by "Gavin King"
void hello() {
  writeLine( "Hello World." );
}

Observe también que la anotación usada para la documentación de API (semejante a herramientas como doxygen), que permite especificar el método y el autor (las anotaciones doc y by , respectivamente).

Tipos de 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, usted 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. El Listado 2 proporciona una clase simple para una clase de contador. La línea 2 define la clase 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. Usted 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, usted 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).

Listado 2. Clase simple en Ceylon
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 su clase simple definida, vamos a ver cómo usar la clase en Ceylon. El Listado 3 proporciona un bloque de código que usa su 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: usted usa el especificador = sólo para valores inmutables, mientras que la asignación de variables es realizada con el operador := .

Listado 3. Usando la clase Counter
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. Para especificar que un valor nombrado es mutable (puede ser cambiado después de la inicialización), se debe anotarlo con variable, como se muestra en el Listado 2 en la línea 5.

Un elemento final a explorar es una diferencia clave en las estructuras de control en Ceylon. Observe que, en muchos lenguajes, las llaves ({}) pueden ser omitidas después de una expresión condicional, como si un único statement aparece:

if (cnt > 10) statement();

Ceylon prohíbe esa sintaxis y exige que las llaves estén presentes. Eso significa que la muestra de código mostrada arriba se debe escribir en Ceylon como:

if (cnt > 100) { statement(); }

Ya que eso representa uno de los errores más comunes en C, la imposición de ese tipo de estilo adecuado es una grata añadidura.

Funciones de orden superior

Ceylon incluye el estilo funcional de programación llamado funciones de primer orden. Eso significa simplemente que las funciones son tratadas como objetos de primera clase y pueden ser usadas como parámetros para funciones y retornadas a partir de funciones. Tome el ejemplo de la presentación de King referente a la definición del método repeat (consulte el Listado 4). En ese caso, toma dos argumentos: un Natural referente al número de veces a repetir y un argumento de método para la función a llamar. Dentro del cuerpo del método repeat, usted simplemente crea un bucle for (al usar una operación de intervalo) y llama el método como fue pasado, como el parámetro funcional.

Listado 4. Funciones de orden superior en Ceylon
01    void repeat( Natural times, void hfunction() ) {
02      for (Natural n in 1..times) {
03        hfunction();
04      }
05    }

El uso de ese método es simple, como muestra la línea 7 del Listado 5. Como se muestra, se usa el nombre del método sin argumentos.

Listado 5. Usando funciones de orden superior en Ceylon
01    void sayhello() {
02      writeLine( "Hello World." );
03    }
04
05    ...
06
07      repeat( 10, sayhello );

A diferencia de otros lenguajes con soporte funcional, Ceylon no soporta funciones anónimas (funciones sin nombre que aparecen directamente en las expresiones). Incluye soporte de cierres (que son básicamente funciones que pueden hacer referencia al estado en otra función).

Restricción de tipo

Ceylon no incluye el operador instanceof que se encuentra en el lenguaje Java, ni la conversión de tipos que se puede encontrar en C. En lugar de eso, Ceylon implementa algo que se conoce como restricción de tipo, que se usa para probar y restringir el tipo de referencia de objeto en un paso. Considere el siguiente segmento de código del Listado 6. Este código utiliza una construcción (is ... ) especial para probar una referencia de objeto para un tipo dado. En cuanto el tipo es identificado, el método específico del tipo se utiliza. Esta construcción es similar a la construcción (exists ...) que usted pudo ver antes en el Listado 2 para parámetros opcionales.

Listado 6. Restricción de tipo en Ceylon
01    Object obj = <some object>;
02    
03    switch (obj)
04    
05      case (is Counter) {
06        obj.increment();
07      }
08      case (is ComplexCounter) {
09        obj.incrementBy(1);
10      }
11      else {
12        stream.writeLine("Unknown object");
13      }

Ceylon incluye otras construcciones similares definidas como (nonempty ...), que usted puede aplicar a secuencias (arrays o listas) para determinar si la secuencia no contiene elementos y por lo tanto podría no tener operaciones de secuencia aplicadas a ella.

Finalmente, note la sintaxis para los argumentos switch en Ceylon, que difieren tanto del lenguaje C como de Java. Donde esos dos lenguajes pueden estar propensos a errores, Ceylon fuerza una estructura de bloque en los casos y remueve el caso default en preferencia a un bloque else . Ceylon también asegura (al momento de la compilación) que el argumento switch contenga una lista exhaustiva de pruebas de instancia o, como mínimo, una cláusula else para proporcionar cubrimiento completo. El compilador verifica automáticamente estos argumentos switch y genera un error si la instancia no está cubierta.

Otras estructuras de control

Ceylon implementa los argumentos if...else tradicionales, como usted lo esperaría, y también implementa los recursos para manejo de excepciones del lenguaje Java (try, catch, finally). Ceylon también crea lo que se conoce como un bloque fail que se utiliza con bucles for para identificar cuando se rompen prematuramente. Considere el ejemplo mostrado en el Listado 7.

Listado 7. Ilustrando el bloque de falla de Ceylon
01    for (Instrument i in instruments) {
02      if (i.failing()) {
03        break;
04      }
05    }
06    fail {
07      // Take some action...
08    }

Este es un patrón de diseño común en los lenguajes C y Java y por lo tanto, una adición útil para Ceylon.


Futuro de Ceylon

Como dijo King, Ceylon es un esfuerzo comunitario y por lo tanto necesita que los ingenieros de software y probadores ayuden a diseñar, construir y validar el lenguaje y SDK. Este llamado podría alentar al suministro de retroalimentación por parte de usuario s de lenguaje Java para ayudar a soportar su migración desde ese lenguaje hacia Ceylon. King aún permanece algo callado sobre el estado actual de Ceylon, expresando únicamente que existe una especificación de lenguaje así como gramática ANTLR (Another Tool for Language Recognition).


Avanzando

Aunque algunos pueden desafiar la necesidad de un nuevo lenguaje, otra forma de ver los lenguajes es como un conjunto de herramientas que pueden utilizarse para resolver problemas. No todos los lenguajes son apropiados o ideales para un problema dado, pero ciertos lenguajes se prestan muy bien para dominios de solución específicos; por lo tanto, la disponibilidad de múltiples lenguajes es una bendición, no una maldición. Como Ceylon todavía está en desarrollo, se desconoce si encontrará un lugar el la clasificación de los lenguajes populares en uso actualmente. Pero el lenguaje captura suficientes recursos interesantes que será divertido explorar más cuando finalmente aparezca.

Recursos

Aprender

Obtener los productos y tecnologías

  • Evalúe productos de IBM de la forma que mejor se ajuste a usted: Descargue una prueba de producto, ensaye un producto en línea, use un producto en un entorno en nube, o pase algunas horas en el SOA Sandbox aprendiendo a implementar la Arquitectura Orientada a Servicios con eficiencia.

Comentar

  • Participe en la Comunidad My developerWorks. Conéctese con otros usuarios developerWorks mientras explora los blogs, foros, grupos y wikis dirigidos a desarrolladores.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Linux
ArticleID=750738
ArticleTitle=Ceylon: ¿verdadero avance o sólo otro lenguaje?
publish-date=08082011