<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Lucas Andreussi on Medium]]></title>
        <description><![CDATA[Stories by Lucas Andreussi on Medium]]></description>
        <link>https://medium.com/@landreussi?source=rss-7fe1222f10f6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*TmVzGpTiUQXZFn2uCV6V9Q.jpeg</url>
            <title>Stories by Lucas Andreussi on Medium</title>
            <link>https://medium.com/@landreussi?source=rss-7fe1222f10f6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 08:25:29 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@landreussi/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Entenda porque Rust é a linguagem mais amada do mundo]]></title>
            <link>https://landreussi.medium.com/entenda-porque-rust-%C3%A9-a-linguagem-mais-amada-do-mundo-e8819b300437?source=rss-7fe1222f10f6------2</link>
            <guid isPermaLink="false">https://medium.com/p/e8819b300437</guid>
            <category><![CDATA[stackoverflow]]></category>
            <category><![CDATA[memory-management]]></category>
            <category><![CDATA[rustlang]]></category>
            <dc:creator><![CDATA[Lucas Andreussi]]></dc:creator>
            <pubDate>Tue, 09 Mar 2021 21:29:04 GMT</pubDate>
            <atom:updated>2021-06-29T18:24:29.711Z</atom:updated>
            <content:encoded><![CDATA[<p>Recentemente o Stack Overflow publicou os resultados da <a href="https://insights.stackoverflow.com/survey/2020">pesquisa</a> de 2020 sobre a área de programação, contando com os dados fornecidos por 65.000 desenvolvedores do mundo todo, e você com certeza deve ter se perguntado o motivo que uma linguagem tão desconhecida estava no topo, passando até mesmo de Typescript, Kotlin e Python, que são bastante amadas pelo seu público e também muito famosas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/678/0*nloeAgxqljKmn0EN" /></figure><p>Para entender o motivo de 86.1% dos desenvolvedores que utilizam Rust amar a linguagem, primeiro precisamos entender a sua origem:</p><p>Rust começou como um projeto pessoal de um funcionário da Mozilla, Graydon Hoare em 2006, o projeto passou a ser patrocinado pela empresa em 2009 e teve sua primeira versão (1.0) em 2010.</p><blockquote><em>“A linguagem foi projetada para ajudar desenvolvedores a criarem aplicações rápidas e seguras, que queiram aproveitar ao máximo as poderosas funcionalidades dos processadores modernos multi-cores. Ela previne falhas de segmentação e garante a segurança nas Threads, tudo através de uma sintaxe fácil de aprender.</em></blockquote><blockquote><em>Além disso, Rust oferece custo zero nas suas abstrações, mudanças de semânticas, garantia de segurança de memória, threads sem condições de corrida, generics baseados em traits, pattern matching (casamento de padrões), inferência de tipos e binding eficiente para C, com o menor tamanho em tempo de execução.”</em></blockquote><p><a href="https://developer.mozilla.org/pt-BR/docs/Mozilla/Rust"><em>https://developer.mozilla.org/pt-BR/docs/Mozilla/Rust</em></a></p><p>Assim como muitas empresas de tecnologia dizem, é muito difícil escrever código seguro para coisas críticas como <em>engines</em> e <em>kernels</em>, que usualmente são escritas em C/C++ pelo controle das preocupações de baixo nível e pela performance. Ocorrem frequentemente problemas como vazamento de memória e exceções por conta de problemas com ponteiros ou até mesmo como problemas de segurança como acesso indevido a endereços de memória.</p><p>Rust preenche essas lacunas, oferecendo controle e segurança para a aplicação sem abrir mão da performance, e foi exatamente por esse motivo que a Microsoft resolveu adotar a linguagem para utilizar nos seus produtos e serviços. (Veja o <a href="https://msrc-blog.microsoft.com/2019/07/18/we-need-a-safer-systems-programming-language/">artigo</a>).</p><p>Não só a Microsoft percebeu que investir nessa nova tecnologia seria uma boa idéia, como também Linus Torvalds discute sobre a inclusão do Rust em alguns módulos do Linux (Veja o <a href="https://sempreupdate.com.br/linus-torvalds-fala-sobre-inclusao-do-rust-no-kernel">artigo</a>).</p><p>A própria Discord usa Rust em produção para resolver problemas de picos de uso de CPU frequentes no acionamento do Garbage Collector (Veja o <a href="https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f?gi=19ff6574c305">artigo</a>).</p><p>Recentemente também várias big techs como Google, Microsoft, Mozilla e Amazon em conjunto lançaram uma <a href="https://foundation.rust-lang.org/">organização sem fins lucrativos</a> para ajudar a linguagem a se manter dando total suporte para os mantenedores que lideram e desenvolvem o projeto.</p><p>Aqui na <a href="https://terramagna.com.br/">TerraMagna</a> utilizamos Rust na maioria dos nossos serviços, pois precisamos entregar dados com confiabilidade e agilidade para nossos clientes, por estarmos em um ramo de negócio em que qualquer erro ou imprecisão pode custar caro, a adoção do Rust caiu como uma luva para nós.</p><p>PS: <a href="https://jobs.kenoby.com/terramagna"><em>Temos vagas</em></a><em> :D</em></p><p>A linguagem é muito parecida com OCaml, foca muito na imutabilidade e com tipagem inferida, como no Typescript:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*dv-IXufCDF8n8af4" /></figure><p>Esse é um exemplo bastante prático de como funciona a imutabilidade na linguagem, também um pouco de definição de variáveis e constantes e alguns tipos primitivos.</p><p>Perceba que a definição de números inteiros no rust é um pouco diferente, onde primeiro se especifica se o número vai ter sinal ou não, ou seja, se ele vai ser negativo ou não, e depois se especifica o tamanho em bits:</p><ul><li><strong>u:</strong> sem sinal, ou seja, somente números positivos;</li><li><strong>i: </strong>com sinal, ou seja, suporta números positivos e negativos;</li></ul><h4>Options</h4><p><a href="https://doc.rust-lang.org/std/option/enum.Option.html">Option</a> é um <a href="https://doc.rust-lang.org/rust-by-example/custom_types/enum.html#enums">enum</a> da <a href="https://doc.rust-lang.org/stable/std/">biblioteca padrão</a> do Rust que, ou carrega um valor, ou não carrega nada, é ideal para casos onde você pode ter ou não ter um certo valor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/954/0*7sYsB_FsnKXGhcqD" /></figure><p>Nesse caso, o <a href="https://doc.rust-lang.org/std/primitive.str.html#method.find">método find</a> retorna um número inteiro positivo, que é o índice daquilo que você quer encontrar, mas pode ser que esse método encontre ou não encontre isso, então este retorno passa a ser uma Option&lt;usize&gt;<em>, </em>isso significa que ele pode ser Some(indice) se ele conseguir encontrar, e None se não conseguir encontrar nada, e podemos tratar dessa forma:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*P5Tr19KVdoaeCIDo" /></figure><p>Também podemos fazer assim, caso quiséssemos simplesmente descartar o caso do None:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/836/0*BYaH-neyKFA1igjV" /></figure><h4>Results</h4><p>Uma operação também pode retornar um valor ou um erro, ou seja, pode dar certo e pode não dar certo, e para isso temos o tipo <a href="https://doc.rust-lang.org/std/result/enum.Result.html">Result</a> que é como o <a href="https://doc.rust-lang.org/std/option/enum.Option.html">Option</a> só que ele carrega um erro:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tjGQzV-iEWfrMFNh08K8HQ.png" /></figure><p>Nesse caso, se a operação de abertura de arquivo não deu certo porque o arquivo não existe, então ele retorna um Err(err) e apresenta esse erro, e se der certo, ele retorna um Ok(file) sendo file um <a href="https://doc.rust-lang.org/std/fs/struct.File.html">objeto de arquivo</a>, e se a leitura for feita com sucesso, apresenta o conteúdo deste arquivo.</p><p>Também podemos simplificar a resolução de <a href="https://doc.rust-lang.org/std/result/enum.Result.html">Result</a>s caso a função pai também retornar um <a href="https://doc.rust-lang.org/std/result/enum.Result.html">Result</a> com o mesmo tipo de erro da função filho.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fMK4a2Sjfy_TFQQU" /></figure><p>Nesse exemplo, antes de fazer uma operação de divisão, avaliamos se o denominador é zero, e se for zero, retornamos um erro, caso não for, retornamos o denominador recebido.</p><p>O operador ? permite com que o erro da função filha simplesmente suba para a função pai.</p><p>Note também que para retornar um valor de uma função basta omitir o ponto e vírgula da última instrução, e se precisar retornar antes da última instrução, então usamos o return, como em outras linguagens.</p><p>Perceba que com a existência dos tipos <a href="https://doc.rust-lang.org/std/option/enum.Option.html">Option</a> e <a href="https://doc.rust-lang.org/std/result/enum.Result.html">Result</a>, a linguagem reforça a não-existência de uma declaração para valores nulos, também há outros conceitos na linguagem que dispensam completamente a existência de valores nulos como <a href="https://doc.rust-lang.org/rust-by-example/scope/lifetime.html">lifetimes</a>, iremos falar um pouco mais disso agora.</p><h4>Ownership</h4><p>Uma das principais features do Rust é o conceito de ownership, que garante boa parte da confiabilidade em suas aplicações, é um conceito que aparenta ser simples no começo, mas que implica em algumas mudanças na forma em que você provavelmente está acostumado a escrever código.</p><p>Ownership é um conjunto de regras que são checadas em tempo de compilação com a finalidade de um gerenciamento de memória mais eficiente, e aqui estão algumas regras:</p><ul><li>Todos os elementos da aplicação podem ter somente um dono por vez;</li><li>Se algum dono sair do escopo, o valor que ele possui será dropado;</li></ul><p>Fazendo um paralelo com o mundo real, imagine que você passe a chave da sua casa para outra pessoa, você não poderia usar a sua chave mesmo que ela ainda seja sua:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/474/0*sNVS9t30TZsQGQqa" /></figure><p>O mesmo acontece nesse exemplo aqui:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/784/1*8RLji0tfuG6IA3crZmxj-Q.png" /></figure><p>Quando esse código é executado, o compilador do Rust (rustc) te retorna um erro:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/928/0*XG7Cgu0PfMZ4jPYk" /></figure><p>Isso acontece porque a função fulano consome a chave, ou seja, agora fulano detém a posse da chave.</p><p>Para que isso não aconteça, precisamos passar uma referência de chave visto que fulano não faz nada com a chave depois que ele recebe ela:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/784/1*znGKPY9NkS4OuuglfB0_Mw.png" /></figure><p>Quando executamos esse código, o conteúdo de chave é printado na tela como era esperado desde o começo.</p><p>Isso funciona porque fulano não detém mais a chave, e sim uma referência de chave então podemos printá-lo no fim da execução do código sem nenhum problema.</p><p>Lembrando que o consumo desse valor no primeiro exemplo é dado pelo motivo de que quando ele acaba de executar a função fulano, a chave sai do escopo, exatamente como diz a segunda regra de ownership, fazendo com que seja dropado da memória e impossibilitando o seu uso posteriormente.</p><p>Agora imagine um cenário onde o fulano em questão é um chaveiro e você precisa alterar sua chave, e ainda assim precisa printá-la no final, para isso basta passar uma referência mutável para fulano e fazer as alterações necessárias:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/852/1*R_RwDCsezAAKho_T6NTJZw.png" /></figure><p>Nesse caso, a função principal printaria outrachave.png, visto que o método <a href="https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str">insert_str</a> insere algum &amp;str em qualquer índice da <a href="https://doc.rust-lang.org/std/string/struct.String.html">String</a>, e como o índice nesse caso é 0 ele colocará o valor no começo da <a href="https://doc.rust-lang.org/std/string/struct.String.html">String</a>.</p><p>Lembrando que para conseguir passar uma referência mutável, é necessário que a definição do valor passado seja mut também, visto que não seria muito seguro se a linguagem deixasse mudar algo que não é mutável.</p><p>Você agora deve estar se perguntando no motivo de ora eu usar String ora eu usar str, qual é a diferença?</p><ul><li><a href="https://doc.rust-lang.org/std/string/struct.String.html">String</a> sempre será usado quando precisamos ter a posse desse valor, ou modificar esse valor.</li><li><a href="https://doc.rust-lang.org/std/primitive.str.html">str</a> é uma sequência imutável de bytes codificados em UTF-8 localizados em algum lugar na memória, basicamente o tipo <a href="https://doc.rust-lang.org/std/string/struct.String.html">String</a> serve para lidar com esse tipo primitivo de forma segura, mas quando estamos lidando somente com uma referência, podemos usar &amp;str sem nenhum problema pois nesse caso você estará apontando pra essa sequência de bytes em algum lugar da memória.</li></ul><h4>Lifetimes</h4><p>Ainda no contexto de String e str considere o seguinte pedaço de código:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i9figpCtDw7qALlPfkJ7kg.png" /></figure><p>Nesse caso, QUX e BAZ são bastante semelhantes pois ambos definem valores &amp;str que viverão enquanto a execução desse código viver. A diferença deles é que quando usamos static já é subentendido que o lifetime do valor será &#39;static que diz que o valor estará válido enquanto a execução do código viver.</p><p>Tudo que é definido possui um lifetime, mas se ele for omitido entende-se que o tempo de vida dele vai ser o mesmo do escopo, ele também pode ser explicito e como você pode ver, um lifetime pode ser anotado a partir de um &#39; e ele pode se referir à qualquer escopo inclusive o escopo de execução do programa (&#39;static).</p><p>Ele serve para definir regras que ligam referências à valores, pois ainda podemos ter uma estrutura de dados que dependa de uma referência vinda de outro lugar, o que é bastante comum:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/582/1*WlazWGZDliQRaPVbPIbpIQ.png" /></figure><p>Aqui podemos dizer que enquanto name e surname viverem, person vai viver também, ou seja person não sai do escopo enquanto surname e name não sair do escopo também.</p><p>Essa é uma feature muito importante da linguagem, porque previne problemas muito comuns em outras linguagens de ter alguma estrutura ou função que aponte pra algo que não existe mais, ocasionando em erros graves em produção.</p><p>Esse conceito também previne de que aconteça o inverso: algo que foi dropado e era dependente de outra coisa, mas essa outra coisa não foi dropada e fica na memória ocupando espaço, isso é um fenômeno conhecido como <em>memory leak.</em></p><h4>Comunidades</h4><p>Se interessou pela linguagem? Existem <a href="https://github.com/rust-br/general">várias comunidades brasileiras</a> onde tem bastante discussão e conteúdo, para poder tirar dúvidas e aprender junto!</p><p>O pessoal da @rustlangbr também preparou uma lista bem legal com vários materiais pra você deslanchar no Rust:</p><h4>Temos vagas</h4><p>Gostou da linguagem e quer trabalhar construindo serviços confiáveis feitos em Rust? Acesse o <a href="https://jobs.kenoby.com/terramagna">link</a> e #VemSerTerraMagna</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8819b300437" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>