Oltre Java: Ceylon

Chi mi conosce sa bene il mio rapporto di amore-odio con Java. Amore perché Java è un linguaggio performante, di alto livello e soprattutto portabile. L’ho usato spesso, lo uso tutt’ora e ci ho fatto addirittura del game development. Odio perché, proprio perché ci ho combattuto tanto, ne conosco tutti i difetti, i limiti e le idiosincrasie. Java è sintatticamente prolisso e ha qualche problema di “vecchiaia” che andrebbe risolto (ed il confronto con C# è impietoso).

Giusto per fare un esempio in Java è abitudine leggere (o scrivere) codice raccapricciante quale

foo.setAttributeX(bar.getAttributeY());

che in C# si risolve con un semplice

foo.X = bar.Y;

Qualcuno considererà questa caratteristica (tecnicamente si parla di Accessor e Mutators) un puro vezzo sintattico, ma quando si lavora con decine e decine di classi vi posso assicurare che questo facilita di un fattore dieci la produttività e la manutenibilità del codice. Problemi come questo ed altri più “concreti” sono ciò che mi hanno spinto a passare al lato oscuro della forza ogni qualvolta mi è possibile.

In attesa che Java venga riformato (sperando nella rivoluzionaria (?) versione 8 e 9 del linguaggio) la comunità si è messa in moto in modo autonomo. Uno dei progetti a mio avviso più interessanti è senza dubbio Ceylon, di Red-Hat.

Ceylon è un linguaggio JVM-based, ovvero che viene compilato generando byte-code compatibile con la Java Virtual Machine. Questo garantisce due vantaggi: il linguaggio sfrutta la portabilità e le ottime performance della JVM ed è potenzialmente compatibile con le librerie Java esistenti.

Ceylon è un linguaggio molto interessante perché non solo alleggerisce Java da tutti gli inutili orpelli sintattici di cui è infestato ma aggiunge anche una sorta di dinamismo opzionale nella gestione delle variabili (tramite il tipo jolly value). Ma facciamo qualche esempio.

doc "The classic Hello World program"
by "Gavin"
see (goodbye)
throws (IOException)
void hello() {
    value message = "Hello,
                     World!"
;
    print(message.normalized);
}

Come non partire dal mitico “Hello, World!”? In realtà non è un “Hello, World!” semplice perché ci mostra due nuove caratteristiche del linguaggio. La prima è il modo con cui vengono documentati metodi e classi: niente commenti, ma una sintassi specifica che può essere letta dal generatore di documentazione integrato di Ceylon. La seconda è il tipo variabile value che può essere usato per simulare una certa dinamicità del linguaggio. Da notare però che nessuno ci obbliga ad usarlo: se siamo sicuri che la variabile message sia una stringa possiamo direttamente dichiararla come tale tramite String message.

Un’altra funzionalità molto utile è l’operatore di null check. Vediamolo in azione:

String shoutedGreeting = "HELLO, " +
                                name?.uppercased ? "WORLD";

In questo esempio troviamo i due operatori in azione. Il primo è l’operatore “?”. Considerando il codice precedente, tale operatore restituisce name.uppercased se e solo se quest’ultimo è diverso da null, altrimenti restituisce il valore che lo segue (in questo caso la stringa “WORLD”). L’altro operatore nell’esempio è “?.”. Quest’ultimo fa in modo che si acceda alla funzione/attributo uppercased se e solo se name è diverso da null. Questi due operatori ci risparmiano quindi tutta una serie di noiosi “if” annidati!

Le caratteristiche di Ceylon sono numerosissime e per maggiori informazioni vi rimando alla loro pagina ufficiale. Ceylon è ancora in fase di sviluppo ma è già possibile scaricare delle versioni preliminari!

Come se non bastasse è in progetto lo sviluppo di un backend che compili Ceylon in JavaScript rendendone possibile l’uso anche per lo sviluppo di applicazioni web.

Insomma, Ceylon è un progetto che vi consiglio caldamente di tenere d’occhio!

3 comments on “Oltre Java: Ceylon

  1. Scusa se preciso ma il tuo esempio iniziale è sbagliato.
    Se in Java scrivi:
    foo.setAttributeX(bar.getAttributeY());
    in C scrivi
    foo.attributeX = bar.attributeY;

    oppure viceversa

    Se in java scrivi
    foo.setX(bar.getY());
    in C scrivi
    foo.X = bar.Y;

    PS: anche io programmo in Java e ho un rapporto di amore-odio ma il primo prevale per fortuna 🙂

  2. Se sei così interessato alla portabilità del java e vuoi provare qualcosa di diverso mi sento in obbligo di consiglarti clojure, just to learn something no OOP

  3. Pingback: Visto nel Web – 22 « Ok, panico