Introducción a Rust 1
El objetivo de esta práctica es aprender Rust de forma eminentemente práctica mediante los ejercicios interactivos de Rustlings como herramienta principal, utilizando la documentación y el libro oficial como material de consulta puntual.
Rust es un lenguaje de programación de sistemas moderno, diseñado con dos objetivos principales: seguridad y eficiencia. Se presenta como una alternativa a C y C++ en contextos donde el control sobre la memoria y el rendimiento son fundamentales, pero al mismo tiempo elimina gran parte de los errores comunes asociados a estos lenguajes.
En particular, Rust destaca por:
- Permitir el control de bajo nivel de la memoria, como en C/C++.
- Garantizar seguridad en memoria gracias a comprobaciones en tiempo de compilación.
- Evitar errores clásicos como null pointer dereference, dangling pointers, use-after-free o data races.
Problemas de lenguajes tradicionales
C y C++ han sido durante décadas los lenguajes de referencia para la programación de sistemas y aplicaciones de alto rendimiento. Sin embargo, presentan limitaciones importantes que complican la escritura de programas seguros y concurrentes:
-
Gestión manual de memoria:
El programador debe reservar y liberar memoria explícitamente. Esto conduce a errores frecuentes como:- Memory leaks (fugas de memoria): Ocurre cuando se reserva memoria dinámica (
malloconew) pero nunca se libera (freeodelete). - Dangling pointers (punteros colgantes): Se produce cuando un puntero apunta a una dirección de memoria que ya ha sido liberada.
- Use-after-free (uso de memoria ya liberada): Acceso a memoria liberada con comportamiento indefinido.
- Memory leaks (fugas de memoria): Ocurre cuando se reserva memoria dinámica (
-
Concurrencia insegura por defecto:
En C/C++ es posible que múltiples hilos accedan a la misma región de memoria sin la debida sincronización. Esto genera data races (condiciones de carrera) y fallos intermitentes difíciles de depurar.
Rust surge para resolver estos problemas: mantiene el rendimiento de C/C++ pero añade un sistema de tipos y reglas de propiedad que impiden compilar programas inseguros.
Relevancia para la asignatura
En el contexto de la programación concurrente, Rust es especialmente interesante porque su sistema de propiedad (ownership) y préstamo (borrowing) impide que dos hilos accedan a la misma región de memoria de forma insegura. El compilador garantiza la ausencia de condiciones de carrera (data races) antes de compilar.
En lenguajes tradicionales (C, C++, Java), las condiciones de carrera ocurren cuando varios hilos acceden a la misma memoria y al menos uno modifica datos sin sincronización. Rust elimina este problema aplicando dos reglas estrictas:
- Propiedad Única (Ownership): Cada variable tiene un único dueño. Al enviar un dato a otro hilo (con
move), la propiedad se transfiere y el hilo emisor pierde el acceso, evitando accesos no autorizados a memoria compartida. - Regla de Préstamo (Borrowing): En cualquier instante, sobre una región de memoria solo se permite:
- Múltiples lectores inmutables (
&T), ó - Un único escritor mutable (
&mut T). - ¡Nunca ambos simultáneamente!
- Múltiples lectores inmutables (
Al prohibir que coexistan lectores y escritores al mismo tiempo, Rust garantiza en tiempo de compilación que las condiciones de carrera (data races) son imposibles.
Materiales de trabajo y consulta
- Herramienta principal (Práctica interactiva):
Ejercicios de Rustlings — Conjunto de ejercicios prácticos guiados por el compilador para aprender la sintaxis y semántica de Rust paso a paso. - Material de apoyo y consulta:
Libro oficial de Rust (The Rust Book) — Documentación oficial de referencia para consultar conceptos teóricos puntuales durante la resolución de ejercicios. - Documentación oficial:
Rust Documentation
Tareas prácticas
1. Preparación del entorno
- Instalar Rust y Cargo desde rustup.rs.
- Recomendación de entorno: Se recomienda abrir el proyecto y ejecutar los comandos desde el terminal integrado de VS Code (o tu IDE preferido) para trabajar cómodamente viendo el código y la salida de Rustlings en la misma pantalla.
- Instalar Rustlings e inicializar el repositorio de ejercicios:
(Al ejecutarcargo install rustlings --lockedrustlings initcd rustlingsrustlings
rustlingsen la carpeta del proyecto se inicia el modo interactivo que evalúa tus soluciones automáticamente al guardar los archivos en el editor).
2. Ejercicios en Rustlings
Resuelve en tu terminal los siguientes ejercicios interactivos orientados a adquirir las bases del lenguaje:
00_intro&01_variables: Variables y mutabilidad.02_functions: Definición y firmas de funciones.03_if: Control de flujo condicional.04_primitive_types: Tipos numéricos, booleanos, tuplas y arrays.05_vecs: Vectores dinámicos.06_move_semantics: El sistema de propiedad (ownership), transferencias (move) y préstamos (borrowing).07_structs: Estructuras de datos.08_enums: Enumeraciones y coincidencia de patrones (pattern matching).09_strings: Manejo de cadenas de texto (Stringy&str).
Nota: Estos ejercicios son autoformativos e interactivos. No requieren entrega formal, pero son muy recomendables para afianzar la base de Rust.