sábado, 16 de febrero de 2013

Ceylon: comparativa con otros lenguajes


Como ya se ha escrito aqui en este sitio, Ceylon es un lenguaje de programación en desarrollo que pretende tomar lo bueno de Java y olvidarse de lo malo.

¿Cómo compilo/ejecuto un programa en Ceylon?

Antes de comenzar comenzar debes decargar la versión actual 0.4 (Analytical Engine). Compilar: ceylon compile source\programa.ceylon Ejecutar: ceylon run default

El clásico programa Hola mundo

En Ceylon. holamundo.ceylon
doc "Esto se usa para documentar el programa" 
by "el autor" 
void run(){ print("Hola mundo"); } 

Si todo sale bien debe imprimir:
"Hola mundo"

En Groovy. holamundo.groovy
println "Hola mundo" 

En Python. holamundo.py
print "Hola mundo" 

En Scala.
Holamundo.scala
object Holamundo{ def main(args: Array[String]){ println("Hola mundo"); } } 

En Java. Holamundo.java
public class Holamundo{ public static void main(String[] args){ System.out.println("Hola mundo"); } } 

En Clojure. holamundo.cjl
(printl "Hola mundo") 
En C. holamundo.c
#include "stdio.h" void main(){ printf("Hola mundo"); }

¿Cómo importar librerías/paquetes?

En Ceylon.
  import tuPaquete { Clase1, Clase2} import Clase {metodo1, metodo2} 

En Groovy. import tuPaquete import tuPaquete.Clase; 

En Python. from modulo import nombre from modulo import * 

En Scala. import tuPaquete._; import tuPaquete.Clase; 

En Java. import tuPaquete; import tupaquete.*; 

En Clojure. (import '(tuPaquete)) 
En C. #include "modulo.h"

¿Cómo introducir/mostrar datos?

He aqui unos ejemplos de como introducir y mostrar datos.

 En Ceylon. introducirDatos.ceylon
import java.util { Scanner }
import java.lang { System { sin=\Iin } } 

doc "método principal del programa" 
shared void run(){ 
 Scanner teclado=Scanner(sin); 
 //introducir nombre y edad 
 print("Tu nombre: "); 
 String nombre=teclado.nextLine(); 
 print("Tu edad: "); Integer edad=teclado.nextInt(); 
 //mostramos los datos 
 print("Hola " nombre " tienes " edad " años de edad");
 } 

En Groovy. introducirDatos.groovy
import java.util.Scanner 
 static main(args){ 
Scanner teclado = new Scanner(System.in) 
def nombre="" 
def edad=0 
println "Tu nombre: " 
nombre=teclado.nextLine() 
println "Tu edad: " 
edad=teclado.nextInt() 
 println "Hola ${nombre} tienes ${edad} años de edad" } 

En Python. holamundo.py nombre=raw_input("Tu nombre: ") edad=int(raw_input("Tu edad: ")) print "Hola %s tienes %d años de edad"%(nombre,edad) 

En Scala.
IntroduceDatos.scala

object IntroduceDatos{ 
 def main(args: Array[String]){ 
 var nombre=readLine("Tu nombre: "); 
 println("Tu edad"); var edad=readInt(); 
 println("Hola "+nombre+" tienes "+edad+" años de edad"); } } 

En Java. IntroduceDatos.java

import java.util.Scanner; 
public class IntroduceDatos{ 
 public static void main(String[] args){ 
 Scanner teclado=new Scanner(System.in); 
 String nombre=""; 
 int edad=0;
 System.out.println("Tu nombre: ");
 nombre=teclado.nextLine(); 
 System.out.println("Tu edad: "); 
 edad=teclado.nextInt(); 
 System.out.println("Hola " +nombre +" tienes " +edad+" años de edad");
 } } 

En Clojure. introduceDatos.cjl
;; introducir datos (import '(java.util Scanner)) (def scan (Scanner. *in*)) (println "Tu nombre: ") 
(def nombre (.nextLine scan)) (println "Tu edad: ")
 (def edad (.nextInt scan))
 (println "Hola") 
(println nombre) 
(println "Tienes ") 
(println edad) 
(println " años de edad") 

En C. introduceDatos.c
#include "stdio.h" void main(){ 
 char[10] nombre; 
 int edad=0; 
 printf("Tu nombre: "); 
 gets(nombre); 
 printf("Tu edad: "); scanf("%d",edad); printf("Hola %c tienes %d anyos de edad",nombre,edad); }

Puede parecer algo confuso, pero haber que pasa con las clases.

Crear clases

En este caso omito a C y a Clojure (usted disculpe).
En Ceylon. ejemploClase.ceylon
doc "defino una clase" 
class Clase(){ 
 shared void mensaje(){ 
 print("Hola desde un metodo"); } } 

doc "método principal del programa" 
void run(){ 
activa(Clase()); } 
 void activa(Clase clase){ clase.mensaje(); }


En Groovy. ejemploClase.groovy

class Clase{ def mensaje(){ 
 println "Hola desde un metodo" } } 
 static main(args){ 
 activa(new Clase()) } 

 def activa(clase){ clase.mensaje() } 

En Python. holamundo.py
class Clase: def mensaje(self): 
  print "Hola desde un metodo" 

  def activa(clase): clase.mensaje() 

  def main(): 
   activa(Clase()) 

 if __name__ == "__main__": 
   main() 

En Scala.
EjemploClase.scala

class Clase(){ 
 def mensaje(){ 
 println("Hola desde un metodo"); } } 
 object EjemploClase{ 
 def main(args: Array[String]){ 
 activa(new Clase()); } def activa(clase:Clase){ clase.mensaje(); } } 

En Java. EjemploClase.java

public class EjemploClase{ 
 public static void main(String[] args){ 
 new EjemploClase().activa(new Clase()); } 

 public void activa(Clase clase){ clase.mensaje(); } } 

 class Clase{ 
 public void mensaje(){ 
 System.out.println("Hola desde un metodo"); 
 } 
}

¿Por qué Ceylon, ... es mejor que Scala y/o Groovy?

Hacer una comparativa con otros lenguajes es válido, lo que es un poco "injusto" decidir si es o no mejor que X o Y lenguaje, ya que el lenguaje todavía esta en desarrollo. Algunos consideran que Groovy es mejor que Java, otros que Scala no es mejor si no mucho mejor que Java y Groovy juntos. Otros más que en RedHat debio sumarse a Scala y no crear un nuevo lenguaje como Ceylon.
No importa si crees que tu programa esta bien escrito ... siempre va ocurrir un error
Según yo algunos de los problemas que tienen lenguajes como Scala y Groovy son:
  1. Scala: es muy dificil aprender y cada vez se vuelve más complejo (no quiere decir que sea malo)
  2. Groovy: debes tener cuidado de no olvidar crear métodos, inicializar variables,etc.

1 comentario: