diff --git a/_images/rust-energy.png b/_images/rust-energy.png new file mode 100644 index 0000000..437af43 Binary files /dev/null and b/_images/rust-energy.png differ diff --git a/_images/rust-ferris.png b/_images/rust-ferris.png new file mode 100644 index 0000000..d553e74 Binary files /dev/null and b/_images/rust-ferris.png differ diff --git a/_images/rust-memory.png b/_images/rust-memory.png new file mode 100644 index 0000000..1db55bc Binary files /dev/null and b/_images/rust-memory.png differ diff --git a/_images/rust-reference.png b/_images/rust-reference.png new file mode 100644 index 0000000..394b801 Binary files /dev/null and b/_images/rust-reference.png differ diff --git a/_images/senta-que-la-vem-historia.gif b/_images/senta-que-la-vem-historia.gif new file mode 100644 index 0000000..7afa525 Binary files /dev/null and b/_images/senta-que-la-vem-historia.gif differ diff --git a/porque-rust.html b/porque-rust.html new file mode 100644 index 0000000..f48bd08 --- /dev/null +++ b/porque-rust.html @@ -0,0 +1,790 @@ + + + + + + Por que você deveria aprender Rust + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Por Que Rust

+
+
+ +
+
+ Me + +
+ +
+
+
+ +
+
+

+ + A languagem mais amada segundo o StackOverflow + Survey 2019 + + +

... pelo 4⁰ ano seguido.

+ + +

+
+
+ +
+
+

"Low Level Language with High Level Abstractions"

+
+ +
+

Resultado final com performance semelhate ao C...

+ + + + +
+ +
+

... mas com abstrações em algo nível

+ +
    +
  • Strings sem tamanho fixo
  • +
  • Listas
  • +
  • Mapas
  • +
+ + +
+
+ +
+

Imutabilidade por Default

+ + +
+ +
+

+fn main() {
+    let a = 2;
+    a = 3;
+    println!("{}", a);
+}
+                        
+
+ +
+

+3 |     let a = 2;
+  |         -
+  |         |
+  |         first assignment to `a`
+  |         help: make this binding mutable: `mut a`
+4 |     a = 3;
+  |     ^^^^^ cannot assign twice to immutable variable
+                        
+ + +
+ +
+

+fn main() {
+    let mut a = 2;
+    a = 3;
+    println!("{}", a);
+}
+                        
+ + +
+ + +
+
+

Borrow Checker

+ + +
+ +
+

+a = String::from("hello");
+                        
+
+ +
+ "Variável a tem o valor "hello"" + + +
+ +
+
+ "Posição de memória apontada por a tem o valor "hello"" +
+ +
+

+0x3f5cbf89 = "hello"
+                            
+
+ + +
+ +
+ + + +
+ +
+
+ A language that doesn't affect the way you think + about programming, is not worth knowing. +
+ +
+ -- Alan Perlis, "ALGOL" +
+
+ +
+

+fn main() {
+    let a = String::from("hello");
+    let _b = a;
+    println!("{}", a)
+}
+                        
+
+ +
+

+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
+                        
+ + +
+ +
+

E se eu precisar acessar a variável em mais de um lugar?

+ +

References

+ + +
+ +
+

+fn main() {
+    let a = String::from("hello");
+    let _b = &a;
+    println!("{}", a)
+}
+                        
+
+ +
+ + + +
+ +
+

Regras do Borrow Checker

+ +

+ Uma região de memória tem apenas um dono. +

+ +

+ A região é desalocada quando o dono sair de escopo. +

+ + +
+ +
+

Regras do Borrow Checker

+ +

+ Uma região de memória pode ter inifitas referências. +

+ +

+ ... desde que elas não durem mais do que o dono. +

+ + +
+ +
+

Regras do Borrow Checker

+ +

+ É possível ter uma referência mutável de uma região de memória. +

+ +

+ ... mas para haver uma referência mutável ela deve ser + a única referência. +

+
+ +
+ + + +
+ +
+
presente := Presente { ... }
+canal <- presente
+ 
+ + +
+ +
+
presente := Presente { ... }
+canal <- presente
+presente.abrir()
+ + +
+ +
+ Swift 5 Exclusivity Enforcement + + +
+
+ +
+
+

Hora da anedota!

+ + +
+ +
+

localtime

+ +

SimpleDateFormatter

+ + +
+ +
+

Rust resolveria isso?

+ +

Não

+ +

... na verdade, nem ia compilar.

+ + +
+
+ +
+
+

Tipos Algébricos

+ +

(structs)

+
+ +
+

struct

+ +

+struct Present {
+    package_color: String,
+    content: String
+}
+                        
+ + +
+ +
+

enum

+

+enum IpAddr {
+   V4,
+   V6
+}
+                        
+
+ +
+

+enum IpAddr {
+    V4(String),
+    V6(String),
+}
+                        
+
+ +
+

+let home = IpAddr::V4(String::from("127.0.0.1");
+
+match home {
+    V4(address) => println!("IPv4 addr: {}", address),
+    V6(address) => println!("Ipv6 addr: {}", address),
+}
+                        
+
+ +
+

+enum Option<T> {
+    Some(T),
+    None
+}
+                        
+
+
+ +
+
+

Error Control

+
+ +
+

+try:
+    something()
+except Exception:
+    pass
+                        
+
+ +
+

+try {
+   something();
+} catch (Exception ex) {
+   System.out.println(ex);
+}
+                        
+
+ +
+

+FILE* f = fopen("someting.txt", "wb");
+fprintf(f, "Done!");
+fclose(f);
+                        
+
+ +
+
+ Onde o erro foi tratado nisso? +
+
+ +
+

+enum Result<T, E> {
+    Ok(T),
+    Err(E),
+}
+                        
+
+ +
+

+match File::create("something.txt") {
+    Ok(fp) => fp.write_all(b"Hello world"),
+    Err(err) => println!("Failure! {}", err),
+}
+                        
+
+ +
+

+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),
+}
+                        
+
+ +
+

+let mut file = File::create("something.txt").unwrap();
+file.write(b"Hello world").unwrap();
+                        
+
+ +
+

+let mut file = File::create("something.txt")?;
+file.write(b"Hello world")?;
+OK(())
+                        
+
+
+ +
+
+

Macros

+
+
+ +
+
+

Traits/Generics

+
+
+ +
+
+

Crazy stuff

+
+ +
+ How Rust’s standard library was vulnerable for years and nobody noticed +
+ +
+ No, the problem isn’t “bad coders” +
+ +
+ 4.5k issues no Github +
+ +
+ rustup + +
+ stable-x86_64-pc-windows-msvc +
+ +
+ armv7-unknown-linux-gnueabihf +
+ +
+ wasm32-unknown-unknown (WebAssembly) +
+
+
+ +
+
+

Bibliotecas

+
+ +
+

Rayon

+ +

+fn sum_of_squares(input: &[i32]) -> i32 {
+    input.iter()
+         .map(|&i| i * i)
+         .sum()
+}
+                        
+
+ +
+

Rayon

+ +

+fn sum_of_squares(input: &[i32]) -> i32 {
+    input.par_iter()
+         .map(|&i| i * i)
+         .sum()
+}
+                        
+
+ +
+

Log-Derive

+ +

+#[logfn(ok = "TRACE", err = "ERROR")]
+fn call_isan(num: &str) -> Result<Success, Error> {
+    if num.len() >= 10 && num.len() <= 15 {
+        Ok(Success)
+    } else {
+        Err(Error)
+    }
+}
+                        
+
+
+ +
+
+ +
+
+
+
+ + + + + + + + diff --git a/reveal.js b/reveal.js index d9dcff1..15dec96 160000 --- a/reveal.js +++ b/reveal.js @@ -1 +1 @@ -Subproject commit d9dcff1503cb4e8043a2b434de3cc635914164cb +Subproject commit 15dec96e73f2bc8ee8984d7e53828b6417eabf46