syntaxis/docs/howto/bootstrap_rust.md

353 lines
15 KiB
Markdown
Raw Permalink Normal View History

╔════════════════════════════════════════════════════════════════════════════╗
║ ¿QUÉ ES https://sh.rustup.rs? - EL BOOTSTRAP COMPILER ║
╚════════════════════════════════════════════════════════════════════════════╝
ANTES DE ENTENDER sh.rustup.rs, NECESITAS SABER:
El Problema Fundamental del Bootstrap
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Para compilar Rust necesitas:
├─ rustc (compilador)
└─ cargo (gestor de dependencias)
Pero rustc y cargo están ESCRITOS EN RUST
Entonces: ¿Cómo compilo Rust si necesito Rust para compilarlo?
┌─────────────────────┐
│ El Huevo y Gallina │
├─────────────────────┤
│ Necesito Rust → │
│ Para compilar → │
│ Rust │
│ │
│ ¿Cómo empiezo? │
└─────────────────────┘
LA SOLUCIÓN: Bootstrap Compiler (Compilador Pre-Compilado)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rust proporciona binarios precompilados LISTOS PARA EJECUTAR:
https://sh.rustup.rs
Script que descarga:
├─ rustc precompilado
├─ cargo precompilado
└─ Para tu sistema específico
Estos binarios están compilados EN LENGUAJE MÁQUINA
(no en Rust, sino en 1s y 0s para tu CPU)
Por eso puedes ejecutarlos sin tener Rust instalado!
════════════════════════════════════════════════════════════════════════════
¿QUÉ EXACTAMENTE ES https://sh.rustup.rs?
Es una URL que apunta a:
├─ Un SCRIPT bash
├─ Alojado en: https://sh.rustup.rs
├─ Descargable con: curl https://sh.rustup.rs
└─ Ejecutable con: bash
Cuando haces:
$ curl https://sh.rustup.rs | sh
Pasa esto:
1. curl descarga el archivo
2. bash lo ejecuta
El script contiene:
┌─────────────────────────────────────────────────────┐
│ #!/bin/bash │
│ │
│ # 1. Detecta tu arquitectura │
│ ARCH=$(uname -m) │
│ OS=$(uname -s) │
│ │
│ # 2. Descarga el toolchain precompilado │
│ if [ $ARCH = "arm64" ] && [ $OS = "Darwin" ]; then │
│ curl https://static.rust-lang.org/dist/ │
│ rust-stable-aarch64-apple-darwin.tar.gz \ │
│ -o rust.tar.gz │
│ fi │
│ │
│ # 3. Descomprime │
│ tar xzf rust.tar.gz │
│ │
│ # 4. Instala │
│ ./rust-installer/install.sh --prefix=$HOME/.rustup │
│ │
│ # 5. Configura PATH │
│ echo 'export PATH=$HOME/.cargo/bin:$PATH' >> │
│ ~/.bashrc │
│ │
└─────────────────────────────────────────────────────┘
════════════════════════════════════════════════════════════════════════════
PASO A PASO: QUÉ OCURRE CUANDO EJECUTAS
$ curl https://sh.rustup.rs | sh
PASO 1: Tu máquina descarga el script
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Tu máquina (sin Rust)
Ejecuta: curl https://sh.rustup.rs
Se conecta a: sh.rustup.rs (servidor en internet)
Descarga: Un archivo bash (~150 KB)
Pasa a: bash (el shell de tu sistema)
PASO 2: El script detecta tu arquitectura
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
El script bash hace:
├─ uname -s → "Darwin" (si es macOS)
├─ uname -m → "arm64" (si es M1/M2/M3)
├─ Concatena: → "aarch64-apple-darwin"
└─ Determina: → "Necesito descargar Rust para aarch64-apple-darwin"
PASO 3: Descarga el toolchain precompilado
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
El script ejecuta:
curl https://static.rust-lang.org/dist/rust-stable-aarch64-apple-darwin.tar.gz \
-o /tmp/rust.tar.gz
Descarga:
├─ rustc (binario compilado para ARM64)
├─ cargo (binario compilado para ARM64)
├─ std library (librerías estándar compiladas para ARM64)
└─ ~500-700 MB
Esto NO es código fuente (.rs)
Esto es BINARIO EJECUTABLE (lenguaje máquina)
PASO 4: Descomprime el archive
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
tar xzf /tmp/rust.tar.gz
Crea directorio con:
├─ rust/
│ ├─ rustc (ejecutable)
│ ├─ cargo (ejecutable)
│ ├─ rust-std-aarch64-apple-darwin/ (librerías precompiladas)
│ └─ install.sh (script de instalación)
PASO 5: Ejecuta el instalador
━━━━━━━━━━━━━━━━━━━━━━━━━
./rust/install.sh --prefix=$HOME/.rustup
Mueve archivos:
├─ ~/.rustup/toolchains/stable-aarch64-apple-darwin/bin/rustc
├─ ~/.rustup/toolchains/stable-aarch64-apple-darwin/bin/cargo
└─ ~/.rustup/toolchains/stable-aarch64-apple-darwin/lib/...
PASO 6: Configura PATH
━━━━━━━━━━━━━━━━━━━
El script añade a ~/.bashrc o ~/.zshrc:
export PATH=$HOME/.cargo/bin:$PATH
Esto hace que cargo esté accesible globalmente
PASO 7: LISTO! Ahora tienes Rust
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ rustc --version
rustc 1.75.0 (2024-02-13)
✅ FUNCIONA!
════════════════════════════════════════════════════════════════════════════
¿DÓNDE SE DESCARGAN ESTOS BINARIOS PRECOMPILADOS?
https://static.rust-lang.org/dist/
Este servidor tiene binarios precompilados para TODOS los targets:
rust-stable-aarch64-apple-darwin.tar.gz (Mac M1/M2/M3)
rust-stable-x86_64-apple-darwin.tar.gz (Mac Intel)
rust-stable-x86_64-unknown-linux-gnu.tar.gz (Linux x86_64)
rust-stable-aarch64-unknown-linux-gnu.tar.gz (Linux ARM64)
rust-stable-x86_64-pc-windows-gnu.tar.gz (Windows GNU)
rust-stable-x86_64-pc-windows-msvc.tar.gz (Windows MSVC)
... (más de 50 targets diferentes)
Cada archivo contiene:
├─ rustc compilado PARA ESE TARGET
├─ cargo compilado PARA ESE TARGET
└─ std library compilada PARA ESE TARGET
════════════════════════════════════════════════════════════════════════════
¿PERO ESPERA... ¿CÓMO SE COMPILARON ESOS BINARIOS?
Gran pregunta! Respuesta corta:
La Rust Foundation mantiene CI/CD servers que:
├─ Clonan el repo de Rust
├─ Compilan Rust CON Rust anterior
└─ Crean binarios para cada target
Ejemplo:
Rust 1.75.0 se compiló con:
Rust 1.74.0 (precompilado)
Que se compiló con Rust 1.73.0
Que se compiló con Rust 1.72.0
... (hacia atrás en el tiempo)
Hasta el primer Rust compilado con C++ (hace 10+ años)
Esto se llama "bootstrapping chain" (cadena de bootstrap)
════════════════════════════════════════════════════════════════════════════
DIAGRAMA VISUAL: EL FLUJO COMPLETO
Tu máquina sin Rust:
$ curl https://sh.rustup.rs | sh
[Script 1: sh.rustup.rs - 150 KB bash script]
├─ Detecta: aarch64-apple-darwin
├─ Descarga: rust-stable-aarch64-apple-darwin.tar.gz
[Descarga: 700 MB - Binarios precompilados ARM64]
├─ rustc (ejecutable ARM64)
├─ cargo (ejecutable ARM64)
├─ std library (compilada para ARM64)
[Script 2: rust/install.sh - Installer]
├─ Descomprime
├─ Mueve a ~/.rustup/
├─ Configura PATH
✅ Rust 1.75.0 instalado!
Ahora puedes:
$ rustc --version
rustc 1.75.0
$ cargo build --release
(Compila Rust projects desde source)
════════════════════════════════════════════════════════════════════════════
¿POR QUÉ PRECOMPILADOS Y NO DESDE FUENTE?
Razones:
1. VELOCIDAD
├─ Compilar Rust desde fuente toma 30+ minutos
└─ Descargar binario precompilado: 2-5 minutos
2. COMPLEJIDAD
├─ Compilar requiere: C++, LLVM, cmake, etc.
└─ Descargar es trivial: solo necesitas curl
3. ACCESIBILIDAD
├─ No todos tienen compilador C/C++
└─ Todos tienen curl
4. CONSISTENCIA
├─ Mismos binarios para todos (reproducibilidad)
└─ Sin variaciones por diferente compilador
════════════════════════════════════════════════════════════════════════════
ANALÓGÍA PARA ENTENDERLO MEJOR
Imagina que necesitas instalar un coche:
OPCIÓN 1: Compilar desde fuente (NO SE HACE)
├─ Necesitas: fábrica de coches, tornos, herramientas
├─ Necesitas: metales, cauchos, vidrios crudos
├─ Tiempo: 6 meses
└─ Complejo: casi imposible sin experiencia
OPCIÓN 2: Descargar precompilado (LO QUE RUST HACE)
├─ Ya existe: un coche terminado
├─ Solo necesitas: bajarlo de la grúa
├─ Tiempo: 2 horas
└─ Fácil: cualquiera puede hacerlo
Rust elige OPCIÓN 2 para bootstrap:
├─ Los desarrolladores de Rust compilan Rust
├─ Lo suben a sh.rustup.rs
├─ Tú descargas el binario terminado
└─ Tu máquina ya puede compilar código Rust
════════════════════════════════════════════════════════════════════════════
AHORA ENTIENDES EL FLUJO COMPLETO:
1. Sin Rust:
$ curl https://sh.rustup.rs | sh
Descarga binario precompilado
2. Con Rust instalado:
$ cargo build --release
Compila Rust projects desde SOURCE
Genera binarios COMPILADOS POR TI para tu máquina
3. En install.sh:
# Fase 2:
curl https://sh.rustup.rs | sh
↓ (Rust se instala)
# Fase 4:
cargo build --release --workspace
↓ (Ahora cargo está disponible)
# Compila workspace desde source
target/release/workspace (binario compilado localmente)
════════════════════════════════════════════════════════════════════════════
RESUMEN EN UNA FRASE:
"https://sh.rustup.rs es un script que descarga binarios precompilados
de Rust para tu arquitectura y los instala en tu máquina,
rompiendo el ciclo infinito de 'necesito Rust para instalar Rust'"
════════════════════════════════════════════════════════════════════════════
╔════════════════════════════════════════════════════════════════════════════╗
║ DEMO EN VIVO: Qué es realmente sh.rustup.rs ║
╚════════════════════════════════════════════════════════════════════════════╝
Vamos a ver el primer kilobyte del script real:
EOF
echo ""
echo "1. Descargando las primeras líneas del script:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
curl -s https://sh.rustup.rs | head -50 | cat