{"id":119,"date":"2017-04-05T18:55:03","date_gmt":"2017-04-05T21:55:03","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2017\/04\/hello-world\/"},"modified":"2026-09-08T11:21:59","modified_gmt":"2026-09-08T14:21:59","slug":"hello-world","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2017\/04\/hello-world\/","title":{"rendered":"Hola Mundo en Rust: instalar y ejecutar en Ubuntu"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro compilando o primeiro programa em Rust, Ferris na mesa e engrenagem 3D do Rust na parede\" src=\"\/wp-content\/uploads\/2026\/09\/hello-world-rust-v3.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<p>Todo el mundo empieza por uno <code data-no-translation=\"\">Hello, world!<\/code>. Este post usa ese programa de tres l\u00edneas como excusa para instalar el <strong>Rust<\/strong> en Ubuntu como es debido, entender lo que hace el <code data-no-translation=\"\">cargo<\/code> y salir de aqu\u00ed con un proyecto que compila, en unos diez minutos.<\/p>\n<h2>Por qu\u00e9 Rust, en dos frases<\/h2>\n<p>Rust ofrece el rendimiento de C sin recolector de basura y, al mismo tiempo, elimina en tiempo de compilaci\u00f3n la clase de fallos que m\u00e1s CVE genera en el software de sistemas: uso de memoria despu\u00e9s de liberarla, desbordamiento de b\u00fafer, condiciones de carrera entre hilos. El precio es un compilador que discute contigo la primera semana.<\/p>\n<p>No es un lenguaje de nicho: el kernel de Linux quit\u00f3 la etiqueta de experimental a Rust en la versi\u00f3n 7.0, en abril de 2026, y Ubuntu 26.04 LTS ya incluye el <code data-no-translation=\"\">sudo<\/code> y las utilidades b\u00e1sicas reescritas en \u00e9l. La historia completa est\u00e1 en <a href=\"\/es\/2026\/09\/a-historia-da-linguagem-rust\/\">La historia del lenguaje Rust<\/a>.<\/p>\n<h2>Instalando con rustup<\/h2>\n<p>No uses el <code data-no-translation=\"\">apt install rustc<\/code>. Rust lanza cada seis semanas y el paquete de la distro se queda obsoleto r\u00e1pido \u2014 adem\u00e1s de no proporcionar el <code data-no-translation=\"\">rustup<\/code>, que es quien gestiona las versiones. El camino oficial:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt update\nsudo apt install -y build-essential curl    # o Rust usa o linker do GCC\n\ncurl --proto '=https' --tlsv1.2 -sSf https:\/\/sh.rustup.rs | sh<\/code><\/pre>\n<p>Acepta la instalaci\u00f3n por defecto (opci\u00f3n 1). Al terminar, carga el entorno en la sesi\u00f3n actual \u2014 en las siguientes ya se cargar\u00e1 solo por <code data-no-translation=\"\">~\/.bashrc<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">source \"$HOME\/.cargo\/env\"\n\nrustc --version\ncargo --version<\/code><\/pre>\n<p>Deber\u00eda ver algo como <code data-no-translation=\"\">rustc 1.98.1<\/code>. Si el comando no se encuentra, es porque el <code data-no-translation=\"\">~\/.cargo\/bin<\/code> no entr\u00f3 en el <code data-no-translation=\"\">PATH<\/code> \u2014 el <code data-no-translation=\"\">source<\/code> anterior lo soluciona.<\/p>\n<h2>El primer programa, a mano<\/h2>\n<p>Antes del <code data-no-translation=\"\">cargo<\/code>, vale la pena ver el compilador nu. Cree <code data-no-translation=\"\">ola.rs<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-rust\" data-no-translation=\"\">fn main() {\n    println!(\"Ol\u00e1, mundo!\");\n}<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">rustc ola.rs\n.\/ola<\/code><\/pre>\n<p>Dos cosas para reparar. El <code data-no-translation=\"\">rustc<\/code> gener\u00f3 un <strong>binario nativo<\/strong> \u2014 sin VM, sin int\u00e9rprete, sin runtime para instalar en la m\u00e1quina de destino. Y el <code data-no-translation=\"\">println!<\/code> tiene una exclamaci\u00f3n: en Rust, eso significa que es un <em>macro<\/em>, no una funci\u00f3n com\u00fan. Ver\u00e1s este signo de exclamaci\u00f3n con frecuencia.<\/p>\n<h2>Ahora con el m\u00e9todo correcto: cargo<\/h2>\n<p>En la pr\u00e1ctica nadie llama al <code data-no-translation=\"\">rustc<\/code> a mano. El <strong>cargo<\/strong> es el gestor de proyecto, de dependencias y de build \u2014 el equivalente a lo que <code data-no-translation=\"\">npm<\/code>, <code data-no-translation=\"\">pip<\/code> e <code data-no-translation=\"\">make<\/code> hacen juntos en otros lenguajes.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo new ola\ncd ola\ncargo run<\/code><\/pre>\n<p>Crea la estructura, compila y ejecuta. Lo que ha aparecido:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-text\" data-no-translation=\"\">ola\/\n\u251c\u2500\u2500 Cargo.toml      # nome, vers\u00e3o, depend\u00eancias\n\u251c\u2500\u2500 .gitignore      # j\u00e1 vem pronto\n\u2514\u2500\u2500 src\/\n    \u2514\u2500\u2500 main.rs     # o seu c\u00f3digo<\/code><\/pre>\n<p>Los comandos que usar\u00e1s cada d\u00eda:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo run                 # compila e executa\ncargo build               # s\u00f3 compila (bin\u00e1rio em target\/debug\/)\ncargo build --release     # compila otimizado \u2014 bem mais lento, bem mais r\u00e1pido\ncargo check               # verifica se compila, SEM gerar bin\u00e1rio (o mais r\u00e1pido)\ncargo test                # roda os testes\ncargo fmt                 # formata o c\u00f3digo no padr\u00e3o da comunidade\ncargo clippy              # o linter: pega o que compila mas \u00e9 m\u00e1 ideia<\/code><\/pre>\n<p class=\"translation-block\"><code>cargo check<\/code> es el secreto de productividad en Rust: mientras escribes, responde en una fracci\u00f3n del tiempo de <code>build<\/code>, porque no genera c\u00f3digo m\u00e1quina.<\/p>\n<p class=\"translation-block\">Si <code>clippy<\/code> y <code>fmt<\/code> no est\u00e1n instalados:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">rustup component add clippy rustfmt<\/code><\/pre>\n<h2>Un paso m\u00e1s all\u00e1 del \u201chola\u201d: leyendo la entrada<\/h2>\n<p>Un <code data-no-translation=\"\">Hello, world!<\/code> no muestra nada de lo que hace al lenguaje diferente. Este s\u00ed lo muestra \u2014 cambia el contenido de <code data-no-translation=\"\">src\/main.rs<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-rust\" data-no-translation=\"\">use std::io::{self, Write};\n\nfn main() {\n    print!(\"Qual o seu nome? \");\n    io::stdout().flush().unwrap();\n\n    let mut nome = String::new();\n    io::stdin()\n        .read_line(&amp;mut nome)\n        .expect(\"falha ao ler a entrada\");\n\n    let nome = nome.trim();\n\n    if nome.is_empty() {\n        println!(\"Voc\u00ea n\u00e3o digitou nada.\");\n    } else {\n        println!(\"Ol\u00e1, {nome}! Bem-vindo ao Rust.\");\n    }\n}<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo run<\/code><\/pre>\n<p>Tres detalles que valen m\u00e1s que el programa:<\/p>\n<ul>\n<li><strong><code data-no-translation=\"\">let mut<\/code><\/strong> \u2014 en Rust todo es inmutable por defecto. Si quieres poder modificarlo, tienes que indicarlo. Es el inverso de la mayor\u00eda de lenguajes, y es a prop\u00f3sito.<\/li>\n<li><strong><code data-no-translation=\"\">&amp;mut nome<\/code><\/strong> \u2014 est\u00e1s <em>prestando<\/em> la variable a la funci\u00f3n para que pueda escribir en ella, sin transferir la propiedad. Este concepto es el coraz\u00f3n de Rust; el compilador garantiza que solo exista un pr\u00e9stamo de escritura a la vez.<\/li>\n<li><strong><code data-no-translation=\"\">.expect(...)<\/code><\/strong> \u2014 leer de la entrada puede fallar, y Rust te obliga a gestionarlo. No existe ninguna excepci\u00f3n oculta: o gestionas el error, o el programa no compila.<\/li>\n<\/ul>\n<h2>Usando una dependencia<\/h2>\n<p class=\"translation-block\"><a href=\"https:\/\/crates.io\/\" target=\"_blank\" rel=\"noopener\">crates.io<\/a> es el repositorio de paquetes del lenguaje. A\u00f1adir uno es un comando:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo add rand<\/code><\/pre>\n<p>Esto escribe la dependencia en <code data-no-translation=\"\">Cargo.toml<\/code> solo. Ahora un sorteo:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-rust\" data-no-translation=\"\">use rand::Rng;\n\nfn main() {\n    let sorteado = rand::rng().random_range(1..=100);\n    println!(\"N\u00famero sorteado: {sorteado}\");\n}<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo run<\/code><\/pre>\n<p>En la primera ejecuci\u00f3n descarga y compila la dependencia y todas sus dependencias; en las siguientes utiliza la cach\u00e9. El archivo <code data-no-translation=\"\">Cargo.lock<\/code>, creado autom\u00e1ticamente, fija las versiones exactas \u2014 <strong>incl\u00fayelo en el control de versiones<\/strong> junto con el proyecto si es un binario.<\/p>\n<h2>Generando el binario de producci\u00f3n<\/h2>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo build --release\nls -lh target\/release\/ola\n.\/target\/release\/ola<\/code><\/pre>\n<p>El binario en <code data-no-translation=\"\">release<\/code> est\u00e1 optimizado y no depende de que Rust est\u00e9 instalado en la m\u00e1quina de destino \u2014 solo de las bibliotecas del sistema. Por eso tantas herramientas de l\u00ednea de comandos modernas se distribuyen como un \u00fanico archivo.<\/p>\n<h2>Gestionando versiones de Rust<\/h2>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">rustup update                    # atualiza a toolchain\nrustup toolchain install nightly # instala o canal de desenvolvimento\ncargo +nightly build             # compila com ele, sem trocar o padr\u00e3o\nrustup default stable            # volta ao est\u00e1vel\nrustup show                      # o que est\u00e1 instalado e ativo<\/code><\/pre>\n<p>Para fijar la versi\u00f3n de un proyecto espec\u00edfico, crea un <code data-no-translation=\"\">rust-toolchain.toml<\/code> en la ra\u00edz \u2014 lo <code data-no-translation=\"\">rustup<\/code> pasa a respetarlo autom\u00e1ticamente all\u00ed dentro.<\/p>\n<h2>Cuando se atasque<\/h2>\n<p>Se va a bloquear, y no pasa nada. El compilador de Rust es el m\u00e1s did\u00e1ctico que existe: suele decir no solo qu\u00e9 est\u00e1 mal, sino qu\u00e9 escribir en su lugar. Lee el mensaje entero antes de buscar en Google \u2014 la respuesta casi siempre est\u00e1 en \u00e9l.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">rustc --explain E0502     # explica\u00e7\u00e3o longa de qualquer c\u00f3digo de erro<\/code><\/pre>\n<p class=\"translation-block\">Y, si aun as\u00ed no se soluciona, pegar el mensaje en un <a href=\"\/es\/2026\/09\/assistentes-de-ia-no-terminal-linux\/\">asistente de IA en la terminal<\/a> resuelve la mayor parte de los atascos de un principiante sin sacarte del teclado.<\/p>\n<h2>Por d\u00f3nde seguir<\/h2>\n<ul>\n<li><strong>El libro oficial<\/strong>, gratuito y en espa\u00f1ol: <a href=\"https:\/\/rust-br.github.io\/rust-book-pt-br\/\" target=\"_blank\" rel=\"noopener\">El Libro de Rust<\/a>. Es la mejor puerta de entrada que existe.<\/li>\n<li><strong><a href=\"https:\/\/doc.rust-lang.org\/rust-by-example\/\" target=\"_blank\" rel=\"noopener\">Rust by Example<\/a><\/strong> \u2014 si aprendes mejor leyendo c\u00f3digo que texto.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/rust-lang\/rustlings\" target=\"_blank\" rel=\"noopener\">Rustlings<\/a><\/strong> \u2014 ejercicios peque\u00f1os que compilan mal a prop\u00f3sito, para que los arregles.<\/li>\n<li>Aqu\u00ed en el blog: <a href=\"\/es\/2026\/09\/a-historia-da-linguagem-rust\/\">La historia del lenguaje Rust<\/a>, con el <em>borrow checker<\/em> explicado, y <a href=\"\/es\/2017\/05\/linguagens-de-programacao\/\">las principales lenguajes de programaci\u00f3n<\/a>, para situar a Rust en el mapa.<\/li>\n<\/ul>\n<p>Diez minutos, un binario nativo y un cangrejo. Es un buen comienzo.<\/p>\n<p style=\"font-size:.9em;opacity:.75\">Engranaje basado en el <a href=\"https:\/\/www.rust-lang.org\/policies\/media-guide\">logo oficial de Rust<\/a> (CC BY 4.0). Ferris, mascota extraoficial, por Karen Rustad T\u00f6lva.<\/p>","protected":false},"excerpt":{"rendered":"<p>Todo mundo come\u00e7a por um Hello, world!. Este post usa esse programa de tr\u00eas linhas como desculpa para instalar o Rust no Ubuntu direito, entender o que o cargo faz e sair daqui com um projeto que compila \u2014 em uns dez minutos. Por que Rust, em duas frases O Rust entrega desempenho de C &#8230; <a title=\"Hola Mundo en Rust: instalar y ejecutar en Ubuntu\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/es\/2017\/04\/hello-world\/\" aria-label=\"Leer m\u00e1s sobre Hello World em Rust: instalando e rodando no Ubuntu\">Leer m\u00e1s<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45,2],"tags":[302,14,397,158,396,5],"class_list":["post-119","post","type-post","status-publish","format-standard","hentry","category-desenv","category-linux","tag-cargo","tag-howto","tag-programacao","tag-rust","tag-rustup","tag-ubuntu"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":5,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"predecessor-version":[{"id":1411,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/119\/revisions\/1411"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}