Vala: Alternativa a C++ basada en C

Nota: artículo largo (1100 palabras, ~5 min).

No voy a empezar una guerra santa sobre lenguajes de programación. Uno debe utilizar la herramienta que mejor se acomode al problema o situación. Para mi uno de los mejores lenguajes siempre ha sido C, pero desde que uso lenguajes orientados a objeto he dejado un poco de lado la programación en este lenguaje. Y como muchos, no disfruto de C++. Pues para nosotros es que existe un nuevo lenguaje: VALA. Tiene las ventaja de la orientación a objetos junto con el desempeño de C.

Aprende más sobre este lenguaje después del salto.

Porqué VALA?

Vala es fue diseñado para todos aquellos programadores que quieren desarrollar para la plataforma GNOME pero por una u otra razón no pueden usar lenguajes de Alto nivel como Python, Java o C#. La desventaja de estos últimos es que todas las librerías creadas usando esos lenguajes no pueden ser usadas por el resto de los lenguajes; por ejemplo, una librería de Python no puede ser fácilmente usada por un programa en C.

La ventaja de Vala es que puedes programar con toda la flexibilidad de un lenguaje orientado a objetos y luego el compilador convertirá tus clases y tus librerías a código C estándar. Así, una librería escrita en Vala puede ser usada fácilmente en Python, Java, C#.

En el resto del artículo vemos algunas de las características del lenguaje, pero no todas. Para ver más en profundidad la sintaxis y ejemplos, pueden ir a leer el tutorial de VALA (ingles)

Como conseguirlo

Si tienes Ubuntu, es tan sencillo como hacer:

sudo apt-get install valac

desde un terminal. Si usas otro sistema, la sintaxis debe ser muy similar, por ejemplo, yum install valac para sistemas fedora.

Despues de esto tendrás instalado el compilador de Vala y las librerías estandar.

Ya lo tengo... ahora un ejemplo

Por supuesto, Hola Mundo

using GLib;

public class Test.HelloObject : GLib.Object {

   public static void main(string[] args) {

   stdout.printf("Hello, World");
   }
}

La sintaxis es bastante parecida a la de C#

using GLib es el equivalente a import o include de otros lenguajes. Así hemos importando la librería GLib para usarla. En realidad la primera línea es irrelevante pues GLib se importará por default.

En el ejemplo creamos una nueva Clase llamada HelloObject que hereda del objecto Object (perteneciente a GLib). La función main es básicamente la misma de lenguajes como Java o C#, una función estática que será llamada cuando al iniciar el programa. Stdout es un objeto que simboliza la salida estándar.

Propiedades de un objeto

En los lenguajes comunes los metodos de obtención y modificación son métodos normales. Vala provee varias maneras de definir las propiedades de un objeto.

Así dejamos que Vala decida como manejar esta variable. Además definimos que puede ser leído y modificado.

public int prop_1 { get; set; }

En esta, hemos hecho funciones especiales que modifican la propiedad interna (privada) _prop_2

private int _prop_2;
public int prop_2 {
   get {
       return this._prop_2;
   }
   set {
       this._prop_2 = value;
   }
}

Este ejemplo es básicamente igual al primero pero podemos asignar un valor por defecto a la propiedad. Además, el método set es privado a la clase.

public int prop_3 { get; private set; default = 42; }

Funciones anónimas

Las funciones anónimas nos permiten crear trozos de código para manipularlos luego sin tener que definirlos formalmente. En este ejemplo

var f = a => { stdout.printf("%d\n", a); }

la variable f contendrá una función que recibe un parámetro (a) y lo imprime por la pantalla.

Funciones delegadas

Las funciones delegadas son un tipo de dato que nos permitirá pasar código por parámetro. Veamos un pequeño ejemplo

delegate void DelegateType(int a);

void f2(DelegateType d, int a) {
    d(a);
}

f2(a => { stdout.printf("%d\n", a); }, 5);

Lo primero que hicimos fue crear un tipo delegado (DelegateType) que recibe como parámetro un entero (a). La función "f2" recibe como parámetros un objeto de tipo DelegateType (d) y un entero. Luego ejecuta "d" usando a como parámetro. Para el que sabe C, sabe que por detrás solo son punteros a funciones, pero es una sintaxis muy limpia y sin tanto paréntesis y punteros a void.

Compilando y convirtiendo a C

Para compilar tus programas, el compilador es "valac", el cual puede generar un ejecutable directamente o generar el código en c. Para compilar un ejemplo llamado "holamundo.vala" solo debes ejecutar

valac -o holamundo holamundo.vala

Y te dejará un ejecutable llamado holamundo. Para obtener el código C sólo debes usar la opción -C y dejara en el directorio los archivos .c y .h

Otras características avanzadas

Vala tiene muchas otras características que uno espera de lenguajes orientados a objetos:

  • interfaces: Puedes crear muchas clases que implementen la misma interfaz. Con esto aseguras que un conjunto de clases provean los mismos métodos
  • constructores: Un clase en vala sólo puede tener un constructor, pero existen técnicas para modificar la cantidad de parámetros que puede recibir
  • herencia: la herencia se comporta de manera similar a otros lenguajes pero existen un par de excepciones en donde el orden de ejecución no es el normal. Les recomiendo leer el manual con atención
  • polimorfismo: el clásico polimorfismo.
  • genericos: Permite crear clases especializadas para manejar tipos de datos, como listas de algún objeto en particular.

Tiene además incorporado el sistema de "señales" de GTK mediante el cual un trozo de código genera una señal y otro trozo es capaz de reaccionar a esta señal y ejecutarse. Este sistema recuerda en algún sentido a los event listener de Java o los eventos de C++.

Tiene un sistema de errores basado en excepciones pero utilizando espacios de nombres. Vala presenta una mejora pues su sistema de errores permite una mejor separación en los dominios de los errores, en otras palabras, agrupa mejor los distintos tipos de error según categorías.

Vala posee además algo que otros lenguajes dan por sentado pero que C no posee: un sistema estándar de tipos de datos abstractos. Libgee, incorporado con vala, da acceso a listas, tablas de hash, mapas y sets. Algo muy similar a java.util en Java pero que C++ no posee (al menos que yo sepa)

Y de aquí a donde?

Vala todavía está en desarrollo. Puede que algunas cosas cambien mucho antes de la versión 1.0, pero ya es un lenguaje que funciona bastante bien y algunos desarrolladores de Gnome y GTK están empezando a usarlo como lenguaje principal debido a lo fácil que es integrarlo con otros programas escritos en C.

Si estás interesado en este lenguaje, te recomiendo que revises el tutorial y hagas algunos ejemplos.

Tu voto: None Promedio: 5 (un voto)

Comentarios

Foto de rodolfoy

Titulo inapropiado

El título de este pinche artículo está mal, es inapropiado. Vala es una alternativa a C#, no a C++. Es más parecido a C# y Java que a otros lenguajes, se caracteriza por que no usa una máquina virtual y puede ser compilado en Win/Unix/Linux/etc.

Foto de .teri

Fuera de Gnome y GTK

Me pregunto si se podrá usar fuera de Gnome y sin GTK. Tengo entendido que usa gobject para los objetos.

Foto de Alguien Que No Quiere Dar Su Nombre

que es bala

que es bala

Foto de Zapatero

Bala se escribe con uve!

Bala es lo que dispara la pistola...

Foto de Elchavaldelas160

C++ si tiene tipos de datos abstractos en su biblioteca

De hecho tiene una maravillosa STL con TAD's y algoritmos para operar con ellos, brindando un framework excelente con el que desarrollar proyectos de cualquier escala. Es por eso por lo que se utiliza tanto. Algunas implementaciones incluyen tablas hash, pero realmente eso no es tan importante puesto que el lenguaje te proporciona las herramientas para construirlas eficientemente y genéricamente.

Igualmente C++ puede ser también compilado a C (así es como se hacía antes), de modo que no entiendo los problemas que genera. Por otra parte creo que a D le falta mucho para llegar a ser una alternativa adecuada.

Vala parece un lenguaje muy adecuado para el desarrollo de interfaces basadas en GTK y para gente con inclinaciones sintácticas heredadas de C (C++, Java, C#), pero ¿tiene algún ámbito de aplicación más aparte de éste? ¿Es estándar?

Espero que alguien tenga la amabilidad de contestarme porque me gustaría conocer más pros y contras.

Un saludo

Foto de tek

C++ si soporta colecciones

Al igual que Java, C++ soporta para colecciones. Comparto el entusiasmo por un lenguaje tan potente como C sin la complejidad innecesaria de C++, tal como D o Vala.

Foto de ChaTo

C es el nuevo assembler

Esto confirma lo que varios han dicho antes: C es el nuevo assembler. En vez de compilar directamente a lenguaje de máquina para un procesador, la compilación se hace en dos pasos: uno a C y otro a lenguaje de máquina, con compiladores optimizados para cada una de estas tareas.

ChaTo

Enviar un comentario

El contenido de este campo se mantiene como privado y no se muestra públicamente.
  • HTML permitido: <a> <em> <strong> <pre> <ul> <ol> <li> <img> <blockquote> <br> <div> <h2> <h3> <hr> <object> <embed>
  • Saltos automáticos de líneas y de párrafos.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.

Más información sobre opciones de formato