O documento discute a linguagem de programação Rust. Apresenta como o autor conheceu e começou a usar Rust, destacando características como tipos seguros, gerenciamento de memória sem garbage collector e foco em segurança e desempenho. Também mostra exemplos básicos de código Rust e como criar um site simples e fazer requisições na web usando Rust.
18. Rust
Rust é uma linguagem de programação de
sistemas que roda incrivelmente rápido, previne
falhas de segmentação, e garante segurança
entre threads.
5 . 1
20. Uma linguagem com várias
características funcionais:
Imutável por padrão
Não tem null ou unde ned
Pattern-matching
Closures
Structs e Enums
5 . 3
21. O que me chamou atenção para seguir
aprendendo:
Gera binários
Cross-plataforma
Preocupação em boas mensagens de erro
Focado em baixo nível
Mas com uma experiência de linguagem de alto nível
Linguagem com investimento da Mozilla
5 . 4
31. error[E0277]: the trait bound
`std::vec::Vec<_>: std::fmt::Display` is not satisfied
--> src/main.rs:3:25
|
|println!("Data {}", data);
| ^^^^
`std::vec::Vec<_>` cannot be formatted with the default
formatter; try using `:?` instead if you are using
a format string
|
= help: the trait `std::fmt::Display`
is not implemented for `std::vec::Vec<_>`
= note: required by `std::fmt::Display::fmt`
error: aborting due to previous error
7 . 5
32. ^^^^ `std::vec::Vec<_>` cannot be formatted with the default
formatter; try using `:?` instead if you are using a
format string
7 . 6
34. error[E0282]: type annotations needed
--> src/main.rs:2:16
|
2 | let data = vec!();
| ---- ^^^^^^ cannot infer type for `T`
| |
| consider giving `data` a type
|
error: aborting due to previous error
7 . 8
39. Imagine uma base de código bem
complexa
Código com threads
Processamento de imagens em paralelo
Coordenar muito acesso de I/O
7 . 13
40. Em resumo, imagine quão complexo um
navegador é por trás dos panos?
7 . 14
41. Existe algum problema neste código?
Playground
use std::thread;
use std::time::Duration;
fn main() {
let data = vec!();
thread::spawn(|| {
data.push('a');
});
thread::spawn(|| {
data.push('b');
});
thread::sleep(Duration::from_millis(50));
println!("Data {:?}", data);
}
7 . 15
42. Depois de vários ciclos de feedback na
compilação:
Não teremos acesso a memória já liberada
Teremos adicionado uma forma forma de evitar race
conditions
Nosso binário não terá esses problemas!
7 . 16
43. Playground
use std::thread;
use std::sync::{Arc, Mutex};
use std::time::Duration;
fn main() {
let data = Arc::new(Mutex::new(vec!()));
let writer = data.clone();
thread::spawn(move || {
let lock_result = writer.lock();
match lock_result {
Ok(mut locked_writer) => locked_writer.push('a'),
Err(_) => panic!("Could not acquire lock a"),
}
});
let writer = data.clone();
thread::spawn(move || {
let mut locked_writer = writer.lock().expect("Could not acquire lock b");
locked_writer.push('b');
});
thread::sleep(Duration::from_millis(50));
println!("Data {:?}", data);
}
7 . 17
44. Esse sistema de tipo traz novas
maneiras de expressar seu domínio
7 . 18
47. error[E0382]: use of moved value: `pedido`
--> src/main.rs:18:39
|
16 | enviar_pedido(pedido);
| ------ value moved here
17 |
18 | println!("Dados do pedido: {:?}", pedido);
| ^^^^^^
value used here after move
7 . 21
48. Só podemos acessar o pedido antes de
enviarmos as informações nesse cenário
7 . 22
61. Uma linguagem de sistemas:
Tem mensagens de erros claras
Que se preocupa com documentação e testes
E traz todas essas aprendizagens de outras linguagens
É uma ótima evolução para todo o ecossistema
de baixo nível
7 . 35
62. E uma ótima opção para
construir plataformas de alto nível
7 . 36
63. Mas você não precisa se preocupar
com tudo isso agora
7 . 37
75. Esse é o gerenciador de versões do Rust
Vai instalar todas as ferramentas
Suporta Linux, Mac e Windows
Ajuda a manter tudo atualizado
10 . 2
76. No nal estará disponível:
rustup: o gerenciador de versões
cargo: o gerenciador de projetos e de dependências
rustc: o compilador
rustdoc: o gerador de documentação
rust-gdb e rust-lldb: debuggers
10 . 3
85. Primeiro, importamos e incluímos algumas
referências do framework web.
#[macro_use]
extern crate nickel;
use nickel::{Nickel, HttpRouter};
14 . 2
86. Incluímos todo o conteúdo do nosso arquivo
HTML em uma constante.
const INDEX: &str = include_str!("index.html");
14 . 3
87. Criamos um novo servidor Nickel.
let mut server = Nickel::new();
server.get("/", middleware!(INDEX));
14 . 4
88. Con guramos a porta a partir da variável de
ambiente PORT. Vamos usar a porta 3000 de
fallback.
let port = std::env::var("PORT").unwrap_or("3000".into());
let url = format!("0.0.0.0:{port}", port = port);
14 . 5
89. Iniciamos o nosso servidor, com uma mensagem
caso haja erros.
println!("On {}", url);
server.listen(url)
.expect("Não conseguimos iniciar o servidor");
14 . 6
90. No nal teremos isso:
#[macro_use]
extern crate nickel;
use nickel::{Nickel, HttpRouter};
const INDEX: &str = include_str!("index.html");
fn main() {
let mut server = Nickel::new();
server.get("/", middleware!(INDEX));
let port = std::env::var("PORT").unwrap_or("3000".into());
let url = format!("0.0.0.0:{port}", port = port);
println!("On {}", url);
server.listen(url)
.expect("Não conseguimos iniciar o servidor");
}
14 . 7
112. Agora você tem um código para fazer chamadas
na internet!
binário
cross-plataforma
com baixo uso de memória
que não precisa de car instalando várias dependências
para usar
18 . 14
115. É fácil aprender Rust?
Eu passei semanas batendo a cabeça em
conceitos que eram novos para mim.
19 . 2
116. Tenho um background mais alto nível
(Ruby/Java/JavaScript)
Tive que aprender sobre stack e referências
Os conceitos sobre lifetime e borrow demoraram pra
entrar na minha cabeça
19 . 3
117. Rust trouxe novos conceitos para minha caixa de
ferramentas.
E eu tenho me divertido muito!
19 . 4
118. A comunidade é muito aberta e me ajudou
bastante, e tem muito interesse em trazer
pessoas novas.
Muitas pessoas estão disponíveis para ajudar no
, no e até no .#rust-beginners fórum #rust-br
19 . 5
119. Existe um grande esforço em tornar todo o
ecossistema inclusivo, tanto a participação das
pessoas quanto material para todos os níveis.
19 . 6
120. Iniciativa para ensinar Rust para quem não é
bem representado na área de tecnologia
RustBridge
19 . 7
121. Com interesse de tornar a linguagem uma boa
primeira linguagem de programação
19 . 8
122. Todas as propostas de mudança da linguagem
seguem um processo de
Evolução colaborativa
RFC
19 . 9
123. Que agora requer que novas propostas tenham
e uma maneira clara para
ensinar a mudança
documentação
19 . 10
124. Como eu coloco meu site no Heroku?
Eu usei esse .buildpack
19 . 11
125. Só existe o Nickel para web?
Já existem vários frameworks, mas ainda é um
ecossistema em desenvolvimento.
19 . 12
126. Uma boa lista está disponível no site Are We
Web Yet?
19 . 13
127. Se você estiver buscando algo mais
experimental:
Con ra o , que usa uma sintaxe mais
sucinta…
Rocket
19 . 14
128. Mas depende de funcionalidades do compilador
ainda em desenvolvimento.
19 . 15
129. Preciso usar rustup?
É o método mais recomendado pela
comunidade
É a maneira mais fácil de manter tudo atualizado
Rust tem uma versão nova a cada 6 semanas
Fica mais fácil de acompanhar as novas funcionalidades
19 . 16
130. Rust está disponível nos gerenciadores de
pacotes dos sistemas operacionais também, mas
pode demorar um pouco mais para receber
atualizações.
19 . 17
132. Já existem empresas usando Rust?
Sim. Inclusive o Firefox do seu computador já
tem partes em Rust.
Algumas empresas: Dropbox, Chef, Tilde, Sentry,
CoreOS, Mozilla e tem mais .na lista do site
19 . 19
133. Só dá pra usar Rust para a web?
Não, dá pra usar para muitos outros lugares!
19 . 20
134. (Se eu fosse falar todos os exemplos, seria uma
outra apresentação inteira)
19 . 21
135. Dois fortes* espaços para aplicar a linguagem:
Ferramentas de suporte (CLIs, build, processadores de
texto, etc)
Extensões de linguagens (Gems, npm, python extensions,
FFI)
*IMHO
19 . 22
138. E se quiser seguir conhecendo
Tem um no site [EN]
é um ótimo canal para tirar dúvidas
rápidas
Existe o para falar em portugues
O grupo no Telegram
E em portugues
livro de graça
#rust-beginners
#rust-br
@rustlangbr
Meetups
Exercicios
grupo de estudo online
20 . 2
139. Se você se interessou por Rust, pode entrar em
contato comigo também, que eu quero te ajudar
com os próximos passos.
Bruno Tavares - @bltavares
20 . 3