«La tecnología del pasado viene a salvar el futuro de sí misma». Así es como Graydon Hoare, el creador de Rust, describe lo que quiere lograr.
Ese es uno de los sellos distintivos clave de Rust: usar tecnologías que son bien conocidas por el mundo académico pero que rara vez se implementan en los lenguajes de programación contemporáneos. Tecnologías antiguas, fiables y en ocasiones olvidadas. Pero que, sobre todo, funcionan muy bien.
Estas tecnologías se utilizan principalmente para una cosa: seguridad.
¿Suena aburrido? No lo es, si le preguntas a la comunidad. A el 87 por ciento de los desarrolladores de Rust aman este lenguaje por encima de todos los demás, lo que lo convierte en el idioma más querido desde 2016 según la encuesta de desarrolladores de StackOverflow de este año.
Pensaría que los desarrolladores de software se encuentran entre los seres humanos más innovadores del planeta. El óxido, sin embargo, es exactamente lo opuesto al mantra de “muévete rápido y rompe cosas”. Sin embargo, es casi seguro que los desarrolladores de Rust aprenderán conceptos de los que nunca antes habían oído hablar.
Desde la novedad de la programación de sistemas para algunos desarrolladores sobre los tipos de datos algebraicos hasta el propio enfoque de Rust para la seguridad de la memoria: cada desarrollador puede encontrar algo nuevo e increíblemente útil que aprender. Y hay mas razones enamorarse de Rust.
Más seguridad de la memoria sin recolección de basura
Uno de los desafíos de todos los lenguajes de programación es administrar la memoria de una computadora de manera segura y eficiente. Python, por ejemplo, tiene un recolector de basura que constantemente busca memoria que ya no se usa y la limpia mientras se ejecuta el programa.
En otros lenguajes, como C y C ++, el programador debe asignar y liberar memoria explícitamente sobre la marcha. Dado que todos los problemas relacionados con la memoria se eliminan antes de que se ejecute el programa, este enfoque es mucho mejor para optimizar el rendimiento.
Por otro lado, la memoria es otra cosa en la que los desarrolladores deben pensar todo el tiempo. Esta es una de las razones por las que se tarda mucho más en escribir un programa en C que en Python, incluso si hace lo mismo al final del día.
Rust toma un camino alternativo: la memoria se asigna a través de un sistema de propiedad en el momento de la compilación. Es un truco ingenioso para garantizar que los datos no utilizados se limpien sin obligar al programador a pensar en asignar y liberar memoria todo el tiempo.
Básicamente, la propiedad es una colección de tres normas:
- Cada valor en Rust tiene una variable llamada propietario.
- Solo puede haber un propietario a la vez.
- Cuando el propietario sale del alcance, el valor se eliminará, liberando así memoria.
Un ejemplo simple es la asignación de un vector en Rust:

En la segunda línea, el vector [1, 2, 3] con el propietario se crea un. Después de eso, b se convierte en el propietario del vector. Dado que se llama al propietario correcto en la declaración de impresión, este programa compila y devuelve el resultado esperado cuando se ejecuta:




Por otro lado, podría intentar llamar al vector con su propietario anterior, A, así:




En este caso, el compilador arroja un error porque ya se ha eliminado a en la tercera línea. Hay mucha más profundidad al tema, pero esta es la idea básica.
En comparación, Python se ejecutaría en el segundo caso. Su recolector de basura soltaría A solo después de la última vez que se llamó, lo cual es bueno para el desarrollador pero no tan bueno en términos de espacio de memoria.
En C, las cosas serían un poco más complicadas: tendría que asignar espacio de memoria para a, luego apuntarlo al vector, luego asignar más espacio de memoria para B, apuntar B a A y finalmente liberar el espacio ocupado por A y B cuando hayas terminado.
En este sentido, el enfoque de Rust a la memoria es un compromiso entre la velocidad de desarrollo y el rendimiento. Si bien no es tan fácil de escribir como Python, no es tan torpe como C una vez que ha entendido el concepto de propiedad.
Por otro lado, la eficiencia es bastante asombrosa: el equipo de desarrolladores de Tilde, por ejemplo, logró rreducir su uso de memoria en un 90 por ciento después de reescribir algunas piezas JavaHTTP en Rust.
Escritura estática sin ponerse feo
Es casi una guerra religiosa entre los fanáticos de la escritura dinámica y la escritura estática. Si bien es mucho más fácil producir software en idiomas con escritura dinámica, el código puede volverse inmaterial con bastante rapidez. Esta es una de las razones por las que el código Python puede ser bastante difícil de mantener, en comparación con C, por ejemplo.
Por otro lado, tener que declarar el tipo de cada variable de estilo C puede resultar bastante molesto. Si alguna vez ha intentado utilizar un [double] en una función que devuelve un [float] escribe C, sabes a lo que me refiero.
Rust toma un camino intermedio: es un sistema de tipos estáticos, pero solo requiere que el programador especifique tipos de nivel superior como argumentos de función y constantes. Dentro de los cuerpos de las funciones, se permite la inferencia de tipos al estilo Python.
Una característica particularmente útil de Rust es que también tiene un tipo None. Esto le permite manejar excepciones en tiempo de compilación para garantizar que el programa se ejecute sin problemas para el usuario final. Considere este ejemplo, donde podemos obtener el nombre completo de una persona independientemente de si tiene un segundo nombre o no:




Si bien las versiones de la solución None también existen en otros idiomas, muestra la ambición de Rust de una manera ordenada: no complicar demasiado la escritura y mantener el código lo más duradero y fácil de mantener posible.
Si bien Python es un lenguaje de programación de propósito general, Rust es, como C, decididamente para la programación de sistemas. Si bien Rust no es el lenguaje ideal si está creando una aplicación para su usuario final, es perfecto para crear piezas de software que brinden servicios a otro software.
Un enfoque ingenioso para la programación de sistemas
Como tal, la eficiencia es el núcleo de Rust. Eso se demuestra mejor con abstracciones de costo cero, que interpretan el código manteniendo el uso de la memoria al mínimo. Como Bjarne Stroustrup, el inventor de C ++, lo pone: «Lo que no usa, no paga. Y además: lo que usas, no podrías codificar mejor «.
Por ejemplo, considere agregar todos los números enteros hasta 1,000 en Python:




Esto hace 1,000 iteraciones y adiciones cada vez que se ejecuta el código, y puede imaginar cuánto puede ralentizar el código. Por el contrario, considere lo mismo en Rust:




Esto se compila hasta la constante 499500. Efectivamente, el uso de memoria se ha reducido en un factor de 1,000.
Si bien estas abstracciones también existen en C, Rust las usa mucho; de hecho, un objetivo es agregar tantas abstracciones de costo cero al lenguaje como sea posible. En este sentido, Rust es un poco como el siguiente nivel C.
C ha existido durante más de 40 años, y Rust apunta a hacer lo mismo. Rust pone un énfasis tan alto en la compatibilidad con versiones anteriores que aún puede ejecutar código en Rust 1.0 hoy. Del mismo modo, si escribe código Rust hoy, aún debería poder ejecutarlo en veinte años. ¡El óxido no se oxida!
Una comunidad pequeña pero increíble
Con su énfasis en la seguridad y la sostenibilidad y todos sus ingeniosos detalles hablando por él, no es de extrañar que Dropbox ha reescrito gran parte de su estructura principal en óxido. Mozilla, el primer gran patrocinador de Rust, ha partes vitales de Firefox escritas en él. Microsoft considera C y C ++ ya no es seguro para el software de misión crítica e invierte cada vez más en Rust.
Y no son solo las grandes corporaciones: el amor por Rust se traduce en el programador individual. Aunque solo el cinco por ciento de los encuestados de StackOverflow usan Rust hasta ahora, estos desarrolladores están extremadamente entusiasmados con el lenguaje.
Y hay razones para eso. No solo la especificación del lenguaje y el compilador están muy bien pensados. Existe rustup para instalar y administrar cadenas de herramientas. Existe Cargo, una herramienta de línea de comandos que viene con cada instalación de Rust y ayuda a administrar las dependencias, ejecutar pruebas y generar documentación.
Hay crates.io donde los usuarios pueden compartir y descubrir bibliotecas, y docs.rs donde están documentados. Existen lints del compilador de Clippy y formateo automático de rustfmt.
Más allá de eso, hay chats oficiales y no oficiales, subreddits, foros de usuarios, preguntas de StackOverflow y conferencias en todo el mundo. Con una comunidad que antepone la amabilidad a todo, ¿hay algo más que pedir?
La desventaja: la necesidad de correr antes de poder caminar
Lo único que desalienta de Rust es el alto costo inicial. Si bien necesitaría uno o dos días para ser productivo en la mayoría de los idiomas, es más como una o dos semanas en Rust.
Esto se debe a la gran cantidad de conceptos nuevos que otros lenguajes no utilizan y al hecho de que normalmente hay muchos errores en el momento de la compilación. Debe manejar todas las excepciones desde el primer día y no puede simplemente escribir un código borrador que se ejecute y agregar excepciones más tarde, como lo haría en Python.
Además, dado que Rust todavía es bastante nuevo, no todas las bibliotecas que podría desear están disponibles todavía. Aparte de la documentación oficial y varias preguntas sobre StackOverflow, tampoco hay muchos tutoriales.
La buena noticia es que una vez que haya aprendido los conceptos y haya compilado su programa, se ejecuta como un encanto. Además, aún debería funcionar en veinte años dada la compatibilidad con versiones anteriores.
Dada la sostenibilidad de su código y el hecho de que Rust está respaldado por una serie de grandes corporaciones, una o dos semanas de aprendizaje inicial bien podrían valer la pena, a pesar de las desventajas.
El resultado final: hackear sin miedo
El óxido es más que seguridad. Pero es difícil negar que muchos de sus conceptos centrales tienen como objetivo eliminar las pérdidas de memoria y otros problemas de seguridad. Y en una época en la que el software lo es todo, la seguridad es imprescindible.
Probablemente haya un espacio para cada idioma futuro: Ir está poblando el espacio de Python y Java cada vez más, Julia va tras Python en la ciencia de datos, y Rust está creciendo en el ámbito de Python y C ++. Lo que hace que Rust sea especial es su increíble comunidad, sus características innovadoras y el hecho de que está diseñado para funcionar durante las próximas décadas.
Hay mucho más trabajo por hacer, y solo una fracción de eso se puede hacer y se hará en Rust. Los nuevos idiomas de hoy tienen una gran posibilidad de quedarse por un tiempo, aunque también surgirán otros idiomas en los próximos años. Pero si tuviera que colocar mis fichas en un idioma, Rust sería una apuesta segura.
Este artículo fue escrito por Rhea Moutafis y fue publicado originalmente en Hacia la ciencia de datos. Usted puede leerlo aquí.
