Aparentemente, de la nada aparece Rust. Toda persona que lo toca, lo ama, y se convierte en un acólita y férrea defensora, pero ¿porque? ¿Porqué Facebook, AWS, Microsoft y todos los grandes se han metido en la Rust Foundation? En esta charla veremos qué es Rust, que aporta nuevo respecto al resto de lenguajes, y cuales son sus casos de uso más interesantes. También os contaremos porqué hemos elegido Rust como lenguaje de referencia para los desarrollos de software complejos, os enseñaremos cómo lo usamos y qué utilidades nos funcionan mejor. Lo tenemos claro. Este es el camino.
3. @DogDeveloper
#TheRustalorean
Who’s that guy
• Security Advocate & Software Architect en @ITI_TIC
• Actualmente en proyectos de investigación de
ciberseguridad en entornos cloud y detección basada en
Machine Learning
• +10 años con proyectos comerciales
• Profesor en Máster Big Data Analytics de
Universidad Politécnica de Valencia
• Profesor en curso de especialista universitario en
Esquema Nacional de Seguridad en la Universidad
de Mondragón
• Formador y ponente
• +60 cursos y charlas
https://www.linkedin.com/in/fjbarrena
https://twitter.com/DogDeveloper
https://github.com/fjbarrena
https://www.slideshare.net/fjbarrena
4. @DogDeveloper
#TheRustalorean
•Rust nació como un
side-project de Graydon
Hoare, empleado de
Mozilla, en 2006
•Mozilla lo sponsorizó en
2009
•Y lo hizo oficial en 2010
un poco de historia…
5. @DogDeveloper
#TheRustalorean
• Durante este periodo de tiempo fue declarado como el
lenguaje más amado en StackOverflow durante 4 años
seguidos (2016-2020!)
• Cada vez que alguien tenía la oportunidad de probar Rust,
caía locamente enamorado de él
un poco de historia…
6. @DogDeveloper
#TheRustalorean
un poco de historia…
https://insights.stackoverflow.com/survey/2020?_ga=2.101739841.1363837995.1616266973-
1694927504.1616266973#technology-most-loved-dreaded-and-wanted-languages-loved
15. @DogDeveloper
#TheRustalorean
•Rust siempre ha sido desarrollado por la
comunidad
•Y la Rust Foundation garantiza que seguirá
siendo así
•No debe preocuparnos la estabilidad de Rust,
porque está garantizada a corto y medio plazo
•A largo plazo bueno… who knows? Sobrevivirá Ruby
a largo plazo?
Rust pa’rato
16. @DogDeveloper
#TheRustalorean
• Rust siempre ha sido desarrollado por la comunidad
• Y la Rust Foundation garantiza que seguirá siendo así
• No debe preocuparnos la estabilidad de Rust, porque está
garantizada a corto y medio plazo
• A largo plazo bueno… who knows? Sobrevivirá Ruby a largo plazo?
Nuestra historia con rust
Nuestra historia
con rust
18. @DogDeveloper
#TheRustalorean
•Rust es un lenguaje de programación “de sistemas”
•Que es LA OSTIA de óptimo à rápido en tiempo de
ejecución y con buen uso de recursos del sistema
•Que previene prácticamente de todos los crashes
habituales en este tipo de lenguajes (C, C++…)
•Y elimina las Data Races
• Una Data Race ocurre cuando uno o más hilos acceden
concurrentemente a una posición de memoria o
variable
Pero qué es rust
19. @DogDeveloper
#TheRustalorean
•Las prioridades de RUST son
• SEGURIDAD
• RENDIMIENTO
• Resuelve problemas que C/C++ han sufrido durante mucho
tiempo
• Errores de memoria
• Programación concurrente
• Tres beneficios principales
• Seguridad en memoria
• Modelo de concurrencia más sencillo
• Zero-cost abstractions
Pero qué es rust
24. @DogDeveloper
#TheRustalorean
• Seguridad en memoria GARANTIZADA
• Hilos sin dataraces
• Abstracciones a CERO COSTE
• Traits
• Type inference
• Immutable by default
• Macros
• No existe null (ni undefined, ni nil, ni LECHES) à Elegante!
• Eficiente en memoria sin Garbage Collector, pero sin tener que
reservar y liberar memoria manualmente como en C…
qué tiene rust de especial
29. @DogDeveloper
#TheRustalorean
•Rust analiza la gestión de la memoria de tu programa
en tiempo de compilación
•Asegurando que no aparecerán bugs debidos a una
mala administración de la memoria y eliminando la
necesidad de utilizar sistemas de Garbage Collection
•No es necesario reservar memoria manualmente
• No obstante, puedes hacerlo si lo necesitas dentro de un bloque
de código unsafe
•¿Cómo lo consigue? Con el concepto de ownership
No segfaults
30. @DogDeveloper
#TheRustalorean
• Este concepto es el que permite a Rust garantizar la
seguridad en memoria y eliminar la necesidad de un
Garbage Collector
• Todos los lenguajes tienen que manejar cómo utilizan la
memoria en tiempo de ejecución
• Algunos a través de un Garbage Collector, que constantemente busca
memoria no utilizada, mientras el programa se ejecuta
• Y otros pidiendo que el programador explícitamente reserve y libere la
memoria
• Rust utiliza otra aproximación…
• La memoria se administra a través del sistema de ownership, con un
conjunto de reglas que el compilador comprueba en tiempo de compilación
ownership
32. @DogDeveloper
#TheRustalorean
• Tanto el Stack como el Heap son tipos de memorias que
están disponibles para un programa en tiempo de ejecución
• Pero ambas están estructuradas de diferente manera
• Stack (o pila)
• Guarda los valores en el orden que llegan
• Pero los recupera en el orden inverso
• LIFO (Last In First Out)
• Es como una pila de platos
• Todos los datos dentro de la pila deben tener un tamaño fijo y
conocido
• Si no conozco el tamaño, o este puede cambiar en el tiempo, no puede estar en
el Stack
The stack and the heap
33. @DogDeveloper
#TheRustalorean
• Heap (o montículo)
• El heap es una memoria menos organizada
• Cuando se quiere guardar algo en el Heap, se solicita un tamaño
determinado
• El “reservador de memoria” busca un espacio vacío donde quepa
el dato, lo marca como “en uso” y devuelve un puntero con la
dirección de memoria de ese bloque
• A este proceso se le conoce como allocating on the heap, o simplemente, allocating
• Como el puntero devuelto tiene un tamaño fijo y conocido, se
puede guardar en el Stack
• Pero para leer el dato, tendrás que seguir el puntero hacia el Heap
• Es como buscar una mesa en un restaurante…
The stack and the heap
34. @DogDeveloper
#TheRustalorean
• El Stack es MUCHO más rápido que el Heap
• No tiene que buscar espacio, ni reservarlo. El propio proceso de reserva de
memoria es lineal con el tamaño que se quiere reservar (a más tamaño, más
le cuesta reservar memoria)
• El acceso a los datos es mucho más rápido también, dado que no hay que
seguir un puntero, la información está directamente accesible
• Todos los tipos de datos primitivos se almacenan en el STACK
• Por ejemplo i8, i16, i32, i64, char, str…
• Mientras que los tipos de datos complejos se almacenan en el HEAP
• Como por ejemplo String, y cualquier tipo complejo que podamos crear
• Es importante conocer las diferencias entre Stack y Heap para
comprender el concepto de ownership
• Una vez lo tengáis claro, ya no hace tanta falta ;)
The stack and the heap
35. @DogDeveloper
#TheRustalorean
• El Ownership en Rust tiene 3 sencillas reglas
• Cada VALOR en RUST tiene una variable llamada OWNER
• SOLO puede haber UN OWNER para un VALOR al mismo tiempo
• Cuando un OWNER se SALE DEL SCOPE, el valor es ELIMINADO
• El scope es el clásico de cualquier lenguaje
ownership rules
37. @DogDeveloper
#TheRustalorean
• Imaginemos que tenemos un String variable alojado en el
Heap, eso se puede conseguir así
• Este String estaría alojado en el Heap, pero seguiría siendo
inmutable. Para hacerlo mutable tendríamos que:
ownership rules
38. @DogDeveloper
#TheRustalorean
• En el caso de un str (literal)…
• Conocemos su tamaño en tiempo de compilación
• El texto se ”hardcodea” directamente en el ejecutable final
• Son rápidos y eficientes
• Pero porque son inmutables!
• En el caso de un String
• No conocemos su tamaño en tiempo de compilación
• Si queremos que sea mutable, necesitamos reservar memoria en
el heap, y además debe poder crecer, es decir
• La reserva de memoria se debe solicitar al memory allocator en tiempo de
ejecución
• Tenemos que devolver la memoria cuando ya no la usemos de alguna manera
ownership rules
39. @DogDeveloper
#TheRustalorean
• “La reserva de memoria se debe solicitar al memory
allocator en tiempo de ejecución”
• “Tenemos que devolver la memoria cuando ya no la
usemos de alguna manera”
• En C tendríamos que liberarla manualmente
• En Java, el Garbage Collector la liberará en algún momento
• ¿Y en Rust? à Se libera AUTOMÁTICAMENTE cuando la variable
sale del SCOPE
• El COMPILADOR añade órdenes de LIBERACIÓN DE MEMORIA en cada cambio
de SCOPE
ownership rules
41. @DogDeveloper
#TheRustalorean
•El concepto es sencillo, pero
tiene un profundo impacto en
cómo se escribe el código en
Rust
•Puede parecer muy simple,
pero el comportamiento del
código se complica cuando
queremos tener múltiples
variables accediendo a los datos
que hay en el Heap…
ownership rules
46. @DogDeveloper
#TheRustalorean
•Como hemos dicho antes, Rust libera
automáticamente la memoria de aquellas variables
que salen de su scope
• En este ejemplo, llamará DOS veces para liberar la misma
posición de memoria
• Esto es conocido como el double free error, y es uno de
los problemas de seguridad de memoria que Rust
soluciona
• Liberar la memoria por duplicado lleva habitualmente a
corrupción de memoria, lo cual favorece vulnerabilidades
de seguridad
moves
47. @DogDeveloper
#TheRustalorean
• Hay otro detalle en este ejemplo
• Rust considera que s1 no es válido, ya que el ownership ya
no pertenece a s1, si no a s2
• Recordad, solo hay un OWNER de un dato
• Este proceso se llama Shallow Copy, y consiste en el
concepto de copiar un puntero, su longitud y su capacidad,
en lugar de copiar todo el dato (hacer un “clon”)
• Rust además de hacer un Shallow Copy, también INVALIDA la
variable s1
• A esto se le conoce como un MOVE
moves
48. @DogDeveloper
#TheRustalorean
•s1 ha tenido un MOVE a s2
•Esto soluciona nuestro
problema
• Solo s2 es válido
• De modo que cuando s2 salga
de su scope, se liberará su
memoria
• Cuando s1 salga de su scope,
no liberará nada, dado que está
marcada como INVÁLIDA
• Así es imposible que haya un
double free error
moves
51. @DogDeveloper
#TheRustalorean
• ¿Porqué esto es importante?
• Habiendo SOLO UN OWNER
nos aseguramos de que SOLO
UN PUNTERO puede acceder a
esa posición de memoria en un
mismo SCOPE
• Esto elimina la posibilidad de
tener PUNTEROS PERDIDOS
accediendo a esa posición de
memoria
• Y también la posibilidad de
tener PUNTEROS MALICIOSOS…
moves
Solo puede haber un
owner!!
57. @DogDeveloper
#TheRustalorean
• No tiene NULL ni EXCEPTION
• Ni undefined, ni nil, ni nada
• Bueno, null si lo tiene, pero hay que llamarlo explícitamente
y no se aconseja
• Nuestro código NO TIENE NULLs, y HEMOS GANADO CON
ELLO
otras peculiaridades de rust
60. @DogDeveloper
#TheRustalorean
• Una de las promesas de Rust son las abstracciones a coste
cero
• Esto significa que no importa cómo utilices el lenguaje, este
siempre se compilará al mismo código ensamblador
• No importa si usas un loop
• O un closure
• El resultado es el mismo, y además ES EL ÓPTIMO
• ¡Y por eso cualquier otro lenguaje te hará echar la pota!
Rust zero cost abstraction
61. @DogDeveloper
#TheRustalorean
• En el resto de lenguajes, el azúcar sintáctico, o el uso de
paradigmas “no nativos” tiene un coste
• Si estás en Java por ejemplo, y usas lenguaje funcional, pagas un
precio en rendimiento
• O lo ganas, depende de lo mojón que sea el código que hagas :D
• Pero una abstracción no puede ser más rápida que un código
nativo optimizado
• En Rust, en cambio, esto no es así
• Ejemplo…
Rust zero cost abstraction
62. @DogDeveloper
#TheRustalorean
• En Python sum(range(1000))
• 1000 iteraciones
• 1000 sumas
• + coste de escritura
• En Rust (0..1000).sum()
• CERO COSTE
• ZERO
• RIEN
• NIENTE
• NOTHING
• NÁ DE NÁ
Rust zero cost abstraction
63. @DogDeveloper
#TheRustalorean
• El precio de la seguridad y el rendimiento hay que pagarlo
• Rust es un lenguaje de propósito general
• Puede usarse para cualquier cosa
• Pero donde más destaca es en:
• Desarrollos “de sistemas” o de ”bajo nivel”
• Videojuegos
• IoT
• Si necesitas MUCHO rendimiento
• Si quieres reforzar la seguridad (de memoria)
• ¿Y para todo lo demás?
El que algo quiere, algo le cuesta