diff --git a/porque-rust.html b/porque-rust.html
index 588aa48..47acd44 100644
--- a/porque-rust.html
+++ b/porque-rust.html
@@ -74,7 +74,7 @@
- Porque Rust
+ Porque Rust
@@ -103,69 +103,69 @@
... pelo 4⁰ ano seguido.
-
- O resultado do StackOverflow é sobre qual
- linguagem os programadores realmente gostam de
- programar (e quais eles tem pavor de usar).
+
+ O resultado do StackOverflow é sobre qual
+ linguagem os programadores realmente gostam de
+ programar (e quais eles tem pavor de usar).
- Pessoalmente, depois de 30 anos programando,
- quando começei a brincar com Rust, eu
- finalmente me diverti enquanto programava.
-
+ Pessoalmente, depois de 30 anos programando,
+ quando começei a brincar com Rust, eu
+ finalmente me diverti enquanto programava.
+
-
- "Low Level Language with High Level Abstractions"
-
-
-
- Resultado final com performance semelhante ao C...
-
-
-
-
- Num estudo sobre quais linguagens consomem mais
- energia, Rust chegou bem próximo de C.
-
- Parte do trabalho de otimização do Rust vem da LLVM
- (parte do pacote do Clang), mas a árvore de
- abstração ainda é gerada pela linguagem -- o que
- significa que o compilador Rust consegue "ajudar" o
- LLVM a otimizar o código.
-
-
-
-
- ... mas com abstrações em algo nível
-
-
- Strings sem tamanho fixo
- Listas
- Mapas
-
-
-
- Ao contrário de C, em que só se mexe com ponteiros
- pra cima e pra baixo, Rust tem todas as abstrações
- de alto nível que estamos acostumados com outras
- linguagens.
-
-
-
-
-
+
+ "Low Level Language with High Level Abstractions"
+
+
+
+ Resultado final com performance semelhante ao C...
+
+
+
+
+ Num estudo sobre quais linguagens consomem mais
+ energia, Rust chegou bem próximo de C.
+
+ Parte do trabalho de otimização do Rust vem da LLVM
+ (parte do pacote do Clang), mas a árvore de
+ abstração ainda é gerada pela linguagem -- o que
+ significa que o compilador Rust consegue "ajudar" o
+ LLVM a otimizar o código.
+
+
+
+
+ ... mas com abstrações em algo nível
+
+
+ Strings sem tamanho fixo
+ Listas
+ Mapas
+
+
+
+ Ao contrário de C, em que só se mexe com ponteiros
+ pra cima e pra baixo, Rust tem todas as abstrações
+ de alto nível que estamos acostumados com outras
+ linguagens.
+
+
+
+
+
Imutabilidade por Default
-
- Por que "imutabilidade" seria algo importante?
- Imutabilidade muda a forma como pensamos nos dados,
- e evita que o estado fique mudando quando não
- queremos.
-
+
+ Por que "imutabilidade" seria algo importante?
+ Imutabilidade muda a forma como pensamos nos dados,
+ e evita que o estado fique mudando quando não
+ queremos.
+
@@ -189,10 +189,10 @@ fn main() {
| ^^^^^ cannot assign twice to immutable variable
-
- Se você tentar mudar um dado depois de criado, o
- compilador Rust não vai deixar.
-
+
+ Se você tentar mudar um dado depois de criado, o
+ compilador Rust não vai deixar.
+
@@ -204,13 +204,13 @@ fn main() {
}
-
- ... a não ser que você transforme sua variável em mutável.
+
+ ... a não ser que você transforme sua variável em mutável.
- Ainda, Rust tem funcionalidades para facilitar
- copiar dados de um lado para o outro (como o
- "spread operator" em structs).
-
+ Ainda, Rust tem funcionalidades para facilitar
+ copiar dados de um lado para o outro (como o
+ "spread operator" em structs).
+
@@ -218,14 +218,14 @@ fn main() {
Borrow Checker
-
- O "Borrow Checker" é uma das principais novidades
- do Rust em comparação com outras linguagens.
+
+ O "Borrow Checker" é uma das principais novidades
+ do Rust em comparação com outras linguagens.
- Ele basicamente controla como as variáveis vão ser
- alocadas, quando serão desalocadas, quem pode
- acessar o conteúdo da mesma e assim por diante.
-
+ Ele basicamente controla como as variáveis vão ser
+ alocadas, quando serão desalocadas, quem pode
+ acessar o conteúdo da mesma e assim por diante.
+
@@ -237,11 +237,11 @@ a = String::from("hello");
"Variável a
tem o valor "hello"
"
-
- Em todas as linguagens que eu usei, sempre que via
- uma atribuição, eu pensava "a variável X tem o
- valor Y" -- mesmo em C.
-
+
+ Em todas as linguagens que eu usei, sempre que via
+ uma atribuição, eu pensava "a variável X tem o
+ valor Y" -- mesmo em C.
+
@@ -255,24 +255,24 @@ a = String::from("hello");
-
- Nunca uma linguagem me fez "despensar" no nome da
- variável pra pensar que ela representa, na verdade,
- uma posição de memória.
-
-
+
+ Nunca uma linguagem me fez "despensar" no nome da
+ variável pra pensar que ela representa, na verdade,
+ uma posição de memória.
+
+
-
+
-
- É mais ou menos isso que Rust "pensa" internamente
- quando vê uma variável: uma posição de memória, de
- um tamanho já definido, de um tipo definido.
+
+ É mais ou menos isso que Rust "pensa" internamente
+ quando vê uma variável: uma posição de memória, de
+ um tamanho já definido, de um tipo definido.
- E essa posição de memória *pertence* apenas à
- variável indicada.
-
+ E essa posição de memória *pertence* apenas à
+ variável indicada.
+
@@ -306,16 +306,18 @@ error[E0382]: borrow of moved value: `a`
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
+ = note: move occurs because `a` has type
+ `std::string::String`, which does not
+ implement the `Copy` trait
-
- O borrow checked não deixa a variável "a" ser
- utilizada: quando a atribuímos "_b" o valor de "a",
- o que estamos fazendo é indicando que aquela
- posição de memória agora é controlada por "_b" e
- não mais por "a".
-
+
+ O borrow checked não deixa a variável "a" ser
+ utilizada: quando a atribuímos "_b" o valor de "a",
+ o que estamos fazendo é indicando que aquela
+ posição de memória agora é controlada por "_b" e
+ não mais por "a".
+
@@ -323,9 +325,9 @@ error[E0382]: borrow of moved value: `a`
References
-
- Assim como C++, Rust tem o conceito de "referências".
-
+
+ Assim como C++, Rust tem o conceito de "referências".
+
@@ -341,10 +343,10 @@ fn main() {
-
- Uma referência nada mais é que um ponteiro para um
- "controlador" de uma região de memória.
-
+
+ Uma referência nada mais é que um ponteiro para um
+ "controlador" de uma região de memória.
+
@@ -354,39 +356,44 @@ fn main() {
Uma região de memória tem apenas um dono.
+
+ Passar um valor (região de memória) de uma variável
+ para outra, troca o dono.
+
+
A região é desalocada quando o dono sair de escopo.
-
- Uma coisa engraçada sobre "quando sair de escopo" é
- que existe uma função semelhante ao "free()" do C,
- chamada "drop". Essa função não tem nada no corpo,
- e recebe um parâmetro (sem ser por referência), se
- tornando a dona da memória; assim, como ela termina
- exatamente naquele ponto, a região de memória é
- liberada.
-
+
+ Uma coisa engraçada sobre "quando sair de escopo" é
+ que existe uma função semelhante ao "free()" do C,
+ chamada "drop". Essa função não tem nada no corpo,
+ e recebe um parâmetro (sem ser por referência), se
+ tornando a dona da memória; assim, como ela termina
+ exatamente naquele ponto, a região de memória é
+ liberada.
+
Regras do Borrow Checker
- Uma região de memória pode ter inifitas referências.
+ Uma região de memória pode ter infinitas referências.
... desde que elas não durem mais do que o dono.
-
- Não é possível ter uma função que cria uma variável
- e retorna apenas uma referência para essa variável:
- no momento que a função for encerrada, ela irá
- levar todas as variáveis com ela e as referências
- se tornaram inválidas.
-
+
+ Não é possível ter uma função que cria uma variável
+ e retorna apenas uma referência para essa variável:
+ no momento que a função for encerrada, ela irá
+ levar todas as variáveis com ela e as referências
+ se tornaram inválidas.
+
@@ -405,9 +412,9 @@ fn main() {
-
- E o que isso ajuda, no final das contas?
-
+
+ E o que isso ajuda, no final das contas?
+
@@ -415,11 +422,11 @@ fn main() {
canal <- presente
-
- Num exemplo em Go, criamos uma estrutura e passamos
- essa estrutura para outra thread através de um
- canal.
-
+
+ Num exemplo em Go, criamos uma estrutura e passamos
+ essa estrutura para outra thread através de um
+ canal.
+
@@ -427,129 +434,112 @@ canal <- presente
canal <- presente
presente.abrir()
-
- ... e depois de passar o presente pra outra pessoa,
- nós abrimos o presente.
+
+ ... e depois de passar o presente pra outra pessoa,
+ nós abrimos o presente.
- Mas se estamos entregando um presente pra alguém,
- como é que estamos abrindo o presente?
+ Mas se estamos entregando um presente pra alguém,
+ como é que estamos abrindo o presente?
- O borrow checker não permite esse tipo de coisa:
- Ele irá barrar a função atual de continuar
- utilizando a variável porque, afinal de contas,
- agora a região de memória pertence à outra função
- (uma função que está rodando em outra thread).
-
+ O borrow checker não permite esse tipo de coisa:
+ Ele irá barrar a função atual de continuar
+ utilizando a variável porque, afinal de contas,
+ agora a região de memória pertence à outra função
+ (uma função que está rodando em outra thread).
+
-
- E GC?
+
+ E GC?
- GC não é determinístico.
+ GC não é determinístico.
-
- Um problema com GC é que ele é não determinístico:
- uma hora o teu código roda rápido e outro momento
- ele fica lento, sem que tu consiga entender o
- porque.
+
+ Um problema com GC é que ele é não determinístico:
+ uma hora o teu código roda rápido e outro momento
+ ele fica lento, sem que tu consiga entender o
+ porque.
- Sem GC, a execução do código torna-se determinística e
- tu pode ter certeza da velocidade de execução.
-
-
+ Sem GC, a execução do código torna-se determinística e
+ tu pode ter certeza da velocidade de execução.
+
+
Swift 5 Exclusivity Enforcement
-
- A ideia do borrow checker é tão interessante que
- até o Swift 5 agora tem o seu próprio borrow
- checker (com outro nome, mas o princípio da coisa é
- basicamente o mesmo, apesar de ser um pouco mais
- leve no Swift).
-
+
+ A ideia do borrow checker é tão interessante que
+ até o Swift 5 agora tem o seu próprio borrow
+ checker (com outro nome, mas o princípio da coisa é
+ basicamente o mesmo, apesar de ser um pouco mais
+ leve no Swift).
+
-
-
- Hora da anedota!
-
-
-
-
-
- localtime
-
- SimpleDateFormatter
-
-
- A muito tempo atrás, eu estava ajudando uma colega
- a resolver um problema com processamento de eventos
- num projeto em C. Aparentemente, quando um evento
- era processado, acontecia do tempo de processamento
- ficar errado (algo como ficar negativo ou levar
- menos de 10ms pra fazer uma query num banco
- oracle). Quando perguntei como ela estava
- calculando o tempo, ela me falou que estava usando
- o "localtime". Foi quando me lembrei que
- "localtime" não é thread-safe e, por isso, quando
- uma thread passava pela chamada da função, o valor
- era "resetado".
-
- Outra situação aconteceu recentemente: Num projeto
- Java, começou a acontecer de, em alguns casos, a
- função que convertia strings para Date começou a
- dar resultados completamente errados.
- Estranhamente, eu lembrei da questão do localtime e
- perguntei se o projeto usava threads: sim; fui
- direto no DuckDuckGo e procurei por
- "simpledateformatter thread safe" e o primeiro
- resultado foi uma pergunta do StackOverflow: "Why
- isn't SimpleDateFormatter thread-safe?"
-
-
-
-
- Rust resolveria isso?
-
- Não
-
- ... na verdade, nem ia compilar.
-
-
- Uma questão importante para o Rust são "Zero Cost
- Abstractions", segundo a definição do Bjarne
- Stroustrup, criado do C++: para que algo seja
- aceito no compilador, é preciso que o custo de não
- usar algo não acarrete nada; ou seja, tornar uma
- função thread-safe simplesmente inserindo um mutex,
- não é zero cost porque, se tu não estiver usando
- threads, não faz sentido o mutex.
-
-
-
-
- Tipos Algébricos
+ Hora da anedota!
- (structs)
+
- struct
+ localtime
-
-struct Present {
- package_color: String,
- content: String
-}
-
+ SimpleDateFormatter
+
+
+ A muito tempo atrás, eu estava ajudando uma colega
+ a resolver um problema com processamento de eventos
+ num projeto em C. Aparentemente, quando um evento
+ era processado, acontecia do tempo de processamento
+ ficar errado (algo como ficar negativo ou levar
+ menos de 10ms pra fazer uma query num banco
+ oracle). Quando perguntei como ela estava
+ calculando o tempo, ela me falou que estava usando
+ o "localtime". Foi quando me lembrei que
+ "localtime" não é thread-safe e, por isso, quando
+ uma thread passava pela chamada da função, o valor
+ era "resetado".
-
+ Outra situação aconteceu recentemente: Num projeto
+ Java, começou a acontecer de, em alguns casos, a
+ função que convertia strings para Date começou a
+ dar resultados completamente errados.
+ Estranhamente, eu lembrei da questão do localtime e
+ perguntei se o projeto usava threads: sim; fui
+ direto no DuckDuckGo e procurei por
+ "simpledateformatter thread safe" e o primeiro
+ resultado foi uma pergunta do StackOverflow: "Why
+ isn't SimpleDateFormatter thread-safe?"
+
+
+
+
+ Rust resolveria isso?
+
+ Não
+
+ ... na verdade, nem ia compilar.
+
+
+ Uma questão importante para o Rust são "Zero Cost
+ Abstractions", segundo a definição do Bjarne
+ Stroustrup, criado do C++: para que algo seja
+ aceito no compilador, é preciso que o custo de não
+ usar algo não acarrete nada; ou seja, tornar uma
+ função thread-safe simplesmente inserindo um mutex,
+ não é zero cost porque, se tu não estiver usando
+ threads, não faz sentido o mutex.
+
+
+
+
+
+
@@ -680,34 +670,51 @@ OK(())
+
+
+
+ Structs
+
+
+
+struct Present {
+ package_color: String,
+ content: String
+}
+
+
+
+ Structs em Rust são basicamente o mesmo que em C.
+
-
-
+
+
-
+
enum Result<T, E> {
Ok(T),
Err(E),
}
-
+
-
-
+
+
trait Summary {
fn summarize(&self) -> String;
}
-
-
+
+
-
-
+
+
struct Super {
phrase: String
}
@@ -721,7 +728,7 @@ impl Summary for Super {
}
}
-
+
@@ -732,7 +739,18 @@ fn get_summary(summarizable: T) -> String
}
-
+
+
+ Structs genéricas
+
+
+struct Point {
+ x: T,
+ y: T
+}
+
+
+
@@ -768,23 +786,23 @@ fn get_summary(summarizable: T) -> String
-
-
+
+
-
-
-
+
+
- The WebAssembly System Interface
-
-
+ The WebAssembly System Interface
+
+