{"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\/en\/2017\/04\/hello-world\/","title":{"rendered":"Hello World em Rust: instalando e rodando no 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 mundo come\u00e7a por um <code data-no-translation=\"\">Hello, world!<\/code>. Este post usa esse programa de tr\u00eas linhas como desculpa para instalar o <strong>Rust<\/strong> no Ubuntu direito, entender o que o <code data-no-translation=\"\">cargo<\/code> faz e sair daqui com um projeto que compila \u2014 em uns dez minutos.<\/p>\n<h2>Por que Rust, em duas frases<\/h2>\n<p>O Rust entrega desempenho de C sem coletor de lixo e, ao mesmo tempo, elimina em tempo de compila\u00e7\u00e3o a classe de bug que mais gera CVE em software de sistema: uso de mem\u00f3ria depois de liberada, estouro de buffer, corrida entre threads. O pre\u00e7o \u00e9 um compilador que discute com voc\u00ea na primeira semana.<\/p>\n<p>N\u00e3o \u00e9 linguagem de nicho: o kernel Linux tirou o selo de experimental do Rust na vers\u00e3o 7.0, em abril de 2026, e o Ubuntu 26.04 LTS j\u00e1 entrega o <code data-no-translation=\"\">sudo<\/code> e os utilit\u00e1rios b\u00e1sicos reescritos nela. A hist\u00f3ria completa est\u00e1 em <a href=\"\/en\/2026\/09\/a-historia-da-linguagem-rust\/\">A hist\u00f3ria da linguagem Rust<\/a>.<\/p>\n<h2>Instalando com rustup<\/h2>\n<p>N\u00e3o use o <code data-no-translation=\"\">apt install rustc<\/code>. O Rust lan\u00e7a a cada seis semanas e o pacote da distro fica velho r\u00e1pido \u2014 al\u00e9m de n\u00e3o dar o <code data-no-translation=\"\">rustup<\/code>, que \u00e9 quem gerencia vers\u00f5es. O caminho 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>Aceite a instala\u00e7\u00e3o padr\u00e3o (op\u00e7\u00e3o 1). Ao terminar, carregue o ambiente na sess\u00e3o atual \u2014 nas pr\u00f3ximas ele j\u00e1 entra sozinho pelo <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>Voc\u00ea deve ver algo como <code data-no-translation=\"\">rustc 1.98.1<\/code>. Se o comando n\u00e3o for encontrado, \u00e9 porque o <code data-no-translation=\"\">~\/.cargo\/bin<\/code> n\u00e3o entrou no <code data-no-translation=\"\">PATH<\/code> \u2014 the <code data-no-translation=\"\">source<\/code> acima resolve.<\/p>\n<h2>O primeiro programa, na unha<\/h2>\n<p>Antes do <code data-no-translation=\"\">cargo<\/code>, vale ver o compilador nu. Crie <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>Duas coisas para reparar. O <code data-no-translation=\"\">rustc<\/code> gerou um <strong>bin\u00e1rio nativo<\/strong> \u2014 sem VM, sem interpretador, sem runtime para instalar na m\u00e1quina de destino. E o <code data-no-translation=\"\">println!<\/code> tem uma exclama\u00e7\u00e3o: em Rust, isso significa que \u00e9 uma <em>macro<\/em>, n\u00e3o uma fun\u00e7\u00e3o comum. Voc\u00ea vai ver esse ponto de exclama\u00e7\u00e3o com frequ\u00eancia.<\/p>\n<h2>Agora do jeito certo: cargo<\/h2>\n<p>Na pr\u00e1tica ningu\u00e9m chama o <code data-no-translation=\"\">rustc<\/code> na m\u00e3o. O <strong>cargo<\/strong> \u00e9 o gerenciador de projeto, de depend\u00eancias e de build \u2014 o equivalente ao que <code data-no-translation=\"\">npm<\/code>, <code data-no-translation=\"\">pip<\/code> and <code data-no-translation=\"\">make<\/code> fazem juntos em outras linguagens.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo new ola\ncd ola\ncargo run<\/code><\/pre>\n<p>Ele cria a estrutura, compila e executa. O que apareceu:<\/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>Os comandos que voc\u00ea vai usar todo dia:<\/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>The <code data-no-translation=\"\">cargo check<\/code> \u00e9 o segredo de produtividade em Rust: enquanto voc\u00ea escreve, ele responde em uma fra\u00e7\u00e3o do tempo do <code data-no-translation=\"\">build<\/code>, porque n\u00e3o gera c\u00f3digo de m\u00e1quina.<\/p>\n<p>Se o <code data-no-translation=\"\">clippy<\/code> and the <code data-no-translation=\"\">fmt<\/code> n\u00e3o estiverem instalados:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">rustup component add clippy rustfmt<\/code><\/pre>\n<h2>Um passo al\u00e9m do &#8220;ol\u00e1&#8221;: lendo a entrada<\/h2>\n<p>Um <code data-no-translation=\"\">Hello, world!<\/code> n\u00e3o mostra nada do que torna a linguagem diferente. Este mostra \u2014 troque o conte\u00fado 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>Tr\u00eas detalhes que valem mais que o programa:<\/p>\n<ul>\n<li><strong><code data-no-translation=\"\">let mut<\/code><\/strong> \u2014 em Rust tudo \u00e9 imut\u00e1vel por padr\u00e3o. Se voc\u00ea quer poder alterar, precisa dizer. \u00c9 o inverso da maioria das linguagens, e \u00e9 de prop\u00f3sito.<\/li>\n<li><strong><code data-no-translation=\"\">&amp;mut nome<\/code><\/strong> \u2014 voc\u00ea est\u00e1 <em>emprestando<\/em> a vari\u00e1vel para a fun\u00e7\u00e3o poder escrever nela, sem transferir a posse. Esse conceito \u00e9 o cora\u00e7\u00e3o do Rust; o compilador garante que s\u00f3 existe um empr\u00e9stimo de escrita por vez.<\/li>\n<li><strong><code data-no-translation=\"\">.expect(...)<\/code><\/strong> \u2014 ler da entrada pode falhar, e o Rust obriga voc\u00ea a tratar isso. N\u00e3o existe exce\u00e7\u00e3o escondida: ou voc\u00ea lida com o erro, ou o programa n\u00e3o compila.<\/li>\n<\/ul>\n<h2>Usando uma depend\u00eancia<\/h2>\n<p>The <a href=\"https:\/\/crates.io\/\" target=\"_blank\" rel=\"noopener\">crates.io<\/a> \u00e9 o reposit\u00f3rio de pacotes da linguagem. Adicionar um \u00e9 um comando:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cargo add rand<\/code><\/pre>\n<p>Isso escreve a depend\u00eancia no <code data-no-translation=\"\">Cargo.toml<\/code> sozinho. Agora um sorteio:<\/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>Na primeira execu\u00e7\u00e3o ele baixa e compila a depend\u00eancia e todas as dela; nas seguintes usa o cache. O arquivo <code data-no-translation=\"\">Cargo.lock<\/code>, criado automaticamente, trava as vers\u00f5es exatas \u2014 <strong>versione ele<\/strong> junto com o projeto se for um bin\u00e1rio.<\/p>\n<h2>Gerando o bin\u00e1rio de produ\u00e7\u00e3o<\/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>O bin\u00e1rio em <code data-no-translation=\"\">release<\/code> \u00e9 otimizado e n\u00e3o depende do Rust estar instalado na m\u00e1quina de destino \u2014 s\u00f3 das bibliotecas do sistema. \u00c9 por isso que tanta ferramenta de linha de comando moderna \u00e9 distribu\u00edda como um arquivo \u00fanico.<\/p>\n<h2>Gerenciando vers\u00f5es do 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 fixar a vers\u00e3o de um projeto espec\u00edfico, crie um <code data-no-translation=\"\">rust-toolchain.toml<\/code> na raiz \u2014 o <code data-no-translation=\"\">rustup<\/code> passa a respeit\u00e1-lo automaticamente ali dentro.<\/p>\n<h2>Quando travar<\/h2>\n<p>Vai travar, e n\u00e3o tem problema. O compilador do Rust \u00e9 o mais did\u00e1tico que existe: ele costuma dizer n\u00e3o s\u00f3 o que est\u00e1 errado, mas o que escrever no lugar. Leia a mensagem inteira antes de procurar no Google \u2014 a resposta quase sempre est\u00e1 nela.<\/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>E, se ainda assim n\u00e3o sair, colar a mensagem num <a href=\"\/en\/2026\/09\/assistentes-de-ia-no-terminal-linux\/\">assistente de IA no terminal<\/a> resolve a maior parte dos travamentos de iniciante sem tirar voc\u00ea do teclado.<\/p>\n<h2>Por onde seguir<\/h2>\n<ul>\n<li><strong>O livro oficial<\/strong>, gratuito e em portugu\u00eas: <a href=\"https:\/\/rust-br.github.io\/rust-book-pt-br\/\" target=\"_blank\" rel=\"noopener\">O Livro do Rust<\/a>. \u00c9 a melhor porta 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 se voc\u00ea aprende melhor lendo c\u00f3digo do que texto.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/rust-lang\/rustlings\" target=\"_blank\" rel=\"noopener\">Rustlings<\/a><\/strong> \u2014 exerc\u00edcios pequenos que compilam errado de prop\u00f3sito, para voc\u00ea consertar.<\/li>\n<li>Aqui no blog: <a href=\"\/en\/2026\/09\/a-historia-da-linguagem-rust\/\">A hist\u00f3ria da linguagem Rust<\/a>, com o <em>borrow checker<\/em> explicado, e <a href=\"\/en\/2017\/05\/linguagens-de-programacao\/\">as principais linguagens de programa\u00e7\u00e3o<\/a>, para situar o Rust no mapa.<\/li>\n<\/ul>\n<p>Dez minutos, um bin\u00e1rio nativo e um caranguejo. \u00c9 um bom come\u00e7o.<\/p>\n<p style=\"font-size:.9em;opacity:.75\">Engrenagem baseada no <a href=\"https:\/\/www.rust-lang.org\/policies\/media-guide\">logo oficial do Rust<\/a> (CC BY 4.0). Ferris, mascote 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=\"Hello World em Rust: instalando e rodando no Ubuntu\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/hello-world\/\" aria-label=\"Read more about Hello World em Rust: instalando e rodando no Ubuntu\">Read more<\/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\/en\/wp-json\/wp\/v2\/posts\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":5,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"predecessor-version":[{"id":1411,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/119\/revisions\/1411"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}