|
|
|
@ -72,14 +72,12 @@
|
|
|
|
|
<body> |
|
|
|
|
<div class="reveal"> |
|
|
|
|
<div class="slides"> |
|
|
|
|
<section> |
|
|
|
|
<section data-background="_images/rust-ferris.png" data-header> |
|
|
|
|
<h2 class="semi-opaque">Porque Você Deveria Aprender Rust</h2> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section data-background="_images/rust-ferris.png"> |
|
|
|
|
<h2 class="semi-opaque">Porque Você DEVE Aprender Rust</h2> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
|
Eu ia falar do porque o pessoal deveria aprender Rust, |
|
|
|
@ -88,7 +86,6 @@
|
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<img src="_images/avatar-20170726.png" alt="Me" style="float:left;width:200px;" class="no-border"> |
|
|
|
|
|
|
|
|
@ -98,13 +95,35 @@
|
|
|
|
|
<li><a href="https://functional.cafe/@juliobiason">https://functional.cafe/@juliobiason</a></li> |
|
|
|
|
<li><a href="https://t.me/juliobiason">https://t.me/juliobiason</a></li> |
|
|
|
|
<li>julio.biason@pm.me</li> |
|
|
|
|
<li><a href="https://presentations.juliobiason.me">https://presentations.juliobiason.me</a></li> |
|
|
|
|
</ul> |
|
|
|
|
</div> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<div> |
|
|
|
|
<ul> |
|
|
|
|
<li>Coordenador do meetup <strong>Rust in POA</strong></li> |
|
|
|
|
<li>Co-coordenador do meetup <strong>PyTche</strong></li> |
|
|
|
|
<li>Co-coordenador do meetup <strong>Design de Código</strong></li> |
|
|
|
|
<li>Palestrante do <strong>Tchelinux</strong></li> |
|
|
|
|
</ul> |
|
|
|
|
</div> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<div> |
|
|
|
|
<h3>JulioBiason.me</h3> |
|
|
|
|
|
|
|
|
|
<ul> |
|
|
|
|
<li><a href="https://blog.juliobiason.me/">Blog</a></li> |
|
|
|
|
<li><a href="https://presentations.juliobiason.me/">Presentations</a></li> |
|
|
|
|
<li><a href="https://git.juliobiason.me/">Git</a></li> |
|
|
|
|
<li><a href="https://resume.juliobiason.me/">CV/Resumé</a></li> |
|
|
|
|
<li><a href="https://books.juliobiason.me/">Books</a></li> |
|
|
|
|
</ul> |
|
|
|
|
</div> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h2>História</h2> |
|
|
|
|
|
|
|
|
@ -112,9 +131,8 @@
|
|
|
|
|
<li>Criada em 2006 por Graydon Hoare.</li> |
|
|
|
|
<li>Patrocinada pela Mozilla em 2009.</li> |
|
|
|
|
<li>Versão 1.0 em 2015.</li> |
|
|
|
|
<li>Versão atual: 1.38</li> |
|
|
|
|
<li>Versão atual: 1.41.1</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
|
Parte burocrática da apresentação. |
|
|
|
@ -125,7 +143,6 @@
|
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2> |
|
|
|
|
História |
|
|
|
@ -185,9 +202,7 @@
|
|
|
|
|
Rust trabalha. |
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>1. A Linguagem Mais Amada</h2> |
|
|
|
|
<p> |
|
|
|
@ -209,9 +224,7 @@
|
|
|
|
|
</aside> |
|
|
|
|
</p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>2. "Low Level Language with High Level Abstractions"</h2> |
|
|
|
|
</section> |
|
|
|
@ -260,9 +273,7 @@
|
|
|
|
|
desenvolvimento. |
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>3. Compilador Chato mas Amigável</h2> |
|
|
|
|
</section> |
|
|
|
@ -311,7 +322,7 @@ fn main() -> u8 {
|
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section data-transition="fade"> |
|
|
|
|
<section> |
|
|
|
|
<pre><code class="hljs" data-trim data-line-numbers="7"> |
|
|
|
|
3 | let a = 2; |
|
|
|
|
| - |
|
|
|
@ -354,9 +365,7 @@ fn main() -> u8 {
|
|
|
|
|
problema. |
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>4. Borrow Checker</h2> |
|
|
|
|
|
|
|
|
@ -510,7 +519,7 @@ fn main() {
|
|
|
|
|
<section> |
|
|
|
|
<h4>Drop</h4> |
|
|
|
|
|
|
|
|
|
<pre><code class="hljs rust fragment"> |
|
|
|
|
<pre><code class="hljs rust"> |
|
|
|
|
pub fn drop<T>(_x: T) { } |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
@ -565,7 +574,9 @@ pub fn drop<T>(_x: T) { }
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p> |
|
|
|
|
<a href="https://swift.org/blog/swift-5-exclusivity/">Swift 5 Exclusivity Enforcement</a> |
|
|
|
|
</p> |
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
|
A ideia do borrow checker é tão interessante que |
|
|
|
@ -574,66 +585,12 @@ pub fn drop<T>(_x: T) { }
|
|
|
|
|
basicamente o mesmo, apesar de ser um pouco mais |
|
|
|
|
leve no Swift). |
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h3>Hora da anedota!</h3> |
|
|
|
|
|
|
|
|
|
<img class="stretch" src="_images/senta-que-la-vem-historia.gif" alt=""> |
|
|
|
|
|
|
|
|
|
<p class="fragment"><code>localtime</code></p> |
|
|
|
|
<p class="fragment"><code>SimpleDateFormatter</code></p> |
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
|
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?" |
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h3>Rust resolveria isso?</h3> |
|
|
|
|
|
|
|
|
|
<h2 class="fragment">SIM</h2> |
|
|
|
|
|
|
|
|
|
<h4 class="fragment">... porque nem ia compilar.</h4> |
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
|
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. |
|
|
|
|
</aside> |
|
|
|
|
</section> |
|
|
|
|
<p> |
|
|
|
|
<a href="https://github.com/microsoft/verona">Verona: Research programming language for concurrent ownership</a> |
|
|
|
|
</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>5. Tipos Algébricos</h2> |
|
|
|
|
</section> |
|
|
|
@ -667,9 +624,7 @@ match home {
|
|
|
|
|
} |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>6. Error Control</h2> |
|
|
|
|
</section> |
|
|
|
@ -685,11 +640,13 @@ except Exception:
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<pre><code class="hljs java" data-trim> |
|
|
|
|
var obj = null; |
|
|
|
|
try { |
|
|
|
|
something(); |
|
|
|
|
obj = get_object(); |
|
|
|
|
} catch (Exception ex) { |
|
|
|
|
System.out.println(ex); |
|
|
|
|
} |
|
|
|
|
obj.do_something(); |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
@ -744,6 +701,15 @@ file.write(b"Hello world").unwrap();
|
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
let mut file = File::create("something.txt") |
|
|
|
|
.expect("ERROR OPENING"); |
|
|
|
|
file.write(b"Hello world") |
|
|
|
|
.expect("ERROR WRITING"); |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
let mut file = File::create("something.txt")?; |
|
|
|
@ -751,9 +717,7 @@ file.write(b"Hello world")?;
|
|
|
|
|
OK(()) |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>7. Generics/Traits</h2> |
|
|
|
|
</section> |
|
|
|
@ -797,6 +761,10 @@ struct Point<T> {
|
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
let my_point = Point<f32>(x: 1.0, y: 2.0); |
|
|
|
|
</code></pre> |
|
|
|
|
|
|
|
|
|
<pre><code class="hljs rust fragment" data-trim> |
|
|
|
|
let my_point = Point(x: 1.0, y: 2.0); |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
@ -821,6 +789,8 @@ trait Summary {
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h3>Traits</h3> |
|
|
|
|
|
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
struct Phrase { |
|
|
|
|
phrase: String |
|
|
|
@ -838,6 +808,8 @@ impl Summary for Phrase {
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h3>Traits</h3> |
|
|
|
|
|
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
fn get_summary<T>(summarizable: T) -> String |
|
|
|
|
where T: Summary |
|
|
|
@ -846,9 +818,7 @@ fn get_summary<T>(summarizable: T) -> String
|
|
|
|
|
} |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2> |
|
|
|
|
<a href="https://doc.rust-lang.org/cargo/"> |
|
|
|
@ -865,9 +835,7 @@ fn get_summary<T>(summarizable: T) -> String
|
|
|
|
|
community’s package registry." |
|
|
|
|
</p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>9. Tests</h2> |
|
|
|
|
|
|
|
|
@ -882,6 +850,8 @@ mod tests {
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h3>Tests</h3> |
|
|
|
|
|
|
|
|
|
<pre><code> |
|
|
|
|
$ cargo test |
|
|
|
|
Compiling adder v0.1.0 (file:///projects/adder) |
|
|
|
@ -892,9 +862,7 @@ running 1 test
|
|
|
|
|
test tests::testing ... ok |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>10. Macros</h2> |
|
|
|
|
|
|
|
|
@ -902,7 +870,7 @@ test tests::testing ... ok
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h3>Log-Derive</h3> |
|
|
|
|
<h3>Macros: Log-Derive</h3> |
|
|
|
|
|
|
|
|
|
<pre><code> |
|
|
|
|
#[logfn(ok = "TRACE", err = "ERROR")] |
|
|
|
@ -915,9 +883,7 @@ fn call_isan(num: &str) -> Result<Success, Error> {
|
|
|
|
|
} |
|
|
|
|
</code></pre> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>11. Crazy stuff</h2> |
|
|
|
|
</section> |
|
|
|
@ -937,6 +903,19 @@ fn call_isan(num: &str) -> Result<Success, Error> {
|
|
|
|
|
<small>wasm32-unknown-unknown</small> <small class="fragment">(WebAssembly)</small> |
|
|
|
|
</div> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<img src="_images/not-everything-is-flowers.jpg" alt=""> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h3>Complicações de Rust:</h3> |
|
|
|
|
|
|
|
|
|
<ul> |
|
|
|
|
<li>Borrow checker</li> |
|
|
|
|
<li>Sem OO</li> |
|
|
|
|
<li>Tempo de compilação</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|