Rust: Otro más para Concurrencia

Tras llevar ya la friolera de casi cuatro años con Erlang, y analizar el lenguaje Go, otro que se perfila con lenguaje para desarrollo de sistemas con alto grado de concurrencia es Rust.

Su desarrollador principal, Graydon Hoare, comenzó a crear este lenguaje en 2006 movido por la idea de crear un lenguaje que reuniese unas características concretas: práctico, multi-paradigma (imperativo o procedimental, funcional y orientado a objetos), concurrente (a través del modelo actor) y compilado; como parte de Mozilla, Graydon hizo partícipe del proyecto a su empresa en 2009, cuando tuvo algo funcional que poder mostrar.

Para Mozilla, Rust supone un lenguaje experimental pero con la base suficiente para poder comenzar a desarrollar elementos de su navegador, Firefox, probando así su soporte de concurrencia y su facilidad de programación. Según las respuestas de su FAQ, podemos ver que las misiones de este lenguaje corresponden a misiones que comparte con Erlang, como son la seguridad e integridad de la memoria, así como la concurrencia en sí. Por esto mismo no es de extrañar que se hayan basado de igual forma en el modelo actor para llevar a cabo este cometido.

La sintaxis del lenguaje

Uno de los atractivos de Rust, para programadores que provienen de lenguajes como C/C++, Java, PHP o lenguajes de llaves ( {} ), es que su sintaxis está basada, igualmente, en el uso de este símbolo para diferenciar los bloques. Se pueden definir tipos de datos,aunque también se soporta la inferencia de tipos. Un ejemplo:

use std;
 
fn main() {
    io::println("Hola mundo!");
}

Lo que más me llama la atención del lenguaje es que permite estructuras bastante complejas, como por ejemplo alt. Esta estructura, similar al switch de lenguajes como C/C++, Java o PHP (entre otros), permite evaluar una variable frente a una serie de posibilidades, pero en lugar de ser únicamente valores, se pueden agregar concordancias, como en Erlang. Por ejemplo:

fn angle(vec: (float, float)) -> float {
    alt vec {
        (0f, y) if y < 0f { 1.5 * float::consts::pi }
        (0f, y) { 0.5 * float::consts::pi }
        (x, y) { float::atan(y / x) }
    }
}

También, al igual que en Ruby y Erlang, el último valor que se retorna de cada expresión dentro de un bloque, es el valor que retorna el bloque. En este otro ejemplo, se ve que, además, se permite el subrayado (_) para el uso de comodines:

alt my_number {
  0       { io::println("zero"); }
  1 | 2   { io::println("one or two"); }
  3 to 10 { io::println("three to ten"); }
  _       { io::println("something else"); }
}

Esto presenta mucha más potencia que incluso el anterior, ya que no se basa solo en la concordancia, sino también en el cumplimiento de la expresión. En el primer caso (0), es igualdad básica, en el segundo caso (1 | 2) es una operación de o uno u otro, basada en un operador bastante conocido en lenguajes imperativos. La tercera es la que se presenta más interesante, ya que corresponde a la generación de un rango, pero de forma semántica para el lenguaje. Por último, al igual que en Erlang, el subrayado indica, como comodín que es, que cualquier cosa que no haya concordado con los parámetros anteriores, entra aquí.

¿Compilado?

Una de esas cosas que extrañan del lenguaje es que hayan decidido hacerlo compilado. El que el lenguaje sea compilado no le resta potencia, realmente, sino al contrario, es mucho mejor y óptimo, ya que se compila a lenguaje nativo de la máquina y se ejecuta de forma más eficiente.

Para los que estamos acostumbrados a tratar con lenguajes de scripting y lenguajes como Erlang, el hecho de que un programa se deba de detener para poder incluir una nueva versión del código, en ciertas ocasiones (que no todas) es una desfachatez. No obstante, es un mal menor y, ciertamente, si su uso será para ampliar las capacidades de los navegadores y la mejora en la codificación de los mismos, es un problema sin importancia.

Conclusiones

He mostrado muy poco del código en este primer acercamiento y, realmente, este lenguaje es un lenguaje muy diferente al resto de lenguajes vistos hasta el momento. La sintaxis es un poco más agradable para los que provienen de lenguajes de llaves, pero sigue siendo extraña por la cantidad de elementos nuevos que incluye. A mi modo de verlo, es como una fusión entre los mundos procedimiental (o imperativo) y funcional… aderezado con la programación orientada a objetos y la guinda de la concurrencia a través del modelo actor.

La única pega es que aún no ha sido empleado para entornos de producción (al menos que conste, y según su documentación oficial) y que está etiquetado, por ello mismo supongo, como experimental, pero al igual que otros lenguajes como Boo, es un lenguaje muy potente, que pone nuevos elementos sobre la mesa y de seguro que se empleará mucho en los años venideros y con grandes y buenos resultados.