Hola Mundo en Rust: instalar y ejecutar en Ubuntu

Mascote do LinuxPro compilando o primeiro programa em Rust, Ferris na mesa e engrenagem 3D do Rust na parede

Todo el mundo empieza por uno Hello, world!. Este post usa ese programa de tres líneas como excusa para instalar el Rust en Ubuntu como es debido, entender lo que hace el cargo y salir de aquí con un proyecto que compila, en unos diez minutos.

Por qué Rust, en dos frases

Rust ofrece el rendimiento de C sin recolector de basura y, al mismo tiempo, elimina en tiempo de compilación la clase de fallos que más CVE genera en el software de sistemas: uso de memoria después de liberarla, desbordamiento de búfer, condiciones de carrera entre hilos. El precio es un compilador que discute contigo la primera semana.

No es un lenguaje de nicho: el kernel de Linux quitó la etiqueta de experimental a Rust en la versión 7.0, en abril de 2026, y Ubuntu 26.04 LTS ya incluye el sudo y las utilidades básicas reescritas en él. La historia completa está en La historia del lenguaje Rust.

Instalando con rustup

No uses el apt install rustc. Rust lanza cada seis semanas y el paquete de la distro se queda obsoleto rápido — además de no proporcionar el rustup, que es quien gestiona las versiones. El camino oficial:

sudo apt update
sudo apt install -y build-essential curl    # o Rust usa o linker do GCC

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Acepta la instalación por defecto (opción 1). Al terminar, carga el entorno en la sesión actual — en las siguientes ya se cargará solo por ~/.bashrc:

source "$HOME/.cargo/env"

rustc --version
cargo --version

Debería ver algo como rustc 1.98.1. Si el comando no se encuentra, es porque el ~/.cargo/bin no entró en el PATH — el source anterior lo soluciona.

El primer programa, a mano

Antes del cargo, vale la pena ver el compilador nu. Cree ola.rs:

fn main() {
    println!("Olá, mundo!");
}
rustc ola.rs
./ola

Dos cosas para reparar. El rustc generó un binario nativo — sin VM, sin intérprete, sin runtime para instalar en la máquina de destino. Y el println! tiene una exclamación: en Rust, eso significa que es un macro, no una función común. Verás este signo de exclamación con frecuencia.

Ahora con el método correcto: cargo

En la práctica nadie llama al rustc a mano. El cargo es el gestor de proyecto, de dependencias y de build — el equivalente a lo que npm, pip e make hacen juntos en otros lenguajes.

cargo new ola
cd ola
cargo run

Crea la estructura, compila y ejecuta. Lo que ha aparecido:

ola/
├── Cargo.toml      # nome, versão, dependências
├── .gitignore      # já vem pronto
└── src/
    └── main.rs     # o seu código

Los comandos que usarás cada día:

cargo run                 # compila e executa
cargo build               # só compila (binário em target/debug/)
cargo build --release     # compila otimizado — bem mais lento, bem mais rápido
cargo check               # verifica se compila, SEM gerar binário (o mais rápido)
cargo test                # roda os testes
cargo fmt                 # formata o código no padrão da comunidade
cargo clippy              # o linter: pega o que compila mas é má ideia

cargo check es el secreto de productividad en Rust: mientras escribes, responde en una fracción del tiempo de build, porque no genera código máquina.

Si clippy y fmt no están instalados:

rustup component add clippy rustfmt

Un paso más allá del “hola”: leyendo la entrada

Un Hello, world! no muestra nada de lo que hace al lenguaje diferente. Este sí lo muestra — cambia el contenido de src/main.rs:

use std::io::{self, Write};

fn main() {
    print!("Qual o seu nome? ");
    io::stdout().flush().unwrap();

    let mut nome = String::new();
    io::stdin()
        .read_line(&mut nome)
        .expect("falha ao ler a entrada");

    let nome = nome.trim();

    if nome.is_empty() {
        println!("Você não digitou nada.");
    } else {
        println!("Olá, {nome}! Bem-vindo ao Rust.");
    }
}
cargo run

Tres detalles que valen más que el programa:

  • let mut — en Rust todo es inmutable por defecto. Si quieres poder modificarlo, tienes que indicarlo. Es el inverso de la mayoría de lenguajes, y es a propósito.
  • &mut nome — estás prestando la variable a la función para que pueda escribir en ella, sin transferir la propiedad. Este concepto es el corazón de Rust; el compilador garantiza que solo exista un préstamo de escritura a la vez.
  • .expect(...) — leer de la entrada puede fallar, y Rust te obliga a gestionarlo. No existe ninguna excepción oculta: o gestionas el error, o el programa no compila.

Usando una dependencia

crates.io es el repositorio de paquetes del lenguaje. Añadir uno es un comando:

cargo add rand

Esto escribe la dependencia en Cargo.toml solo. Ahora un sorteo:

use rand::Rng;

fn main() {
    let sorteado = rand::rng().random_range(1..=100);
    println!("Número sorteado: {sorteado}");
}
cargo run

En la primera ejecución descarga y compila la dependencia y todas sus dependencias; en las siguientes utiliza la caché. El archivo Cargo.lock, creado automáticamente, fija las versiones exactas — inclúyelo en el control de versiones junto con el proyecto si es un binario.

Generando el binario de producción

cargo build --release
ls -lh target/release/ola
./target/release/ola

El binario en release está optimizado y no depende de que Rust esté instalado en la máquina de destino — solo de las bibliotecas del sistema. Por eso tantas herramientas de línea de comandos modernas se distribuyen como un único archivo.

Gestionando versiones de Rust

rustup update                    # atualiza a toolchain
rustup toolchain install nightly # instala o canal de desenvolvimento
cargo +nightly build             # compila com ele, sem trocar o padrão
rustup default stable            # volta ao estável
rustup show                      # o que está instalado e ativo

Para fijar la versión de un proyecto específico, crea un rust-toolchain.toml en la raíz — lo rustup pasa a respetarlo automáticamente allí dentro.

Cuando se atasque

Se va a bloquear, y no pasa nada. El compilador de Rust es el más didáctico que existe: suele decir no solo qué está mal, sino qué escribir en su lugar. Lee el mensaje entero antes de buscar en Google — la respuesta casi siempre está en él.

rustc --explain E0502     # explicação longa de qualquer código de erro

Y, si aun así no se soluciona, pegar el mensaje en un asistente de IA en la terminal resuelve la mayor parte de los atascos de un principiante sin sacarte del teclado.

Por dónde seguir

Diez minutos, un binario nativo y un cangrejo. Es un buen comienzo.

Engranaje basado en el logo oficial de Rust (CC BY 4.0). Ferris, mascota extraoficial, por Karen Rustad Tölva.