7 razones para usar Rust para su próximo proyecto de desarrollo

¿Eres un desarrollador que busca aprender Rust? Para ayudarlo a decidir, este artículo presenta algunas de las características de Rust, uno de los lenguajes de programación de sistemas más populares.

En este artículo, exploraremos el lenguaje de programación Rust y sus funciones, como el sistema de tipos, la seguridad de la memoria y la propiedad. También revisaremos una lista de recursos que pueden ayudarlo a aprender Rust.

¡Vamos a empezar!

¿Qué es el óxido?

Rust es un lenguaje de programación de sistemas. Comenzó como un proyecto personal de Graydon Hoare, un desarrollador, en 2006. En menos de una década, se ha convertido en la opción preferida para la programación de sistemas y aplicaciones afines. El salario medio de un programador de Rust es de unos 120.000 dólares.

Entonces, si está buscando cambiar de C ++ a Rust o está buscando aprender un nuevo idioma, ¡aprender Rust puede ser una excelente opción! Según la encuesta de desarrolladores de StackOverflow, Rust ha sido votado como el lenguaje de programación más querido durante siete años seguidos.

Fuente de la imagen: StackOverflow

Rust ofrece la velocidad de los lenguajes de programación de sistemas de bajo nivel como C y C++ y la seguridad de los lenguajes de programación de alto nivel como Python.

Desde proyectos notables como Dropbox y Firefox hasta WebAssembly y programación integrada, Rust se usa ampliamente en todas las áreas de desarrollo de software. Rust ofrece soporte de administración de paquetes listo para usar a través de Cargo.

Cargo: el administrador de paquetes para Rust

Cargo es el administrador de paquetes de Rust. Puede usar cargo para instalar paquetes desde cajas, el registro de paquetes de Rust. Además de ser un administrador de paquetes que le permite buscar, instalar y administrar paquetes, cargo también sirve como corredor de pruebas, generador de documentos y sistema de compilación.

Ahora que tiene una descripción general de Rust, echemos un vistazo más de cerca a algunas de las características de Rust que lo hacen destacar como un lenguaje de programación de sistemas con una amplia adopción.

Mensajes de error útiles

Como programador principiante, se encontrará con errores y pasará una cantidad significativa de tiempo depurando su código. Utilizará los mensajes de error y las advertencias proporcionadas por el compilador para solucionar esos problemas. Y los mensajes útiles pueden ayudarlo a depurar más rápido.

Un mensaje de error de ejemplo

Cuando su código no se compila correctamente, Rust proporciona mensajes de error útiles que brindan explicaciones de lo que debe corregirse en su código y dónde.

En este ejemplo, la variable num2 se define dentro de la función interior(). Por lo tanto, se limita al ámbito de la función. Si intenta acceder a él fuera de la función, el compilador arroja un error:

fn main() {
    let num1 = 10;
    fn inner(){
        let num2 = 9; 
    }
    println!("The value of num2 is: {}", num2);
}

Y el mensaje de error brinda información sobre lo que debe corregirse.

error[E0425]: cannot find value `num2` in this scope
 --> src/main.rs:6:42
  |
6 |     println!("The value of num2 is: {}", num2);
  |                                          ^^^^ help: a local variable with a similar name exists: `num1`

Advertencias durante la compilación

El compilador también proporciona advertencias útiles sobre problemas en su código. Cuando define variables pero nunca las usa en el resto del programa, Rust le da un mensaje de advertencia, como se muestra.

fn main() {
    let num1 = 10;
    let num2 = 9;
    println!("The value of num1 is: {}", num1);
}

Aquí, la variable num2 se declara pero nunca se usa.

warning: unused variable: `num2`
 --> src/main.rs:3:9
  |
3 |     let num2 = 9;
  |         ^^^^ help: if this is intentional, prefix it with an underscore: `_num2`
  |

Lenguaje fuertemente tipado

Otra razón por la que debería usar Rust para sus proyectos de desarrollo es su sistema de tipos. Rust es un lenguaje fuertemente tipado, lo que significa que no admite la coerción de tipos. La coerción de tipo es cuando un idioma puede convertir implícitamente un valor en un tipo de datos a otro.

Por ejemplo, el código de Python en la siguiente celda de código se ejecutará sin errores. Esto se debe a que, en Python, un número distinto de cero tiene un valor de verdad de True y, por lo tanto, la declaración if se ejecuta sin errores, aunque el número 10 es un número entero, y no un valor booleano.

num1 = 10
if num1:
    num2 = 9
print(f"num2 is {num2}")

# Output: num2 is 9

Por otro lado, Rust no obliga a los tipos. Entonces, el siguiente código arrojará un error:

fn main() {
    let num1 = 10;
    if num1{
        let num2 = 9; 
    }
}

El error informa una discrepancia de tipo, donde se esperaba un valor booleano y se encontró un número entero.

error[E0308]: mismatched types
 --> src/main.rs:3:8
  |
3 |     if num1{
  |        ^^^^ expected `bool`, found integer

Seguridad de la memoria

La seguridad de la memoria es otra característica de Rust que lo hace atractivo para los programadores. Intentaremos proporcionar una breve descripción general de cómo funciona esto.

Las variables deben inicializarse antes de usarse

En Rust, todas las variables deben inicializarse antes de que puedan usarse. En lenguajes como C, el siguiente código donde num no está inicializado se compilará y ejecutará sin errores. El valor de la variable no inicializada es un valor basura.

#include <stdio.h>

int main(void) {
    int num;
	printf("The value of num is %d", num);
	return 0;
}
// Output: The value of num is 0

Si intenta hacer algo similar en Rust, se encontrará con un error de tiempo de compilación. Rust, por lo tanto, no tiene noción de recolección de basura.

fn main() {
    let num:i32;
    println!("The value of num is: {}",num);
}
error[E0381]: used binding `num` isn't initialized
 --> src/main.rs:3:40
  |
2 |     let num:i32;
  |         --- binding declared here but left uninitialized
3 |     println!("The value of num is: {}",num);
  |                                        ^^^ `num` used here but it isn't initialized
  |

Seguridad de la memoria en tiempo de compilación

Rust garantiza la seguridad de la memoria en tiempo de compilación. Tomemos un ejemplo simple. Aquí, aunque la declaración condicional if tiene un valor booleano de verdadero, lo que significa que el valor de num siempre será 100, obtenemos un error cuando tratamos de imprimir el valor de num.

fn main() {
    let num:i32;
    if true{
        num = 100;
    }
    println!("The value of num is: {}", num);
}

Esto se debe a que la evaluación condicional ocurre en tiempo de ejecución y el compilador no podrá garantizar que num tenga un valor en tiempo de compilación.

error[E0381]: used binding `num` is possibly-uninitialized
 --> src/main.rs:6:41
  |
2 |     let num:i32;
  |         --- binding declared here but left uninitialized
3 |     if true{
  |        ---- if this `if` condition is `false`, `num` is not initialized
4 |         num = 100;
5 |     }
  |      - an `else` arm might be missing here, initializing `num`
6 |     println!("The value of num is: {}", num);
  |                                         ^^^ `num` used here but it is possibly-uninitialized

Si observa más de cerca el mensaje de error, verá que con una declaración else, podemos asegurar que num tendrá un valor. Entonces el siguiente código se ejecutará sin errores. Porque de esta manera, el compilador puede determinar que num tendrá un valor, en el momento de la compilación, para que no haya errores.

fn main() {
    let num:i32;
    if true{
        num = 100;
    }
    else{
        num = 50;
    }
    println!("The value of num is: {}", num);
}
The value of num is: 100

Inmutabilidad de Variables

También es útil tener en cuenta que las variables en Rust son inmutables de forma predeterminada. Esto significa que, como desarrollador, no tiene que preocuparse por sobrescribir accidentalmente el valor de una variable en particular. Aquí hay un ejemplo:

fn main() {
    let num1 = 10;
    num1 = 5;
    println!("The value of num1 is: {}", num1);
}

Como num1 se inicializa en 10, cuando intenta asignarle un valor de 5, recibe un mensaje de error que dice «no se puede asignar dos veces a la variable inmutable num1».

error[E0384]: cannot assign twice to immutable variable `num1`
 --> src/main.rs:3:5
  |
2 |     let num1 = 10;
  |         ----
  |         |
  |         first assignment to `num1`
  |         help: consider making this binding mutable: `mut num1`
3 |     num1 = 5;
  |     ^^^^^^^^ cannot assign twice to immutable variable

Propiedad y préstamo

La propiedad garantiza la seguridad de la memoria. Funcionalmente, la propiedad en Rust se puede resumir de la siguiente manera:

Todo objeto debe tener uno y sólo un propietario. Si el propietario queda fuera del alcance, el objeto se descarta.

Tomemos un ejemplo simple. Aquí, inicializamos una cadena str1 y luego movemos su valor a str2. Como cualquier objeto solo puede tener un propietario, el objeto str1 se elimina tan pronto como su valor se mueve a str2.

fn main() {
    let str1 = String::from("Rust");
    let str2 = str1;
    println!("The value of str1 is: {}", str1);
}
error[E0382]: borrow of moved value: `str1`
 --> src/main.rs:4:42
  |
2 |     let str1 = String::from("Rust");
  |         ---- move occurs because `str1` has type `String`, which does not implement the `Copy` trait
3 |     let str2 = str1;
  |                ---- value moved here
4 |     println!("The value of str1 is: {}", str1);
  |                                          ^^^^ value borrowed here after move

Si bien esto parece intuitivo, para comprender y apreciar mejor cómo funciona la propiedad, es útil aprender los conceptos de préstamo y referencias.

Desarrollo rápido

Hasta ahora, hemos discutido varias funciones útiles del lenguaje de programación Rust. Para revisar algunos:

  • Rust está optimizado tanto para la velocidad como para la seguridad.
  • Viene con una herramienta de administración de paquetes incorporada y crea un sistema.
  • También tiene una rica biblioteca estándar.

En esencia, Rust ofrece todo lo que un desarrollador puede pedir. Por lo tanto, con Rust, puede desarrollar aplicaciones rápidamente con una depuración mínima y compilaciones más rápidas.

Desarrollo multiplataforma

Con Rust, puede optar por desarrollar en una plataforma de su elección. Rust es compatible con las plataformas más comunes: Linux, MacOS y Windows.

El desarrollo de aplicaciones generalmente es fácil, ya que puede compilar el código fuente de Rust en un ejecutable sin depender de otras herramientas de compilación y compiladores externos.

Una comunidad de apoyo contribuye en gran medida a simplificar su viaje de aprendizaje. Rust tiene una enorme base de usuarios que crece cada año que pasa.

La popularidad de Rust en la encuesta de desarrolladores de StackOverflow indica que hay una gran comunidad de usuarios, con muchos desarrolladores experimentados dispuestos a compartir sus conocimientos y experiencia.

Además de la documentación oficial, también hay un sitio de documentación generado por el usuario y un foro de discusión. También puede consultar el subreddit de Rust y los grupos de LinkedIn para ver discusiones relevantes.

Recursos de aprendizaje para comenzar con Rust

Esta sección enumera algunos recursos útiles para ayudarlo a comenzar con Rust. Esta no es una lista exhaustiva, pero incluye algunos tutoriales, cursos y libros recomendados para ayudarlo en su viaje de aprendizaje.

#1. óxido por ejemplo

Rust By Example le enseñará los fundamentos de Rust y las bibliotecas estándar a través de una serie de ejemplos que puede codificar en un editor en línea.

Los temas tratados incluyen cajas, carga: la herramienta de administración de paquetes para Rust, genéricos, rasgos, manejo de errores y mucho más.

#2. robos

Rustlings es otro recurso de aprendizaje oficial para el lenguaje de programación Rust. Es similar a Rust por ejemplo. Sin embargo, requiere que configure su entorno de desarrollo local, clone un repositorio de ejemplo y resuelva problemas simples para aprender estos conceptos.

#3. Ejercicio Rust Track

Rust Track on Exercism tiene más de 100 ejercicios para ayudarlo a aprender y evaluar su comprensión de Rust. Exercism es una plataforma gratuita donde puede ser asesorado por programadores experimentados además de codificar su camino a través de los ejercicios.

#4. Curso intensivo de óxido definitivo

El Ultimate Rust Crash Course impartido por Nathan Stocks en Udemy cubre lo siguiente:

  • Fundamentos de la programación en Rust
  • Sistema de módulos en Rust
  • Tipos de datos y flujo de control
  • Referencia y préstamo
  • Estructuras, rasgos y colecciones.

#5. Ultimate Rust 2: conceptos intermedios

Ultimate Rust 2 es un curso de seguimiento del Ultimate Rust Crash Course y cubre los siguientes temas:

  • Cierres
  • iteradores
  • Manejo de errores
  • Prueba unitaria y de integración
  • Registro, subprocesamiento múltiple y canales

#6. Rust lang: la guía completa para principiantes 2023

Este curso de Udemy impartido por Catalin Stefan es un curso completo sobre programación Rust. Algunos de los temas tratados incluyen:

  • Fundamentos de óxido
  • Tipos de datos, estructuras de control
  • Funciones, rasgos
  • Gestión de la memoria
  • concurrencia

#7. Programación de Rust: desarrollo de sistemas rápido y seguro

Programación de Rust de O’Reilly es un popular libro de programación de Rust que le enseñará lo siguiente:

  • Tipos de datos fundamentales
  • Propiedad y endeudamiento
  • Programación asíncrona
  • Aplicaciones rápidas de subprocesos múltiples
  • Cierres, iteradores
  • Colecciones

#8. El lenguaje de programación Rust, 2.ª edición

El lenguaje de programación Rust está escrito por colaboradores de renombre de la comunidad Rust. Este libro cubre todo lo que necesita saber sobre Rust, incluyendo:

  • Propiedad y endeudamiento
  • Genéricos, rasgos
  • Punteros inteligentes, subprocesamiento múltiple
  • Pruebas y manejo de errores

#9. La guía completa de referencia de programación de Rust

La Guía completa de referencia de programación de Rust de Packt cubre lo siguiente:

  • Implementando estructuras de datos en Rust
  • Escribir componentes reutilizables y comprobables en Rust
  • Diseño de algoritmos de diseño de aplicaciones multiproceso y
  • Aplicaciones de Rust en WebAssembly, redes y aplicaciones de línea de comandos

#10. Proyectos creativos para programadores de Rust

Si es un desarrollador experimentado que está aprendiendo Rust, la creación de algunos proyectos en su dominio de interés será suficiente para obtener una buena comprensión del lenguaje. Creative Projects for Rust Programmers de Packt es un libro que enseña Rust aplicándolo a proyectos como:

  • Creación de servicios web tranquilos
  • juegos 2D con
  • Desarrollo de aplicaciones web usando WebAssembly
  • Emuladores de lenguaje de máquina
  • ¡y más!

Conclusión

Este artículo presentó una descripción general de Rust como lenguaje de programación de sistemas, incluidas funciones como la seguridad de la memoria, la gestión mejorada de paquetes y más. También enumeramos recursos de aprendizaje para ayudarlo a ponerse en marcha con Rust.

Como siguiente paso, puede elegir uno o más de los recursos de aprendizaje mencionados para aprender los conceptos básicos de Rust. ¡Feliz programación de Rust!

También puede explorar algunos de los mejores proveedores de alojamiento de servidores Rust.