You are on page 1of 12

Aprendiendo Rust por primera vez

26 noviembre, 2015 3:25 por jorgev


desarrollo labs rust

Este artculo es una traduccin del original publicado en el blog de Mozilla Hacks.

Traduccin por Gerardo Cruz.


Rust es un nuevo lenguaje de programacin que se centra en el rendimiento, la
paralelizacin, y la seguridad de la memoria. Con la construccin de un lenguaje a partir
de cero y la incorporacin de elementos de diseo del lenguaje de programacin
moderno, los creadores de Rust evitaron una gran cantidad de legado (requisitos de
compatibilidad con versiones anteriores) que los lenguajes tradicionales tienen que tratar.
En cambio, Rust es capaz de fusionar la sintaxis expresiva y flexibilidad de lenguajes de
alto nivel con el control sin precedentes y el rendimiento de un lenguaje de bajo nivel.
La eleccin de un lenguaje de programacin por lo general implica ventajas y desventajas.
Aunque la mayora de los lenguajes modernos de alto nivel proporcionan herramientas
para la seguridad de concurrencia y la seguridad de la memoria, lo hacen con una
sobrecarga aadida (por ejemplo, mediante el uso de un GC (recolector de basura)), y
tienden a carecer de rendimiento y control refinado.
Para hacer frente a estas limitaciones, se tiene que recurrir a lenguajes de bajo nivel. Sin
las redes de seguridad de la mayora de los lenguajes de alto nivel esto puede ser frgil y
propenso a errores. Uno tiene repentinamente para hacer frente a la gestin manual de
memoria, asignacin de recursos, los punteros colgantes, etc. Crear software que puede
aprovechar el creciente nmero de ncleos presentes en los dispositivos de hoy en da es
difcil asegurndose de que dicho cdigo funciona correctamente es an ms difcil.
Entonces, cmo incorpora Rust lo mejor de ambos mundos en un solo idioma? Eso es lo
que te mostraremos en este artculo. Rust 1.0.0 estable acaba de ser lanzado. El idioma
ya tiene una comunidad vibrante, un creciente ecosistema de cajas (bibliotecas) en su
gestor de paquetes, y desarrolladores que aprovechan sus capacidades en una variedad
de proyectos. Incluso si nunca has tocado un lenguaje de bajo nivel, ste es el momento
perfecto para aprender!

T-shirts de Rust que celebran el lanzamiento 1.0


Los casos de uso para Rust hoy

As que para los programadores de sistemas Rust parece una gran opcin, pero qu hay
de aquellos que no estn familiarizados con lenguajes de bajo nivel? Tal vez la ltima vez
que escuchaste sobre C y asignacin de pila / heap fue hace 10 aos en el primer
curso de ciencias de la computacin (o tal vez nunca). Rust ofrece el rendimiento
normalmente visto slo en los idiomas de sistemas de bajo nivel pero la mayora de las
veces, sin duda se siente como un lenguaje de alto nivel! Aqu hay algunos ejemplos de
cmo puedes aprovechar Rust ahora en aplicaciones prcticas:
Quiero hackear en hardware / aplicaciones de Internet de las cosas
La era Internet de las cosas (IoT) y la expansin del movimiento maker permite una
democratizacin real de proyectos de hardware. Ya se trate de la Raspberry Pi, Arduino, o
uno de los jvenes titanes como el BeagleBone o Tessel, puedes elegir entre una gran
cantidad de lenguajes para codificar tus proyectos de hardware, incluyendo Python o
JavaScript.
Hay veces, sin embargo, cuando el rendimiento que ofrecen estos lenguajes no es
adecuado. En otras ocasiones, el microcontrolador de hardware que pretendemos
soportar no es adecuado para los ambientes de ejecucin que estos lenguajes requieren:
chips lentos con reservas de memoria pequeas y aplicaciones de ultra bajo consumo de
energa todava requieren un lenguaje ms cerca al metal. Tradicionalmente este lenguaje
ha sido C pero como ya habrn adivinado, Rust es el nuevo chico en el bloque.
Rust es compatible con una amplia variedad de plataformas exticas. Mientras que algo
de esto es todava experimental, el soporte incluye hardware ARM genrico, el tablero de
desarrollo TIVA de Texas Instruments, e incluso el Raspberry Pi. Algunas de las nuevas
tablas de IoT como el Tessel 2, vienen con soporte oficial para Rust!
Estoy operando aplicaciones de computacin de alto rendimiento que escalan a mltiples
ncleos
Los estudios sugieren que Rust ya es bueno para HPC (computacin de alto
rendimiento). Incluso no tienes que reescribir toda tu aplicacin en Rust: su
flexible interfaz para funciones forneas (FFI) proporciona enlaces de C eficientes que te
permiten exponer y llamar cdigo Rust sin ninguna sobrecarga notable. Esto te permite
volver a escribir tu aplicacin mdulo por mdulo, pasando lentamente hacia una mejor
experiencia del desarrollador que se traducir en rendimiento equivalente al cdigo
antiguo o mejor. Tambin conseguirn una base de cdigo ms fcil de mantener con
menos errores, que escala mejor en un elevado nmero de ncleos.
Simplemente necesito algo rpido!
Rust es ideal para reescribir partes sensibles al rendimiento de tu aplicacin. Se conecta
bien con otros lenguajes a travs de FFI y tiene un pequeo tiempo de ejecucin que
compite con C y C ++ en la mayora de los casos, incluso cuando los recursos son
limitados.
A pesar de la naturaleza de trabajo en progreso del lenguaje, ya hay aplicaciones crticas
de negocio, en vivo en produccin que han estado haciendo un buen uso de Rust desde
hace algn tiempo: el startup de Yehuda Katz, Skylight, utiliza cdigo Rust de alto
rendimiento incrustado en un gem de Ruby para procesamiento de datos. La versin 1.0.0
estable es tambin un hito importante en que no deberan ocurrir cambios de ruptura de
compatibilidad a partir de ahora. Eso hace que sea seguro recomendar Rust incluso para
las aplicaciones ms exigentes y robustas!
Ve a Yehuda Katz y Tom Dale hablar de los fundamentos de la programacin Rust y cmo
utilizaron Rust con Ruby en su aplicacin.
Empezando con Rust
Hay muchos tutoriales que cubren Rust en general, as como los aspectos especficos del
lenguaje. Por ejemplo, el blog de Rust tiene grandes artculos sobre diversos aspectos de
desarrollo de aplicaciones Rust. Tambin hay excelentes charlas introductorias como la
charla de Aaron Turon en la Universidad de Stanford. Explica los principales conceptos y
motivaciones detrs de Rust muy bien, y la charla sirve el aperitivo perfecto para empezar
tu recorrido:
Charlas y tutoriales no son un sustituto para la escritura de cdigo, no? Rust tiene todo
cubierto en ese sentido, tambin! El libro de Rust fue concebido para ayudarte a empezar
desde la instalacin, al primer Hello World, hasta proporcionar una referencia detallada
de todas las caractersticas lingsticas esenciales.
Otro recurso digno de mencionar es Rust by Example, que te gua a travs de las
caractersticas clave de Rust, desde lo ms bsico a los poderes arcanos de rasgos
(traits), macros y la FFI. Este recurso ofrece ejemplos invaluables, editables en vivo en el
navegador para todos los artculos. Incluso no tienes que descargar y compilar Rust, ya
que se puede probar y editar todos estos ejemplos desde la comodidad de tu sof de la
sala, tal y como son. Tambin est el Rust Playpen para exactamente el mismo propsito.
No es que la descarga e instalacin Rust es mucho problema, de todos modos. Dirgete a
la pgina de inicio y descarga el binario / instalador apropiado all. Las descargas
contienen todas las herramientas que necesitas para empezar (como el
compilador rustc, o el gestor de paquetes cargo), y estn disponibles pre-construidos
para todas las plataformas (Windows, Linux y OSX).
Qu es entonces, lo que hace Rust tan nico, tan diferente?
El camino Rust

Podra decirse que es el modelo de propiedad nico de Rust el que le permite brillar de
verdad la eliminacin de clases enteras de errores relacionados con administracin de
threads y la gestin de memoria, mientras que facilita el desarrollo y la depuracin.
Tambin es muy valioso para mantener un ambiente de ejecucin mnimo y la salida del
compilador liviana y con buen desempeo.
El modelo de propiedad
El principio bsico del modelo de propiedad de Rust es que cada recurso puede
pertenecer a un y slo un dueo. Un recurso puede ser cualquier cosa de un
segmento de memoria a un socket de red abierto a algo ms abstracto como un bloqueo
de exclusin mutua. El propietario de dicho recurso es responsable de usar, posiblemente
prestar el recurso (a otros usuarios), y finalmente limpiarlo.
Todo esto sucede de forma automtica, con la ayuda de rangos (scopes) y asignaciones
(bindings): las asignaciones son propietarias de valores o los piden prestados, y persisten
hasta el final de su rango. Cuando las asignaciones se salen de su rango, o bien dan su
recurso prestado de vuelta, o lo eliminan si eran propietarias.
Lo que es an mejor es que los controles necesarios para que el modelo de propiedad
funcione son ejecutados y aplicados por el compilador Rust y el revisor de
prstamos durante la compilacin, que a su vez se traduce en diversos beneficios.
Abstracciones de cero costo
Ya que el correcto funcionamiento de un programa se afirma en tiempo de compilacin, el
cdigo que compila en general puede considerarse seguro en cuanto a los tipos ms
comunes de errores de memoria y de concurrencia (como defectos use-after-
free o carreras de datos). Esto es posible porque Rust se queja en tiempo de compilacin
si el programador intenta hacer algo que viola los principios anteriores, que a su vez
ayuda a mantener el ambiente de ejecucin al mnimo.
Al delegar estos controles al tiempo de compilacin, no hay necesidad de realizarlos en
tiempo de ejecucin (el cdigo ya es seguro), y no hay sobrecarga de tiempo de
ejecucin. En el caso de las asignaciones de memoria, no hay necesidad de un recolector
de basura de tiempo de ejecucin, tampoco. Esto construcciones avanzadas del
lenguaje con poca o ninguna sobrecarga de tiempo de ejecucin es la idea bsica de
abstracciones de cero costo.
Aunque una explicacin detallada del modelo de propiedad se encuentra fuera del
alcance de este artculo, el Libro de Rust (vinculado arriba) y varias charlas y artculos
sobresalen en la explicacin de sus principios. Los principios de apropiacin y el revisor
de prstamos son esenciales para la comprensin de Rust, y son claves para otros
aspectos de gran alcance del lenguaje, al igual que su manejo de la concurrencia y
paralelismo.
Dos pjaros, una construccin del lenguaje
El estado mutable compartido es la raz de todos los males. La mayora de los lenguajes
tratan de hacer frente a este problema a travs de la parte mutable, pero Rust trata con l
mediante la resolucin de la parte compartido.
El libro Rust

Aparte de la seguridad de la memoria, paralelismo y simultaneidad son el segundo foco


ms importante de la filosofa de Rust. Puede parecer sorprendente, pero el sistema de
propiedad (junto con algunos rasgos tiles) tambin proporciona potentes herramientas
para manejo de threads, sincronizacin y acceso a datos concurrente.
Al intentar algunas de las primitivas incorporadas de concurrencia y empezar a cavar ms
profundo en el lenguaje, puede ser una sorpresa que esas primitivas son proporcionados
por la biblioteca estndar, en lugar de ser parte del propio ncleo del lenguaje. Por lo
tanto, dar con nuevas formas de hacer la programacin concurrente est en las manos de
autores de bibliotecas en lugar de estar predeterminados en Rust, limitados por los
planes de futuro de los creadores del lenguaje.
Rendimiento o expresividad? Elige los dos!
Gracias a su sistema de tipos esttico, caractersticas cuidadosamente seleccionadas, y
que no tiene recolector de basura, Rust compila en cdigo rpido y predecible que estpa a
la par con el cdigo escrito en lenguajes tradicionales de bajo nivel (como C/C++).
Moviendo los diferentes controles del tiempo de ejecucin y la eliminacin de la
recoleccin de basura, el cdigo resultante imita las caractersticas de rendimiento de
otros lenguajes de bajo nivel, mientras que el lenguaje mismo se mantiene mucho ms
expresivo. Los (aparentemente) elementos de alto nivel (cadenas, colecciones, funciones
de orden superior, etc.) en general evitan el golpe de rendimiento en tiempo de ejecucin
comnmente asociados con ellos. Dado que la salida del compilador de Rust se
encuentra en la representacin intermedia LLVM, el cdigo de mquina final hace un buen
uso de los beneficios multi-plataforma del compilador LLVM y todas las optimizaciones
adicionales (actuales y futuras) de forma automtica.
Podramos seguir durante horas sobre cmo con Rust nunca tendrs que preocuparte de
cerrar sockets o liberar memoria, cmo los rasgos y macros le dan una flexibilidad
increble para la sobrecarga de operadores, o incluso trabajar con el aspecto funcional de
Rust, manipular iteradores, closures y funciones de orden superior . Pero no queremos
abrumarte desde el principio! Tarde o temprano te encontrars con ellos de todos modos
y es ms divertido descubrir por ti mismo exactamente qu tan profundo es el hoyo del
conejo.
As que ahora en cambio, vamos finalmente a ver algo de cdigo.
Dile hola a Rust
Sin ms prembulos tu primer cdigo Rust:
fn main() {
println!("Hello, Rust!");
}
Abrir este cdigo en Rust Playpen >>
Espera, eso es todo? Esto puede parecer un poco anti-climtico, pero slo hay tantas
formas de escribir un Hello World en Rust. Aguntanos un poco mientras compartimos un
ejemplo un poco ms complejo y otro clsico.
Qu es todo esto del FizzBuzz?
Vamos a la antigua con el programa FizzBuzz! FizzBuzz es un algoritmo en el que se
cuenta hacia arriba por toda la eternidad, sustituyendo de algunos de los nmeros
con fizz (para los nmeros divisibles por 3), buzz (para los nmeros divisibles por 5),
o fizzbuzz (divisible por tanto 3 y 5).
Adems de mostrar nuestro punto (y para ayudarle a familiarizarte con la semntica de
Rust), hemos incluido las versiones C y Python del mismo algoritmo:
FizzBuzz Imperativo versin C
#include

int main(void)
{
int num;
for(num=1; num<101; ++num)
{
if( num%3 == 0 && num%5 == 0 ) {
printf("fizzbuzz\n");
} else if( num%3 == 0) {
printf("fizz\n");
} else if( num%5 == 0) {
printf("buzz\n");
} else {
printf("%d\n",num);
}
}

return 0;
}
FizzBuzz Imperativo versin Python
for num in xrange(1,101):
if num%3 == 0 and num%5 == 0:
print "fizzbuzz"
elif num%3 == 0:
print "fizz"
elif num%5 == 0:
print "buzz"
else:
print num
FizzBuzz Imperativo Versin Rust
fn main() {
for num in 1..101 { // notacin de rangos!
match (num%3, num%5) { // reconocimiento de patrones!
(0, 0) => println!("fizzbuzz"),
(0, _) => println!("fizz"),
(_, 0) => println!("buzz"),
_ => println!("{}", num)
}
}
}
Abrir este cdigo en Rust Playpen >>
Incluso en un pequeo fragmento de este tipo, algo del poder de Rust se comienza a
mostrar. La diferencia ms obvia podra ser que estamos usando reconocimiento de
patrones en lugar de los tradicionales if. Nosotros podramos usarlos, sin embargo
el match es una adicin muy til al arsenal de un Rustacean.
La otra cosa que cabe notar es la notacin de rango en el ciclo for (similar a su
contraparte de Python). Es interesante, sin embargo, que en este caso no
podramos haber utilizado un tradicional ciclo for C dado que no est soportado en
Rust por diseo. Los ciclos for tradicionales se consideran propensos a errores y se
sustituyen con el ms seguro y ms flexible concepto de iterables.
He aqu un vistazo ms elaborado de lo que sucede en la fase de reconocimientos de
patrones de nuestro ejemplo FizzBuzz:
...

// Para reconocimento de patrones, construimos una tupla


// con los residuos de la divisin entera de num por 3 y 5
match (num%3, num%5) {
// Cuando num es divisible por 3 Y 5
// (ambos residuos son 0)
// -> imprimir "fizzbuzz"
(0, 0) => println!("fizzbuzz"),

// Cuando num es divisible por 3 (el residuo es 0)


// Es num divisible por 5? -> no nos interesa
// -> imprimir "fizz"
(0, _) => println!("fizz"),

// Cuando num es divisible por 5 (el residuo es 0)


// Es num divisible por 3? -> no nos interesa
// -> imprimir "buzz"
(_, 0) => println!("buzz"),

// En los otros casos, solo imprimir el valor de num


// Nota que la comparacin debe ser exhaustiva (o sea,
// cubrir todos los casos posibles) - esto es revisado
// por el compilador!
_ => pintln!("{}", num)
}
...
Este no es el lugar para profundizar en cmo funciona el reconocimiento de patrones, o la
desestructuracin, o qu son las tuplas. Encontrar excelentes artculos sobre estos
temas en el libro de Rust , el blog de Rust, o ms en Rust By ExamplePor, pero
pensamos que es una buena manera de demostrar las caractersticas y matices que
hacen Rust tanto potente como eficaz.
Qu tal algo de FizzBuzz funcional?
Para expandir el ltimo ejemplo y demostrar la verdadera flexibilidad de Rust, en nuestro
segundo ejemplo vamos a subir nuestro FizzBuzz a otro nivel. Rust se autodenomina
como multi-paradigma. Podemos poner esto a prueba al reescribir nuestro ejemplo
FizzBuzz en estilo funcional. Para ayudar a poner el cdigo en perspectiva, tambin
vamos a mostrar la implementacin en JavaScript (el sabor ECMAScript 6), tambin:
FizzBuzz Funcional JavaScript versin (ES6)
Array.from(Array(100).keys()).slice(1)
.map((num) => {
if (num%3 === 0 && num%5 === 0) {
return "fizzbuzz";
} else if (num%3 === 0) {
return "fizz";
} else if (num%5 === 0) {
return "buzz";
} else {
return num;
}
})
.map(output => console.log(output));
FizzBuzz Funcional versin Rust
fn main() {
(1..101)
.map(|num| {
match (num%3, num%5) { // reconocimento de patrones!
(0, 0) => "fizzbuzz".to_string(),
(0, _) => "fizz".to_string(),
(_, 0) => "buzz".to_string(),
_ => format!("{}", num)
}
})
.map(|output| { println!("{}", output); output })
.collect::<vec <_>>();
}</vec>
Abrir este cdigo en el Rust Playpen >>
No slo podemos imitar el estilo funcional de JavaScript con closures y llamadas a
mtodos funcionales, pero gracias al poderoso reconocimiento de patrones de Rust,
incluso podemos ganarle un poco a JavaScript en expresividad.
Nota: Los iteradores de Rust son lazy (pasivos), as que en realidad necesitas la llamada
a .collect() (lo que se llama un consumidor) para que esto funcione si no la
incluyes, nada del cdigo anterior se ejecutar. Echa un vistazo a la seccin
de consumidores del libro de Rust para aprender ms.
Escogiendo un proyecto
Tienes ganas de sumergirse en Rust y listo para comenzar algo bueno. Pero qu
construir? Podras comenzar con algo pequeo y escribir una aplicacin pequea o una
pequea biblioteca, y subirlo a crates.io. La gente ha creado muchos proyectos
interesantes en Rust ya kernels *nix, proyectos de hardware empotrado, desde juegos
hasta frameworks de servidor web, lo que demuestra que el nico lmite es tu
imaginacin.
Si quieres empezar poco a poco, pero aportar algo til mientras aprendes las
complejidades de la programacin Rust, considera participar en algunos de los proyectos
que ya prosperan en GitHub (o incluso el propio compilador Rust que tambin est
escrito en Rust).
O bien, puedes empezar por volver a escribir pequeas partes de tu aplicacin de
produccin, y experimentar con los resultados. El FFI de Rust pretende ser un reemplazo
drop-in para el cdigo C. Con un mnimo esfuerzo podras reemplazar pequeas partes de
tu aplicacin con las implementaciones Rust del mismo cdigo. Pero la interoperabilidad
no se detiene all estos enlaces C funcionan en ambos sentidos. Esto significa que
puedes utilizar todas las bibliotecas C estndar en tus aplicaciones Rust o (ya que
muchos lenguajes de programacin vienen con bibliotecas de interfaz de C estndar)
realizar llamadas de ida y vuelta entre Rust y Python, Ruby, o incluso Go!
Mira la charla de Dan Callahan Mi Python es un poco Rusty sobre cmo conectar Rust
con Python.
Prcticamente no hay lenguajes que no funcionan con Rust: quieres compilar Rust a
JavaScript o usar ensamblador en lnea en el cdigo? S puedes!
Ahora sale y crea algo impresionante.
Y no olvides Rust no es simplemente un lenguaje de programacin es tambin
una comunidad. Si alguna vez te siente atrapado, no seas tmido para pedir ayuda, ya sea
en los foros o IRC. Tambin puedes compartir tus pensamientos y creaciones en el Reddit
de Rust.
Rust ya es grande es la gente como t que va a hacer que sea an ms impresionante!
The following two tabs change content below.

o Bio

o Latest Posts

jorgev
Add-ons Developer Relations Lead at Mozilla
Jorge trabaja para el equipo de complementos de Mozilla, y se dedica a Mozilla Hispano y Mozilla
Costa Rica en su tiempo libre. Actualmente est encargado del blog de Mozilla Hispano Labs.

Artculos relacionados

Empezando con Rust Firefox y Samsung avanzan en el

navegador mvil moderno El mes de abril en MH Labs


Compartir artculo:

not connected to Facebook

not connected to Google+

not connected to Twitter

Notable Replies

1. Miguel_Usechesays:
26/11/2015
Cool, excelente artculo
Continue the discussion foro.mozilla-hispano.org
Participants

Buscar
Participa!
Firefox Friends
Agrega botones de Firefox en tu sitio web y comparte tu amor por Mozilla Firefox.

Armada alucinante
Ayuda a otros usuarios en Twitter.

Colabora con la comunidad


En Mozilla lo importante son las personas. Descubre cmo puedes colaborar.

Boletn Firefox
Suscrbete al boletn de novedades de Firefox.

Descargas
Descarga los programas de Mozilla.

Lo ms visto
o Nueva actualizacin de Firefox, FLAC, y ayuda de seguridad
o Firefox ahora habla Guaran e incorpora detalles interesantes