|
|
@ -74,7 +74,7 @@ |
|
|
|
<div class="slides"> |
|
|
|
<div class="slides"> |
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<section data-background="_images/rust-ferris.png" data-header> |
|
|
|
<section data-background="_images/rust-ferris.png" data-header> |
|
|
|
<h1 class="semi-opaque">Por Que Rust</h1> |
|
|
|
<h1 class="semi-opaque">Porque Rust</h1> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
@ -122,7 +122,7 @@ |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<p>Resultado final com performance semelhate ao C...</p> |
|
|
|
<p>Resultado final com performance semelhante ao C...</p> |
|
|
|
|
|
|
|
|
|
|
|
<img src="_images/rust-energy.png" alt=""> |
|
|
|
<img src="_images/rust-energy.png" alt=""> |
|
|
|
|
|
|
|
|
|
|
@ -157,6 +157,7 @@ |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
<section> |
|
|
|
|
|
|
|
<section> |
|
|
|
<h2>Imutabilidade por Default</h2> |
|
|
|
<h2>Imutabilidade por Default</h2> |
|
|
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
<aside class="notes"> |
|
|
@ -205,6 +206,10 @@ fn main() { |
|
|
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
<aside class="notes"> |
|
|
|
... 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). |
|
|
|
</aside> |
|
|
|
</aside> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
@ -258,7 +263,7 @@ a = String::from("hello"); |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<img src="_images/rust-memory.png" alt="" class="fragment stretch"> |
|
|
|
<img src="_images/rust-memory.png" alt="" class="stretch"> |
|
|
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
<aside class="notes"> |
|
|
|
É mais ou menos isso que Rust "pensa" internamente |
|
|
|
É mais ou menos isso que Rust "pensa" internamente |
|
|
@ -437,6 +442,22 @@ presente.abrir()</code></pre> |
|
|
|
</aside> |
|
|
|
</aside> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<h2>E GC?</h2> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p class="fragment">GC não é determinístico.</p> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<aside class="notes"> |
|
|
|
|
|
|
|
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. |
|
|
|
|
|
|
|
</aside> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<a href="https://swift.org/blog/swift-5-exclusivity/">Swift 5 Exclusivity Enforcement</a> |
|
|
|
<a href="https://swift.org/blog/swift-5-exclusivity/">Swift 5 Exclusivity Enforcement</a> |
|
|
|
|
|
|
|
|
|
|
@ -658,6 +679,8 @@ OK(()) |
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<h2>Macros</h2> |
|
|
|
<h2>Macros</h2> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<small class="fragment">?</small> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
@ -665,6 +688,50 @@ OK(()) |
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<h2>Traits/Generics</h2> |
|
|
|
<h2>Traits/Generics</h2> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
|
|
|
enum Result<T, E> { |
|
|
|
|
|
|
|
Ok(T), |
|
|
|
|
|
|
|
Err(E), |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</code></pre> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
|
|
|
trait Summary { |
|
|
|
|
|
|
|
fn summarize(&self) -> String; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</code></pre> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
|
|
|
struct Super { |
|
|
|
|
|
|
|
phrase: String |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl Summary for Super { |
|
|
|
|
|
|
|
fn summarize(&self) -> String { |
|
|
|
|
|
|
|
self.phrase |
|
|
|
|
|
|
|
.split_whitespace() |
|
|
|
|
|
|
|
.map(|word| word.chars().nth(0).unwrap()) |
|
|
|
|
|
|
|
.collect(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</code></pre> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<pre><code class="hljs rust" data-trim> |
|
|
|
|
|
|
|
fn get_summary(summarizable: T) -> String |
|
|
|
|
|
|
|
where T: Summary |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</code></pre> |
|
|
|
|
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
<section> |
|
|
@ -701,6 +768,24 @@ OK(()) |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<h2>Falando em WASM...</h2> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<h2>WASM</h2> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p><a href="https://rustwasm.github.io/wasm-pack/installer/">wasm-pack</a></p> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<h2><a href="https://wasi.dev/">WASI</a></h2> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>The WebAssembly System Interface</p> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<section> |
|
|
|
<h2>Bibliotecas</h2> |
|
|
|
<h2>Bibliotecas</h2> |
|
|
|