From d141a17e8bd21bb9d2252871e4801f891bcf0070 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Tue, 10 Sep 2019 13:27:49 -0300 Subject: [PATCH 1/7] Presentation companion posts --- content/presentations/_index.md | 4 + .../index.md | 120 ++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 content/presentations/_index.md create mode 100644 content/presentations/porque-voce-deve-aprender-rust.md/index.md diff --git a/content/presentations/_index.md b/content/presentations/_index.md new file mode 100644 index 0000000..8fd8769 --- /dev/null +++ b/content/presentations/_index.md @@ -0,0 +1,4 @@ ++++ +transparent = true +title = "Presentation Companion Posts" ++++ diff --git a/content/presentations/porque-voce-deve-aprender-rust.md/index.md b/content/presentations/porque-voce-deve-aprender-rust.md/index.md new file mode 100644 index 0000000..14e718a --- /dev/null +++ b/content/presentations/porque-voce-deve-aprender-rust.md/index.md @@ -0,0 +1,120 @@ ++++ +title = "Porque Você Deve Aprender Rust" +date = 2019-09-10 + +[taxonomies] +tags = ["pt-br", "rust", "companion post"] ++++ + +Rust é uma nova linguagem de programação que eu acredito que deveria ser vista +por desenvolvedores, mesmo que eles não venham programar em Rust. + + + +{% note() %} +Esse post acompanha a minha apresentação [Porque Você Deve Aprender +Rust](https://presentations.juliobiason.net/porque-rust.html#/). +{% end %} + +Quando eu comecei a apresentação, eu pensei em chamar a mesma de "Porque Você +Deveria Aprender Rust"; mas eu pensei bem sobre isso e como a linguagem tem +vários conceitos interessantes, eu acho que o título correto deve ser "Porque +Você DEVE Aprender Rust". + +Mas antes de começar a falar sobre Rust, é interessante que vocês conheçam +quem está falando sobre aprender Rust: + +Eu comecei a programar a mais de 30 anos. Em todos esses anos, eu já programei +em Basic (usando número de linhas e Basic estruturado, também conhecido como +QBasic), dBase III Plus, Clipper (que foi a primeira linguagem que eu usei +profissionalmente), Pascal, Cobol (sim, Cobol, façam suas brincadeiras agora), +Delphi (cujo nome científico é "ObjectPascal" e possui algumas diferenças para +o Pascal original), C, C++, ActionScript (que é a linguagem para geração de +applets Flash sem usar o editor da Adobe), PHP (quem nunca?), JavaScript (quem +nunca?), Python, Objective-C, Clojure, Java, Scala (que eu não desejo que nem +meu pior inimigo tenha que programar nela) e Rust. E essas são as linguagens +que eu já escrevi código e que rodou. Fora essas, eu ainda conheço Haskell, +Perl e Swift, mas nessas eu não programei nada ainda. + +Mas por que eu comentei sobre isso? Porque o que eu vou comentar aqui é, +basicamente, _minha opinião_, depois de conhecer essas linguagens todas. +Então, obviamente, existe um _viés_ para os motivos que eu vou citar daqui pra +frente. + +Mas existe uma frase do Alan Perlis, criador do ALGOL, que diz "A language +that doesn't affect the way you think about programming, is not worth knowing" +(uma linguagem que não afeta o modo que você pensa sobre programação, não vale +a pena ser aprendida). E mesmo depois de todas essas linguagens citadas acima, +Rust ainda me fez repensar coisas que eu sempre pensei quando estava +programando. + +## A Parte Burocrática + +Antes de sair falando da linguagem, eu tenho que falar sobre a parte +burocrática da linguagem. Coisas como, por exemplo: + +* Rust foi criada em 2006 por Graydon Hoare. +* Rust começou a ser patrocinada em 2009 pela Mozilla Foundation. +* A versão 1.0 saiu em 2015. +* A versão atual é a 1.37. + +Rust tem uma história engraçada: Hoare começou a desenvolver a linguagem de +forma independente, em seu tempo livre. Quando ele começou a pegar gosto pela +coisa, ele veio falar com seu gerente dizendo que iria deixar a Mozilla +Foundation para poder trabalhar na sua linguagem de programação. "Que +linguagem é essa?", perguntou o gerente; Hoare afirmou que era uma linguagem +com foco em proteção de memória mas que ainda fosse uma linguagem rápida. Ao +ouvir isso, o gerente pediu para Hoare segurar o pedido de demissão e +conversou com seus superiores. E, por ter vários problemas com a estrutura em +C++ do Firefox, a Mozilla resolveu patrocinar Hoare para que ele pudesse +trabalhar na linguagem. + +Uma coisa a cuidar: Aqui eu comento que a versão atual é a 1.37. Isso pode não +ser verdade no momento que você lê esse post (ou viu a apresentação) porque a +cada 6 semanas uma nova versão do Rust é liberada. Essas versões trazem +correções de bugs e novas features. + +{% note() %} +Uma outra anedota é que o primeiro projeto em Rust foi um browser -- +normalmente a gente pensa que para primeiro projeto, as linguagens querem algo +mais simples, como um microserviço ou algo parecido, mas a equipe do Rust +partiu direto para um browser. + +O resultado, chamado [Servo](https://servo.org/), hoje faz parte do [Firefox +Quantum](https://www.mozilla.org/en-US/firefox/?gclsrc=aw.ds), o que diminui o +uso de memória e diminuiu o número de "crashes" da aplicação. + +Ainda, num certo ponto, um desenvolvedor do Chrome resolveu fazer alguns +testes, utilizando SVG animados, colocando 1 elemento animado 300 vezes numa +página. Para animar todos os elementos, o Chrome conseguia manter 30 FPS; +Firefox, 20; Servo, 300 (sim, 10 vezes mais que o Chrome!). + +Outro exemplo de Rust no Firefox é um bug que estava em aberto por 8 anos. O +bug em questão, [631527](https://bugzilla.mozilla.org/show_bug.cgi?id=631527) +-- que, na verdade, é uma feature -- seria permitir que dois elementos possam +ter os estilos definidos no CSS aplicados em mais de um elemento ao mesmo +tempo; o browser lê primeiro o HTML, constrói o DOM e depois sai aplicando o +estilo em cada um dos elementos; com dois elementos um depois do outro, seria, +teoricamente, possível aplicar o estilo no primeiro ao mesmo tempo em que +aplica no segundo. O bug ficou aberto por 8 anos e duas re-escritas foram +feitas pra tentar resolver o problema. Nenhuma conseguiu prover um resultado +funcional, por vários motivos, mas principalmente por causa da forma com a +memória era compartilhada nas threads em C++. Quando o Firefox mudou para o +Quantum (de novo, em Rust, usando a base do Servo), a correção foi (conforme +descrito por Niko Matsakis na abertura do Rust Latam 2019) "trivial". +{% end %} + +## Motivo 1 + +Em 2019, O [StackOverflow](https://stackoverflow.com/) fez uma enquete com os +visitantes, perguntando, entre várias outras perguntas, qual linguagem eles +usavam e se eles gostavam de programar nessa linguagem. No resultado dessa +enquente, [Rust aparece como a linguagem mais +amada](https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages)... +pelo 4o ano seguido. + +"Ah, mais isso é fácil! Os quatro caras que programam em Rust dizem que gostam +dela todo ano!", você deve estar dizendo. Na verdade, o percentual tem subido +desde a primeira vez, saindo de 76% em 2016 e indo a 83% em 2019. + +## Motivo 2: "Uma Linguagem de Baixo Nível Com Abstrações de Alto Nível" From 9e08d92c98d7e8b3b9ecf658173b8a95b2094d9b Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Tue, 10 Sep 2019 13:34:56 -0300 Subject: [PATCH 2/7] MD only on the file, not directory --- .../index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/presentations/{porque-voce-deve-aprender-rust.md => porque-voce-deve-aprender-rust}/index.md (100%) diff --git a/content/presentations/porque-voce-deve-aprender-rust.md/index.md b/content/presentations/porque-voce-deve-aprender-rust/index.md similarity index 100% rename from content/presentations/porque-voce-deve-aprender-rust.md/index.md rename to content/presentations/porque-voce-deve-aprender-rust/index.md From bb0162f2aa66e1b28185c60562eafdb07f622019 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Wed, 11 Sep 2019 12:37:40 -0300 Subject: [PATCH 3/7] Error messages and Performance topics --- .../porque-voce-deve-aprender-rust/index.md | 126 ++++++++++++++++++ .../rust-energy.png | Bin 0 -> 103740 bytes 2 files changed, 126 insertions(+) create mode 100644 content/presentations/porque-voce-deve-aprender-rust/rust-energy.png diff --git a/content/presentations/porque-voce-deve-aprender-rust/index.md b/content/presentations/porque-voce-deve-aprender-rust/index.md index 14e718a..9b7d55c 100644 --- a/content/presentations/porque-voce-deve-aprender-rust/index.md +++ b/content/presentations/porque-voce-deve-aprender-rust/index.md @@ -69,6 +69,19 @@ conversou com seus superiores. E, por ter vários problemas com a estrutura em C++ do Firefox, a Mozilla resolveu patrocinar Hoare para que ele pudesse trabalhar na linguagem. +{% note() %} +Eu gosto de brincar, dizendo que o Hoare chegou pro gerente dele dizendo que +iria deixar a Mozilla pra trabalhar na sua linguagem e o gerente, depois de +pedir pra ele esperar um pouco, chegou dizendo que só conseguiu 2 estagiários. + +A verdade é que Hoare realmente quis deixar a Mozilla Foundation, mas ao +explicar os motivos -- trabalhar na sua própria linguagem, cuja principal +diferença seria a proteção de memória e velocidade -- a Mozilla se interessou +pela mesma, por causa dos problemas que eles estavam encontrando ao trabalhar +com C++. Por isso a Mozilla continuou pagando Hoare para que ele trabalhasse +na sua linguagem. +{% end %} + Uma coisa a cuidar: Aqui eu comento que a versão atual é a 1.37. Isso pode não ser verdade no momento que você lê esse post (ou viu a apresentação) porque a cada 6 semanas uma nova versão do Rust é liberada. Essas versões trazem @@ -118,3 +131,116 @@ dela todo ano!", você deve estar dizendo. Na verdade, o percentual tem subido desde a primeira vez, saindo de 76% em 2016 e indo a 83% em 2019. ## Motivo 2: "Uma Linguagem de Baixo Nível Com Abstrações de Alto Nível" + +Quando comparado com C, Rust tem uma performance bem semelhante: + +![Comparativo de algumas linguagens com relação à utilização de CPU, Energia e +Memória](rust-energy.png) + +O gráfico acima foi tirado de uma pesquisa que foi feita para verificar [qual +linguagem gasta mais +energia](https://jaxenter.com/energy-efficient-programming-languages-137264.html). + +Na implementação utilizada, C foi a linguagem cujo código gerado usou menos +energia; em segundo, com uma utilização apenas 3% maior, Rust. + +Ainda, em tempo de execução, a aplicação gerada em C também é a mais rápida e +Rust fica em segundo com um tempo de execução apenas 4% maior. + +No quesito utilização de memória é que vemos algo engraçado: A linguagem que +melhor utiliza memória é Pascal, C utiliza 17% mais memória e Rust 54% a mais. +A explicação para isso pode ser pela forma como Rust trata memória, +principalmente de código, mas eu vou explicar isso melhor mais pra frente. + +E, apesar disso tudo, Rust tem implementações de: + +* Strings com tamanho crescente; +* Listas dinâmicas; +* Mapas. + +E considerando todo o tempo que eu passei programando em várias linguagens, se +amanhã surgisse uma linguagem que conseguisse ter uma performance melhor que +C, mas que eu tivesse que implementar minha própria lista encadeada, eu +acredito que botaria fogo em tudo e iria plantar batatas, porque, +honestamente, significa que nós não aprendemos nada sobre linguagens de +programação. + +# Motivo 3: Compilador É Chato, Mas Amigável + +Deixem-me mostrar um código Rust: + +```rust +fn main() { + let a = 2; + a = 3; + println!("{}", a); +} +``` + +Aqui temos nosso primeiro contato com a sintaxe de Rust: `fn` define funções; +assim como C, `main` é a função que indica onde a execução começa; `let` deixa +definir variáveis e, apesar de não mostrar nesse trecho, as variáveis são +fortemente tipadas, mas eu não precisei colocar o tipo porque o compilador +consegue inferir o tipo sozinho; linhas terminam com `;`; `println!` tem uma +exclamação porque essa função é uma macro e a exclamação é colocada para +diferenciar de funções normais (no caso, o `println!` vai ser expandido pelo +compilador por um conjunto maior de comandos). + +E esse código Rust não compila. + +Se vocês tentarem compilar esse código, vocês verão a seguinte mensagem de +erro: + +``` +3 | let a = 2; + | - + | | + | first assignment to `a` + | help: make this binding mutable: `mut a` +4 | a = 3; + | ^^^^^ cannot assign twice to immutable variable +``` + +O que acontece é que, em Rust, alem das variáveis serem fortemente tipadas, +elas também são, por padrão, imutáveis. Ou seja, não é possível, por padrão, +alterar o valor de uma variável. + +Mas prestem atenção na mensagem de erro: + +``` +4 | a = 3; + | ^^^^^ cannot assign twice to immutable variable +``` + +O compilador não apenas disse qual era o erro -- "não é possível atribuir um +valor duas vezes para uma variável imutável" (indicando, ainda qual a linha) +como também passou uma dica de como corrigir esse problema: + +``` + | help: make this binding mutable: `mut a` +``` + +{% note() %} +Essa parte da mensagem de erro é importante para o time de desenvolvimento do +Rust. + +Na Rust Latam, Esteban Kuber fez uma apresentação chamada "Friendly Ferris: +Developing Kind Compiler Errors" ("Ferris Amigável: Desenvolvendo Erros +Amigáveis do Compilador", onde "Ferris" é o nome do mascote da linguagem), +onde ele conta que foi brincar com Rust pela primeira vez e recebeu um erro do +compilador sobre o código que ele tinha escrito, mas não conseguiu entender +exatamente qual era o problema. + +Aqui fica a pergunta pra vocês: Se vocês encontrassem um erro que não +entendessem o que vocês fariam? Boa parte provavelmente diria que iria +perguntar ao Google. + +Esteban, no entanto, resolveu abrir um issue no Github da linguagem, para ver +o que iria acontecer. A resposta? "Você tem razão, a mensagem do erro é +difícil de entender, e isso é um bug do compilador. Nós vamos arrumar." +Esteban se ofereceu pra tentar encontrar o problema, recebeu uma tutoria de +como compiladores funcionam e hoje é um dos expoentes nas questões de +mensagens de erro do compilador. +{% end %} + +# Motivo 4: O Borrow Checker diff --git a/content/presentations/porque-voce-deve-aprender-rust/rust-energy.png b/content/presentations/porque-voce-deve-aprender-rust/rust-energy.png new file mode 100644 index 0000000000000000000000000000000000000000..437af43cfe5597b09fadb3699515898316cee4af GIT binary patch literal 103740 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

3oU+m)S}J{6GYJ6tY#&G8zksByrKO>4 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 literal 0 HcmV?d00001 From e5a42cdcd2eddeeb4a8e059642954e6257745736 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Mon, 16 Sep 2019 13:14:34 -0300 Subject: [PATCH 4/7] A few more points --- .../porque-voce-deve-aprender-rust/index.md | 229 +++++++++++++++++- .../rust-memory.png | Bin 0 -> 6548 bytes .../rust-reference.png | Bin 0 -> 8643 bytes 3 files changed, 222 insertions(+), 7 deletions(-) create mode 100644 content/presentations/porque-voce-deve-aprender-rust/rust-memory.png create mode 100644 content/presentations/porque-voce-deve-aprender-rust/rust-reference.png diff --git a/content/presentations/porque-voce-deve-aprender-rust/index.md b/content/presentations/porque-voce-deve-aprender-rust/index.md index 9b7d55c..6953aaf 100644 --- a/content/presentations/porque-voce-deve-aprender-rust/index.md +++ b/content/presentations/porque-voce-deve-aprender-rust/index.md @@ -117,7 +117,7 @@ Quantum (de novo, em Rust, usando a base do Servo), a correção foi (conforme descrito por Niko Matsakis na abertura do Rust Latam 2019) "trivial". {% end %} -## Motivo 1 +## Motivo 1: Quem Usa, Gosta Em 2019, O [StackOverflow](https://stackoverflow.com/) fez uma enquete com os visitantes, perguntando, entre várias outras perguntas, qual linguagem eles @@ -165,7 +165,7 @@ acredito que botaria fogo em tudo e iria plantar batatas, porque, honestamente, significa que nós não aprendemos nada sobre linguagens de programação. -# Motivo 3: Compilador É Chato, Mas Amigável +## Motivo 3: Compilador É Chato, Mas Amigável Deixem-me mostrar um código Rust: @@ -181,10 +181,17 @@ Aqui temos nosso primeiro contato com a sintaxe de Rust: `fn` define funções; assim como C, `main` é a função que indica onde a execução começa; `let` deixa definir variáveis e, apesar de não mostrar nesse trecho, as variáveis são fortemente tipadas, mas eu não precisei colocar o tipo porque o compilador -consegue inferir o tipo sozinho; linhas terminam com `;`; `println!` tem uma -exclamação porque essa função é uma macro e a exclamação é colocada para -diferenciar de funções normais (no caso, o `println!` vai ser expandido pelo -compilador por um conjunto maior de comandos). +consegue inferir o tipo sozinho (com algumas raras exceções); linhas terminam +com `;`; `println!` tem uma exclamação porque essa função é uma macro e a +exclamação é colocada para diferenciar de funções normais (no caso, o +`println!` vai ser expandido pelo compilador por um conjunto maior de +comandos). + +{% note() %} +Quem já brincou com `#define`s em C deve saber que não existe nada que indique +o que foi digitado é uma função mesmo ou um `#define` que vai ser expandido em +várias outras funções; Rust não deixa isso acontecer. +{% end %} E esse código Rust não compila. @@ -243,4 +250,212 @@ como compiladores funcionam e hoje é um dos expoentes nas questões de mensagens de erro do compilador. {% end %} -# Motivo 4: O Borrow Checker +## Motivo 4: O Borrow Checker + +O Borrow Checker é o cara que faz o Rust ser diferente de outras linguagens. E +que também mudou como eu pensava sobre programação, apesar de todas as +linguagens listadas no começo desse post. + +Por exemplo, no seguinte código: + +```rust +let a = String::from("hello"); +``` + +{% note() %} +O que está sendo feito aqui é que está sendo criada uma string -- uma lista de +caracteres que pode ser expandida, se necessário -- utilizando uma constante +que é fica (por ficar em uma página de código em memória) como valor inicial. + +Quem já mexeu com C: Isso é o mesmo que alocar uma região de memória e copiar +o conteúdo de uma variável estática para a nova região alocada. +{% end %} + +Quando vocês olham esse código, o que vocês pensam? + +Eu sempre li como "A variável `a` recebe o valor `hello`". + +Eu nunca pensei nisso como "A posição de memória apontada por `a` tem o valor +`hello`"; ou algo como `let 0x3f5cbf89 = "hello"`. + +Entretanto, é isso que o compilador do Rust faz: cada atribuição de variável é +considerada como um indicador de uma posição de memória, algo do tipo + +![Visão de memória pelo compilador do Rust](rust-memory.png) + +No caso, `a` (a nossa variável) é "dona" de uma região de memória, a +0x3f5cbf89, que tem o tamanho de 5 bytes, do tipo String. + +E aí quando tu tenta fazer uma atribuição de variáveis como, por exemplo: + +```rust +fn main() { + let a = String::from("hello"); + let _b = a; + println!("{}", a) +} +``` + +... tudo parece normal. + +Exceto que esse código não compila. + +``` +error[E0382]: borrow of moved value: `a` + --> src/main.rs:5:20 + | +4 | let _b = a; + | - value moved here +5 | println!("{}", a) + | ^ value borrowed here after move + | + = note: move occurs because `a` has type + `std::string::String`, which does not + implement the `Copy` trait +``` + +Por que? Porque a região de memória que `a` apontava (aquela que fica em +0x3f5cbf89, que tem 5 bytes e é do tipo String) agora pertence a `b`; `a` fica +apontando para... nada. E "nada", não é `null`: como todas as variáveis tem +que apontar para uma posição de memória, `a` se torna inválido e não pode mais +ser utilizado. + +"Mas e se eu precisar acessar uma posição de memória/valor em mais de um +lugar?" Bom, aí você pode usar referências, usando `&`: + +```rust +fn main() { + let a = String::from("hello"); + let _b = &a; + println!("{}", a) +} +``` + +Utilizar referências faz, basicamente, isso: + +![Visão de memória pelo compilador do Rust quando você usa referências](rust-reference.png) + +Existem várias regras que o Borrow Checker executa: + +* Uma região de memória tem apenas um dono; +* Passar um valor (região de memoria) de uma variável para outra troca o dono; +* A região é desalocada quando o dono sair de escopo; + +{% note() %} +Estas três regras estão interligadas: com a memória sendo desalocada quando a +variável sai de escopo, não precisamos mais nos preocupar em fazer `free()` +(apesar de que, agora, precisamos nos preocupar quanto tempo queremos que a +variável/região de memória permaneça alocada através dos nossos blocos de +código); tendo apenas um dono (e esse dono muda em caso de atribuição), +evita-se o problema de um "double `free()`". +{% end %} + +* Uma região de memória pode ter infinitas referências; +* ... desde que elas não durem mais que o dono da região original; + +{% note() %} +As referências não devem durar mais que a variável original para evitar que +elas continuem sendo utilizadas depois que o valor original foi feito +`free()`. +{% end %} + +* Assim como temos variáveis definidas como mutáveis, referências também podem + ser criadas como mutáveis; +* Não é possível criar referências mutáveis de variáveis imutáveis; +* Para haver uma referência mutável, é preciso que ela seja a _única_ + referência (mutável ou não). + +{% note() %} +Isso garante que não existam duas threads tentando escrever na mesma posição +de memória ao mesmo tempo. +{% end %} + +Ok, com todas essas regras, você deve estar se perguntando: E pra que serve +tudo isso? + +Duas respostas para essa pergunta: + +A primeira é o seguinte código (em Go, porque é mais fácil de explicar): + +```go +presente := Presente { ... } +canal <- presente +``` + +`presente` é uma estrutura qualquer que eu criei; `canal` é o canal de +comunicação entre duas threads; o que está sendo feito aqui é que uma thread +está criando uma estrutura e enviado para o outra thread. + +Nada demais; o problema está em fazer algo do tipo: + +```go +presente := Presente { ... } +canal <- presente +presente.abrir() +``` + +Se eu enviei o presente para outra pessoa, como foi que eu abri? Se eu mandei +uma estrutura para outra thread, como foi que o compilador deixou eu fazer uma +alteração nessa estrutura, se agora ela é da outra thread? + +A outra resposta é que chegamos ao limite do silício. Alguns podem não saber +disso, mas a pouco tempo havia uma ser "briga" entre donos de computadores pra +ver qual tinha o mais potente, e nós fazíamos isso contando vantagem com o +clock do processador: "O meu tem 3Ghz", "Ah, mas o meu tem 3Ghz _e meio_!" +Esse tipo de discussão sumiu, por um único motivo: não temos mais como fazer o +silício vibrar mais. A coisa ficou tão complexa que o que é feito agora é +colocar mais CPUs _dentro_ da CPU. + +Para tirar proveito da "CPUs dentro da CPU", precisamos de threads, e se o +compilador não proteger contra o uso inválido de memória entre as threads, nós +ainda vamos ter aqueles alertas de que a aplicação parou de funcionar as 4 da +manhã, e você vai tentar descobrir o que aconteceu e nada faz sentido. + +A ideia do Borrow Checker é tão boa que mais linguagens estão utilizando: +Swift 5 tem um controle chamado "Exclusitivy Enforcement" que é, basicamente, +um borrow checker mais light; Ada, uma das três linguagens aceitas pela MISRA +para software em que vidas humanas estão em jogo (controle de aviões, carros e +equipamentos médicos, por exemplo), ganhou um borrow checker na última versão +(pelo menos, "última" no momento em que esse post estava sendo escrito). + +## Intervalo: Anedotas + +Duas anedotas sobre a minha vida de programador: + +Numa época em que eu trabalhava num projeto gigantesco em C, eu estava +esperando minha carona para voltar pra casa enquanto uma das desenvolvedoras +estava brigando com o código. "Eu não consigo entender, " -- disse ela -- "eu +estou tentando ver o tempo que uma regra de negócio leva pra executar, mas +está dando que tá levando menos de 1 segundo, quando eu _sei_ que tem uma +pesquisa no banco que é demorada!" + +"Como é que tu tá pegando esse tempo de execução?" -- perguntei. + +"Eu faço um `localtime` no começo da execução e um `localtime` no final e vejo +a diferença." + +Nesse momento, me lembrei que `localtime` não é thread-safe: Quando o valor é +capturado, é passada uma região de memória a ser preenchida, mas cada vez que +o `localtime` é chamada, a mesma região é atualizada; o que estava acontecendo +é que as outras threads, que também estavam fazendo a chamada para `localtime` +estavam todas apontando para a mesma região de memória e todas elas estavam +mudando na mudança de valor. + +Em tempos mais recentes, estávamos trabalhando em Java e usando +`SimpleDateFormatter`. Em certos casos, começamos a receber alertas do tipo +"Data inválida: ''" ou "Data inválida: "R"". "Mas como? Tá aqui o JSON de +entrada e lá _tem_ valor!" + +Mais uma vez, acendeu a luzinha na minha cabeça e a primeira coisa que eu fiz +foi pesquisar "SimpleDateFormatter é thread-safe?" O primeiro resultado foi +um "Por que SimpleDateFormat não é thread-safe?" Trocamos pela versão mais +nova (outra classe) e tudo passou a funcionar normalmente. + +Aí vem a pergunta: Se usássemos Rust ao invés de C ou Java, isso resolveria +nossos problemas?" + +A resposta é "Sim!", porque o Rust sequer ia deixar o código compilar -- +porque, em ambos os casos, temos threads compartilhando memória mutável, que, +como vimos pelas regras do Borrow Checker, não é possível fazer em Rust. + +## Motivo 5: Tipos Algébricos diff --git a/content/presentations/porque-voce-deve-aprender-rust/rust-memory.png b/content/presentations/porque-voce-deve-aprender-rust/rust-memory.png new file mode 100644 index 0000000000000000000000000000000000000000..1db55bc79f256b0002e04c6505e542d7550ccbcc GIT binary patch literal 6548 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 literal 0 HcmV?d00001 diff --git a/content/presentations/porque-voce-deve-aprender-rust/rust-reference.png b/content/presentations/porque-voce-deve-aprender-rust/rust-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..394b801423be0f0124b31c14dcfbdc6b53ef6257 GIT binary patch literal 8643 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 M71ZU6ADR3A2b&^aFaQ7m literal 0 HcmV?d00001 From f27104188572c3d5583a259cc221726a2fd1ccf7 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Mon, 23 Sep 2019 13:13:17 -0300 Subject: [PATCH 5/7] More things about Rust --- .../porque-voce-deve-aprender-rust/index.md | 217 +++++++++++++++++- 1 file changed, 210 insertions(+), 7 deletions(-) diff --git a/content/presentations/porque-voce-deve-aprender-rust/index.md b/content/presentations/porque-voce-deve-aprender-rust/index.md index 6953aaf..2e12a76 100644 --- a/content/presentations/porque-voce-deve-aprender-rust/index.md +++ b/content/presentations/porque-voce-deve-aprender-rust/index.md @@ -22,7 +22,7 @@ vários conceitos interessantes, eu acho que o título correto deve ser "Porque Você DEVE Aprender Rust". Mas antes de começar a falar sobre Rust, é interessante que vocês conheçam -quem está falando sobre aprender Rust: +quem está dizendo que vocês "devem aprender Rust": Eu comecei a programar a mais de 30 anos. Em todos esses anos, eu já programei em Basic (usando número de linhas e Basic estruturado, também conhecido como @@ -34,7 +34,7 @@ applets Flash sem usar o editor da Adobe), PHP (quem nunca?), JavaScript (quem nunca?), Python, Objective-C, Clojure, Java, Scala (que eu não desejo que nem meu pior inimigo tenha que programar nela) e Rust. E essas são as linguagens que eu já escrevi código e que rodou. Fora essas, eu ainda conheço Haskell, -Perl e Swift, mas nessas eu não programei nada ainda. +Perl, um pouco de Ruby e Swift, mas nessas eu não programei nada ainda. Mas por que eu comentei sobre isso? Porque o que eu vou comentar aqui é, basicamente, _minha opinião_, depois de conhecer essas linguagens todas. @@ -252,9 +252,9 @@ mensagens de erro do compilador. ## Motivo 4: O Borrow Checker -O Borrow Checker é o cara que faz o Rust ser diferente de outras linguagens. E -que também mudou como eu pensava sobre programação, apesar de todas as -linguagens listadas no começo desse post. +O Borrow Checker é a funcionalidade que faz o Rust ser diferente de outras +linguagens. E que também mudou como eu pensava sobre programação, apesar de +todas as linguagens listadas no começo desse post. Por exemplo, no seguinte código: @@ -265,7 +265,7 @@ let a = String::from("hello"); {% note() %} O que está sendo feito aqui é que está sendo criada uma string -- uma lista de caracteres que pode ser expandida, se necessário -- utilizando uma constante -que é fica (por ficar em uma página de código em memória) como valor inicial. +que é fixa (por ficar em uma página de código em memória) como valor inicial. Quem já mexeu com C: Isso é o mesmo que alocar uma região de memória e copiar o conteúdo de uma variável estática para a nova região alocada. @@ -286,7 +286,7 @@ considerada como um indicador de uma posição de memória, algo do tipo No caso, `a` (a nossa variável) é "dona" de uma região de memória, a 0x3f5cbf89, que tem o tamanho de 5 bytes, do tipo String. -E aí quando tu tenta fazer uma atribuição de variáveis como, por exemplo: +E aí você faz uma atribuição de variáveis como, por exemplo: ```rust fn main() { @@ -459,3 +459,206 @@ porque, em ambos os casos, temos threads compartilhando memória mutável, que, como vimos pelas regras do Borrow Checker, não é possível fazer em Rust. ## Motivo 5: Tipos Algébricos + +("Tipos Algébricos", no nosso caso, é só um nome bonito para parecer +inteligente ao invés de dizer "Enums".) + +Rust, assim como várias outras linguagens, tem enums: + +```rust +enum IpAddr { + V4, + V6 +} +``` + +{% note() %} +Quando eu estava estuando sobre isso, eu descobri que as opções de um enum são +chamadas "variantes". +{% end %} + +Mas além de ter enum, uma das coisas que Rust permite é que as opções do enum +carreguem um valor com elas. + +```rust +enum IpAddr { + V4(String), + V6(String), +} +``` + +Aqui temos um enum com duas opções, `V4` e `V6`; cada um dessas opções carrega +uma string junto. + +Mas como se usa isso? + +```rust +let home = IpAddr::V4(String::from("127.0.0.1")); +``` + +É bem parecido com a forma em que definimos os valores de enumerações em +outras linguagens, com a String como parâmetro. + +É importante notar que não é preciso que todas as opções tenham os mesmos +parâmetros, e é possível ter opções sem nenhum parâmetro ou mesmo mais de um. + +E, para acessar os elementos, usamos `match`: + +```rust +match home { + V4(address) => println!("IPv4 addr: {}", address), + V6(address) => println!("Ipv6 addr: {}", address), +} +``` + +`match` usa pattern matching para validar as opções. No caso, se `home` for +`V4` com um valor dentro, o valor é extraído e o `println!` com a string +`IPv4` é usada; se for `V6`, o outro `println!` é usado. + +A parte interessante é que se amanhã surgir o IPv8, e eu adicionar `V8` no meu +enum, o código vai parar de compilar. Por que? Porque o pattern matching tem +que ser exaustivo -- ou seja, tem que capturar todas as opções possíveis. Isso +é importante para coisas como, por exemplo: + +```rust +enum Option { + Some(T), + None +} +``` + +Esse enum é o substituto para coisas com `null`; lembre-se que, em Rust, todas +as variáveis devem apontar para uma região de memória e `null` não é um +posição de memória e, por isso, Rust não tem `null`s. Assim, uma função que +poderia retornar `null` tem que retornar um `Option` e, quando é tratado o +retorno da função, é preciso tratar o valor do retorno de sucesso (`Some`) _e_ +o valor com `null` (`None`); não é possível acessar o valor com o valor de +sucesso sem tetar o que acontece se não vier valor. + +E isso nos leva ao próximo motivo que é... + +## Error Control + +Antes de entrar na questão de como Rust faz o tratamento de erros, deixem me +mostrar alguns exemplos de tratamentos em outras linguagens: + +Em Python: + +```python +try: + something() +except Exception: + pass +``` + +Em Java: + +```java +try { + something(); +} catch (Exception ex) { + System.out.println(ex); +} +``` + +Ou em C: + +```c +FILE* f = fopen("someting.txt", "wb"); +fprintf(f, "Done!"); +fclose(f); +``` + +Qual o problema com esses três exemplos? + +O problema é que em nenhum deles a situação do erro foi realmente tratada -- a +versão em C é a pior delas, pois se o `fopen` falhar por algum motivo, ele +retorna um `null` e tentar fazer um `fprintf` em um `null` gera um +Segmentation Fault. + +{% note() %} +Eu já fiz todos esses, na minha vida. +{% end %} + +Desde a base das bibliotecas do Rust, as funções retornam esse enum: + +```rust +enum Result { + Ok(T), + Err(E), +} +``` + +Como isso ajuda em alguma coisa? Bom, se tudo retorna `Result`, isso significa +que a única forma que eu tenho para pegar o resultado do sucesso é lidar com o +caso do erro, porque o `match` não vai deixar que eu simplesmente ignore isso. + +No nosso caso do C, o correspondente seria: + +```rust +match File::create("something.txt") { + Ok(fp) => fp.write_all(b"Hello world"), + Err(err) => println!("Failure! {}", err), +} +``` + +Ou seja, a única forma que eu tenho de pegar o `fp` (file pointer) pra poder +escrever no arquivo é usando um match tratando o `Ok` (sucesso) e `Err` +(erro), e eu não tenho como pegar o `fp` sem fazer esse tratamento todo. + +A única coisa que faltou é que o write também pode falhar; então teríamos + +```rust +match File::create("something.txt") { + Ok(fp) => match fp.write_all(b"Hello world") { + Ok(_) => (), + Err(err) => println!("Can't write! {}", err), + } + Err(err) => println!("Failure! {}", err), +} +``` + +... e aqui já estamos ficando verbosos demais. Para facilitar um pouco a vida, +o enum `Result` do Rust tem uma função chamada `.unwrap()`, que faz o +seguinte: se o resultado do `Result` for `Ok`, já extrai o valor e retorna o +valor em si; se o resultado for `Err`, chama um `panic!`, que faz a aplicação +"capotar": + +```rust +let mut file = File::create("something.txt").unwrap(); +file.write(b"Hello world").unwrap(); +``` + +"Mas Júlio", você deve estar pensando, "isso não é diferente do segmentation +fault". Em matéria de resultado final, não; mas se vocês pensarem bem, o que +está sendo feito é que explicitamente eu estou colocando um "aqui a aplicação +pode explodir", e não que alguma coisa em tempo de execução vai derrubar a +aplicação. E a palavra chave aqui é "explicitamente"; alguém pode considerar +que não tratar o `null` do `fopen` também é uma forma de deixar um "aqui a +aplicação pode explodir", mas não foi o compilador que deixou isso acontecer; +sempre que pode, ele tentou me impedir de fazer burrada. + +Outra forma de lidar com `Result` é o operador `?`: esse operador só funciona +em funções que também tem um retorno do tipo `Result`; o que ela faz é que +caso a chamada de função retorne um `Err`, esse `Err` é passado como retorno +da função com o operador; se a função retornar um `Ok`, então o valor +encapsulado é retornado diretamente. Mais uma vez no nosso exemplo da escrita +em arquivo: + +```rust +let mut file = File::create("something.txt")?; +file.write(b"Hello world")?; +OK(()) +``` + +O que acontece é que agora essas três linhas _tem_ que estar dentro uma função +com um `Result`. + +"Ah, barbada", você pensa, "vou botar `?` em tudo e nunca lidar com o erro". +Bom, sim, é uma opção, mas existe uma função que não se pode ter `Result`: a +`main`. Assim, mais cedo ou mais tarde, o erro _vai_ ter que ser lidado. + +{% note() %} +Existe uma forma de fazer o `main` retornar `Result`, mas ele basicamente +serve para transformar o `Result` num código de erro -- ou 0 em sucesso. +{% end %} From dfc3feb160a643dcb942a9d1c39a2678c720b526 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Tue, 24 Sep 2019 13:07:19 -0300 Subject: [PATCH 6/7] Generics+traits --- .../porque-voce-deve-aprender-rust/index.md | 226 +++++++++++++++++- 1 file changed, 225 insertions(+), 1 deletion(-) diff --git a/content/presentations/porque-voce-deve-aprender-rust/index.md b/content/presentations/porque-voce-deve-aprender-rust/index.md index 2e12a76..e156511 100644 --- a/content/presentations/porque-voce-deve-aprender-rust/index.md +++ b/content/presentations/porque-voce-deve-aprender-rust/index.md @@ -187,6 +187,13 @@ exclamação é colocada para diferenciar de funções normais (no caso, o `println!` vai ser expandido pelo compilador por um conjunto maior de comandos). +Outra coisa a notar é que não estamos definindo o tipo de variável que `a` é. +Rust é uma linguagem fortemente e estaticamente tipada. O que está acontecendo +é que estamos deixando o compilador inferir qual o tipo que `a` deve ter -- e +por ser um inteiro, provavelmente vai ser um u32 ou u64, dependendo da +arquitetura, pois para desambiguação, Rust usa o tipo que gere um código mais +rápido, mesmo que ocupe mais memória. + {% note() %} Quem já brincou com `#define`s em C deve saber que não existe nada que indique o que foi digitado é uma função mesmo ou um `#define` que vai ser expandido em @@ -537,7 +544,7 @@ sucesso sem tetar o que acontece se não vier valor. E isso nos leva ao próximo motivo que é... -## Error Control +## Motivo 6: Error Control Antes de entrar na questão de como Rust faz o tratamento de erros, deixem me mostrar alguns exemplos de tratamentos em outras linguagens: @@ -662,3 +669,220 @@ Bom, sim, é uma opção, mas existe uma função que não se pode ter `Result`: Existe uma forma de fazer o `main` retornar `Result`, mas ele basicamente serve para transformar o `Result` num código de erro -- ou 0 em sucesso. {% end %} + +## Motivo 7: Generics & Traits + +Antes de entrar direto sobre generics e traits, vamos falar sobre qual +estrutura Rust usa para guardar os dados. + +Rust usa structs, como C, e não classes como C++ e mais uma gama de outras +linguagens. + +Por exemplo: + +```rust +struct Gift { + package_color: String, + content: String +} +``` + +Lembram que eu no começo comentei que Rust era fortemente e estaticamente +tipada e que o compilador estava inferindo o tipo dos dados para nós? Bom, +para estruturas isso não funciona, e por isso precisamos definir os tipos +aqui. + +Para criar um elemento dessa estrutura, usamos + +```rust +let presente = Gift { package_color: "red", content: "A GIFT!" }; +``` + +{% note() %} +Eu normalmente não comento isso nas apresentações que eu faço, mas é possível +criar uma estrutura do tipo + +```rust +struct Gift(String); +``` + +Essa estrutura tem os campos com nomes anônimos e temos que acessar com `.0` +ou `.1` (se tiver um segundo campo nessa estrutura) e assim por diante. + +Esse tipo de construção normalmente é usada para forçar novos tipos no +sistema, já que se eu quisesse receber um tipo específico de String, eu +usaria algo do tipo. + +Outro exemplo, que talvez fique mais claro: + +```rust +struct Celcius(f32); +struct Farenheit(f32); +``` + +Duas estruturas -- dois tipos -- que englobam floats, mas quando eu estiver +lendo o código e ver uma função do tipo `convert(c: Celcius)`, eu sei +exatamente qual a unidade de temperatura que eu preciso passar, deixando o +código mais claro de ser lido. +{% end %} + +Generics -- a possibilidade de não definir o tipo de um dado previamente é +feito como em Java, onde os tipos genéricos são listados entre `<>`: + +```rust +struct Point { + x: T, + y: T, +} +``` + +Se eu quiser criar um `Point` com floats de 32 bits: + +```rust +let my_point = Point(x: 1.0, y: 2.0); +``` + +Além de aplicar Generics para estruturas, podemos aplicar o mesmo para enums +-- e nós já vimos dois exemplos disso: + +```rust +enum Option { + Some(T), + None +} +``` + +Option, o substituto de coisas que podem ser null/não ter valor é uma +enumeração com `Some` que carrega um tipo qualquer, definido quando se cria +uma variável com essa variante -- e é possível deixar o compilador inferir +qual o tipo, assim como fizemos com `a` nos primeiros exemplos: + +```rust +let has_value = Some(2); +``` + +Outro exemplo básico de enum genérico: + +```rust +enum Result { + Ok(T), + Err(E), +} +``` + +`Result` também permite que sejam carregados valores com as variantes; no +caso, tanto o tipo do `Ok` quanto `Err` são genéricos e possivelmente +diferentes -- `Ok` pode ter um tipo `T`, enquanto `Err` tem um tipo qualquer +`E`, e não há nada obrigando os dois a terem o mesmo tipo, como seria se +tivéssemos: + +```rust +enum Result { + Ok(T), + Err(T) +} +``` + +... onde tanto o tipo do sucesso quanto de erro devem ser do mesmo tipo. + +{% note() %} +Em tempo de compilação, Rust vai resolver todos os tipos que as +estruturas, enums e funções genéricas usam e vai gerar o código para esses +tipos -- ou seja, se eu tivesse duas funções que retornam `Result`, uma com +`Result` e `Result`, em tempo de compilação seriam +geradas duas versões diferentes de `Result`, com os tipos já definidos. + +A vantagem disso é que, em tempo de execução, não é preciso tentar detectar o +tipo que está sendo passado, já que ele já foi definido muito antes. O +problema é que o código pode ficar maior -- e isso deve explicar o tamanho dos +executáveis como foi mostrado lá no começo do post. +{% end %} + +Além de estruturas de dados, é possível adicionar funções atreladas à essas +estruturas: + +```rust +impl Gift { + fn yell_content(&self) { + println!("{}", self.content); + } +} +``` + +(Com exceção de hierarquias, o resultado é bem semelhante à programação +orientada e objetos.) + +Ainda é possível definir interfaces que várias estruturas devem implementar, +utilizando-se traits: + +```rust +trait Summary { + fn summarize(&self) -> String; +} +``` + +Essa trait indica que, qualquer estrutura que queira ser compatível com ela, +tem que implementar uma função `summarize` que retorna uma `String`. + +Para definir que uma estrutura segue a trait, utiliza-se `impl/for`: + +```rust +struct Phrase { + phrase: String +} + +impl Summary for Phrase { + fn summarize(&self) -> String { + self.phrase + .split_whitespace() + .map(|word| word.chars().nth(0).unwrap()) + .collect() + } +} +``` + +{% note() %} +Se você está com curiosidade com relação ao código acima: + +1. Pega o `phrase`, que foi definido na estrutura como `String`; +2. Quebra essa string pelos espaços em branco (`split_whitespace`), gerando + uma lista; +3. Transforma (`map`) cada elemento da lista (que chamamos de `word` nesse + caso) para pegar o primeiro elemento da lista de caracteres que forma a + string (`chars().nth(0).unwrap()`). O `unwrap` está aqui porque `nth` + retorna um `Option`, já que pode ser chamado com um número maior que + caracteres na String, retornando `None` nesse caso; o `unwrap` serve para + pegarmos diretamente o valor do `Some` e, por sorte, não vai haver nenhum + pedaço da string quebrada com `split_whitespace` que não tenha nenhum + caractere; +4. Junta (`collect`) todos os elementos. Como Strings são arrays/listas de + caracteres, há uma conversão direta para String. + +Ou seja, a função pega uma string como "Porque Você Deve Aprender Rust" e +retorna "PVDAR". +{% end %} + +Traits funcionam com Generics, e assim podemos forçar a receber +estruturas/enums que tenham certas características, como em: + +```rust +fn get_summary<T>(summarizable: T) -> String + where T: Summary +{ + ... +} +``` + +Aqui temos uma função genérica que recebe um tipo qualquer `T`, mas obrigamos, +através do `where` que esse tipo implemente a trait `Summary` -- e assim +podemos chamar `summarizable.summarize()` sem problemas, porque a trait obriga +o tipo a ter essa função implementada. + +Outra vantagem desse formato é que podemos ter traits próprias do nosso +sistema, mas implementar a trait para tipos já definidos na linguagem: + +```rust +impl Summary for String { ... } +``` + +## Motivo 8: Cargo From cb179a494674a0a24d6dab698f1a28845d57fc31 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Wed, 25 Sep 2019 13:05:22 -0300 Subject: [PATCH 7/7] And that is it for the Rust presentation --- .../porque-voce-deve-aprender-rust/index.md | 235 ++++++++++++++++-- .../rust-issues.png | Bin 0 -> 18314 bytes 2 files changed, 215 insertions(+), 20 deletions(-) create mode 100644 content/presentations/porque-voce-deve-aprender-rust/rust-issues.png diff --git a/content/presentations/porque-voce-deve-aprender-rust/index.md b/content/presentations/porque-voce-deve-aprender-rust/index.md index e156511..f78bdd7 100644 --- a/content/presentations/porque-voce-deve-aprender-rust/index.md +++ b/content/presentations/porque-voce-deve-aprender-rust/index.md @@ -1,6 +1,6 @@ +++ title = "Porque Você Deve Aprender Rust" -date = 2019-09-10 +date = 2019-09-25 [taxonomies] tags = ["pt-br", "rust", "companion post"] @@ -187,6 +187,12 @@ exclamação é colocada para diferenciar de funções normais (no caso, o `println!` vai ser expandido pelo compilador por um conjunto maior de comandos). +{% note() %} +Quem já brincou com `#define`s em C deve saber que não existe nada que indique +o que foi digitado é uma função mesmo ou um `#define` que vai ser expandido em +várias outras funções; Rust não deixa isso acontecer. +{% end %} + Outra coisa a notar é que não estamos definindo o tipo de variável que `a` é. Rust é uma linguagem fortemente e estaticamente tipada. O que está acontecendo é que estamos deixando o compilador inferir qual o tipo que `a` deve ter -- e @@ -194,12 +200,6 @@ por ser um inteiro, provavelmente vai ser um u32 ou u64, dependendo da arquitetura, pois para desambiguação, Rust usa o tipo que gere um código mais rápido, mesmo que ocupe mais memória. -{% note() %} -Quem já brincou com `#define`s em C deve saber que não existe nada que indique -o que foi digitado é uma função mesmo ou um `#define` que vai ser expandido em -várias outras funções; Rust não deixa isso acontecer. -{% end %} - E esse código Rust não compila. Se vocês tentarem compilar esse código, vocês verão a seguinte mensagem de @@ -643,10 +643,9 @@ pode explodir", e não que alguma coisa em tempo de execução vai derrubar a aplicação. E a palavra chave aqui é "explicitamente"; alguém pode considerar que não tratar o `null` do `fopen` também é uma forma de deixar um "aqui a aplicação pode explodir", mas não foi o compilador que deixou isso acontecer; -sempre que pode, ele tentou me impedir de fazer burrada. +sempre que pode, o compilador do Rust tentou me impedir de fazer burrada. -Outra forma de lidar com `Result` é o operador `?`: esse operador só funciona -em funções que também tem um retorno do tipo `Result`; o que ela faz é que +Outra forma de lidar com `Result` é o operador `?`: o que ela faz é que caso a chamada de função retorne um `Err`, esse `Err` é passado como retorno da função com o operador; se a função retornar um `Ok`, então o valor encapsulado é retornado diretamente. Mais uma vez no nosso exemplo da escrita @@ -658,8 +657,9 @@ file.write(b"Hello world")?; OK(()) ``` -O que acontece é que agora essas três linhas _tem_ que estar dentro uma função -com um `Result`. +Como o operador vai fazer com que a função em que essas linhas estão retornem +o `Err` se a chamada falhar, essas três linhas _tem_ que estar dentro uma +função que retorne um `Result`. "Ah, barbada", você pensa, "vou botar `?` em tudo e nunca lidar com o erro". Bom, sim, é uma opção, mas existe uma função que não se pode ter `Result`: a @@ -702,9 +702,7 @@ let presente = Gift { package_color: "red", content: "A GIFT!" }; Eu normalmente não comento isso nas apresentações que eu faço, mas é possível criar uma estrutura do tipo -```rust -struct Gift(String); -``` +`struct Gift(String);` Essa estrutura tem os campos com nomes anônimos e temos que acessar com `.0` ou `.1` (se tiver um segundo campo nessa estrutura) e assim por diante. @@ -715,7 +713,7 @@ usaria algo do tipo. Outro exemplo, que talvez fique mais claro: -```rust +``` struct Celcius(f32); struct Farenheit(f32); ``` @@ -777,7 +775,7 @@ diferentes -- `Ok` pode ter um tipo `T`, enquanto `Err` tem um tipo qualquer tivéssemos: ```rust -enum Result { +enum Result { Ok(T), Err(T) } @@ -817,7 +815,7 @@ utilizando-se traits: ```rust trait Summary { - fn summarize(&self) -> String; + fn summarize(&self) -> String; } ``` @@ -832,7 +830,7 @@ struct Phrase { } impl Summary for Phrase { - fn summarize(&self) -> String { + fn summarize(&self) -> String { self.phrase .split_whitespace() .map(|word| word.chars().nth(0).unwrap()) @@ -866,7 +864,7 @@ Traits funcionam com Generics, e assim podemos forçar a receber estruturas/enums que tenham certas características, como em: ```rust -fn get_summary<T>(summarizable: T) -> String +fn get_summary(summarizable: T) -> String where T: Summary { ... @@ -886,3 +884,200 @@ impl Summary for String { ... } ``` ## Motivo 8: Cargo + +[Cargo](https://doc.rust-lang.org/cargo/) é o gerenciador de pacotes e +dependências do Rust. Ele também serve como gerenciador de projetos e +frontend para outras funcionalidades, como executar testes. + +Cargo é interessante porque faz parte do pacote principal do Rust -- em outras +palavras, a linguagem já vem com um eco-sistema completo. + + +## Motivo 9: Testes + +Rust já vem com testes integrados -- e, como comentado no motivo anterior, +Cargo serve como facilitador para a execução dos testes. + +Por exemplo, o seguinte código mostra um teste em Rust: + +```rust +#[cfg(test)] +mod tests { + #[test] + fn testing() { + assert!(1 == 1); + } +} +``` + +Esse teste não precisa estar num arquivo específico (mas ajuda se você coloca +num arquivo específico); ele não precisa estar em um módulo específico (ou +seja, aquele `mod tests` não necessariamente precisa existir ou mesmo se +chamar `tests`); e as funções não precisam começar com um nome específico. +Tudo que você precisa é definir que o código somente vai existir na +configuração de testes (`#[cfg(test)]`) e marcar cada função que deve ser +chamada durante os testes (`#[test]`). + +Para ver os resultados do teste: + +``` +$ cargo test + Compiling adder v0.1.0 (file:///projects/adder) + Finished dev [unoptimized + debuginfo] target(s) in 0.22 secs + Running target/debug/deps/adder-ce99bcc2479f4607 + +running 1 test +test tests::testing ... ok +``` + +Ao executar `cargo test`, todos os arquivos marcados com testes são compilados +(porque o cargo já ativou a configuração de testes e os blocos marcados são +finalmente adicionados) e executa os testes, mostrando o resultado de cada um. +Não é preciso uma biblioteca externa ou comandos a mais para escrever um +teste. + +{% note() %} +Uma coisa curiosa sobre o `cargo test` é que ele também sai executando tudo +que estiver no diretório `examples`, que normalmente contém exemplos de como +uma biblioteca funciona. + +A parte interessante sobre isso é que durante a execução de testes de várias +bibliotecas, também é validado se os exemplos estão corretos. +{% end %} + +## Motivo 10: Macros + +Macros são uma ferramenta poderosa mas realmente complexa do Rust. Tão +complexa que eu não cheguei a me aprofundar muito, mas como exemplo, deixem-me +mostrar uma biblioteca do Rust, chamada +[Log-Derive](https://docs.rs/log-derive/): + +```rust +#[logfn(ok = "TRACE", err = "ERROR")] +fn call_isan(num: &str) -> Result { + if num.len() >= 10 && num.len() <= 15 { + Ok(Success) + } else { + Err(Error) + } +} +``` + +A parte da macro está no começo da função, no `#[logfn(ok = "TRACE", err = +"ERROR")]`; o que ela indica é que se a função terminar com o status de `Ok`, +deve ser gerado um log no nível "TRACE" (abaixo de "DEBUG") e se a função sair +com status de `Err`, deve ser gerado um log no nível de "ERROR". + +E aí eu pergunto: Você consegue ver alguma linha de log no código da função? +Isso é porque a macro do Log-Derive consegue acessar o código em tempo de +compilação e adicionar/alterar certas construções. + +{% note() %} +Na verdade, eu sei que existem três tipos diferentes de macros em Rust: + +1. Macros mais simples, como a `println!`, que se expandem para uma combinação + maior de comandos (`println!` expande para a aquisição do lock da escrita + padrão -- stdout -- envio dos dados para a saída e liberação do lock, mas + você nunca teve que escrever tudo isso por conta); +2. Macros de implementação de funções em estruturas, que basicamente fazem a + geração de funções como vimos com `impl`; +3. E macros como a Log-Derive, que tem acesso aos tokens que formam o código + fonte e geram uma saída de tokens novamente -- e aí podem adicionar, + remover ou alterar tokens do jeito que quiserem. +{% end %} + +## Motivo 11: Motivos Malucos + +[How Rust’s standard library was vulnerable for years and nobody +noticed](https://medium.com/@shnatsel/how-rusts-standard-library-was-vulnerable-for-years-and-nobody-noticed-aebf0503c3d6): +Nesse artigo de 2018, Sergey Davidoff conta que achou uma falha de segurança +em uma das funções do Rust, mas devido a forma como a mesma deveria ser +chamada, era basicamente impossível de exploitar a mesma. + +[No, the problem isn’t “bad +coders”](https://medium.com/@sgrif/no-the-problem-isnt-bad-coders-ed4347810270): +Esse artigo é uma resposta para as respostas de um artigo da Microsoft, em que +eles reportam que 70% de todos os crashes das aplicações no Windows se devem +ao acesso inválido de memória. Sean Griffin, criador da biblioteca +[Diesel](https://diesel.rs/), que serve para escrever ORMs em Rust, conta que +estava trabalhando em compartilhar uma conexão do PostgreSQL entre várias +threads, e o compilador não deixou. Quando foi examinar exatamente o porque, +percebeu que realmente o que ele queria fazer poderia levar a um acesso +inválido. E Griffin tem experiência de sobra nesse campo, já que também é o +criador do Active Record do Rails. + +Outra coisa maluca: + +![Screenshot do Github do Rust](rust-issues.png) + +A parte que vocês devem estar estranhando é a quantidade de issues que a +linguagem tem (algumas vezes o Github chega simplesmente a mostrar "5000+", +indicado que existem mais de 5000 issues abertas). + +Como pode uma linguagem com apenas 4 anos de existência pública ter mais de +5000 issues abertas? O que acontece é que todo o processo de decisão da +linguagem passa pelo Github: Quando os desenvolvedores do core da linguagem +acreditam que uma funcionalidade deva ser adicionada (ou removida), o que eles +fazem é abrir uma issue no Github para discutir com a comunidade o que e como +isso deve ser feito. + +Lembram que eu comentei que as questões de mensagens de erro não claras podem +(e devem) ser comunicadas para os desenvolvedores? Isso é feito pelo Github. + +Ainda, existem "Working Groups", grupos especializados sobre discussões em +alguns tópicos. Por exemplo, existe um working group para Bancos de Dados, +discutindo como a linguagem pode facilitar a criação de conexões com vários +bancos, interfaces padrões para essas conexões e assim por diante; existe um +working group para jogos, para discutir as coisas que tornam a vida de +desenvolvedores de jogos mais fácil. + +{% note() %} +Existia um working group para CLI (command line interface, ou interface de +linha de comando) para discutir como facilitar a vida de desenvolvedores que +querem construir ferramentas de linhas de comando. Uma vez que o grupo +acreditou ter achado a melhor forma, eles publicaram um livro sobre os +achados, decisões e implementações. + +E isso acontece com todos os working groups -- então pode esperar que, se eles +não fizeram ainda, vai sair um livro de como utilizar bancos de dados com Rust +do Database Working Group e um livro de como escrever jogos em Rust pelo Games +Working Group. +{% end %} + +Por último, existe o script [rustup](https://rustup.rs/). Lembram que eu falei +que Rust tem uma cadência de releases de seis em seis semanas? RustUp ajuda a +manter a sua instalação do Rust -- e componentes associados -- em dia. Não só +isso, mas ele permite a instalação de "toolchains" diferentes: Você pode, por +exemplo, instalar o toolchain para a arquitetura +`armv7-unknown-linux-gnueabihf` e, a partir da sua máquina Linux rodando Intel +gerar um executável para arquitetura ARM; ou, ainda, você pode instalar o +toolchain para a arquitetura `wasm32-unknown-unknown` que, na verdade, não é +uma arquitetura, é o gerador para WebAssembly, o que permite que você converta +seu código Rust para WebAssembly (com algumas restrições) -- e, embora seja +possível gerar WebAssembly em outras linguagens como C++ e C#, se você +utilizar Rust, todas as validações de acesso de memória continuam valendo. + +## E agora? + +Bom, se depois de tudo isso você decidir que quer aprender mais sobre Rust, o +que eu posso sugerir é: + +1. Instale o Rust usando o [RustUp](https://rustup.rs). +2. Leia o [Livro do Rust](https://doc.rust-lang.org/book/); o livro que + explica todas as funcionalidades da linguagem está disponível online e é + possível comprar a versão em ePub da No Starch Press (mas não há diferença + entre a versão online e a impressa/ePub). +3. Confira como Rust funciona lendo o [Rust By + Example](https://doc.rust-lang.org/stable/rust-by-example/). Basicamente + tudo que o Livro cobre também está aqui, mas Rust By Example usa uma forma + diferente de explicação, partindo a partir de exemplos para cada ponto. +4. Você pode brincar com Rust no [Rust + Playground](https://play.rust-lang.org/?version=stable), onde é possível + editar, compilar e executar código Rust de dentro do browser. Somente um + número pequeno de bibliotecas está disponível, mas para brincar com Rust + básico é possível usar isso ao invés de instalar a linguagem inteira. +5. Existe um grupo de usuários de Rust no Telegram, o [Rust + Brasil](https://t.me/rustlangbr). Se tiver alguma dúvida, é só ir lá e + perguntar. + +E era isso! diff --git a/content/presentations/porque-voce-deve-aprender-rust/rust-issues.png b/content/presentations/porque-voce-deve-aprender-rust/rust-issues.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2109f843acbf54f33495db75e8b77fab96992b GIT binary patch literal 18314 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 literal 0 HcmV?d00001