Introductie Rust

Introductie Rust voor Linux User Group Nijmegen 14 juni 2022

Bèr berkes Kessels

Rust

Over deze presentatie

  • Is online: berk.es/lugn-rust (github.com/berkes/rust-pres)
  • Bevat alle links
  • Enige kennis van automatisering of programmeren is mooi
  • Is in het Nederlands

Over mij

  • Bèr berkes Kessels
  • @berkes
  • Werkt aan Plannel
  • Blog berk.es
  • Mail ber@berk.es

Doel

  • Je volgend project(je) in Rust?
  • Hoe begin ik met Rust?
  • Wanneer er interesse en tijd is, zullen we dieper in een voorbeeld duiken.

Waarom Rust

Alles is C

Software is eating the world

– Marc Andreessen

De wereld, anno 2022, draait op C.

De grote ontwerpfout

I call it my billion-dollar mistake…

– Tony Hoare, inventor of ALGOL W.

Memory safety

Roughly 70% of all serious security bugs in the Chrome codebase are memory management and safety bugs

– Google engineers

Mozilla

  • 2010: Mozilla komt met Project Servo
  • Rust 1.0, eerste stabiele versie: op 15 mei 2015 gelanceerd.
  • 2021 - Rust Foundation door “Big five”

Rust is intended to be a language for highly concurrent and highly safe systems,

– Graydon Hoare inventor of Rust.

Op te lossen probleem: Memory Safety

Iedereen: Garbage Collector

C en C++: DIY

Rust Is the Industry’s ‘Best Chance’ at Safe Systems Programming – Microsoft

Rust: Borrow checker (ownership)

Ownership is Rust’s most unique feature, and it enables Rust to make memory safety guarantees without needing a garbage collector. – The Rust Handbook

Threading

Fearless Concurrency

By leveraging ownership and type checking, many concurrency errors are compile-time errors in Rust rather than runtime errors. – The Rust Programming Lanuage Handbook

Who?

Android, Amazon, Cloudflare, Discord, Dropbox, …

Microsoft, Google, IBM, Facebook, Huawei, Mozilla, Samsung, Kraken.

Signal, System76, Npm, Nextcloud, Fly.io.

Waarom Rust voor mij

Wat is voor mij belangrijk?

  • Software moet decennia doorontwikkeld kunnen worden.
  • Het Goede Is De Standaard (en het foute is heel moeilijk).
  • Eenvoudiger (niet makkelijker). Hosting, Testen, Delivery.
  • C is te moeilijk - Java te complex.
  • Ik ben Ruby developer (en web, dus Typescript/JavaScript).

Goede Dingen

  • Compiler dwingt to nadenken.
  • Type checker, Borrow checker maakt je beter.
  • Briljante Compiler Errors, Clippy, Type/Borrow voelt als Peer Programmer.
  • Supermakkelijk te deployen.
  • Als het compiled, dan werkt het!
  • Werkt vandaag. Werkt over tien jaar.

Slechte Dingen (voor anderen)

  • Trage Compiler
  • LLVM (en niet GCC)
  • Grote binaries

Slechte Dingen (voor mij)

  • Borrow- en Type checker maakt me traag.
  • Onbekendheid met Result<T,E>, Types, Traits, etc.: Decennia aan OOP uitbannen.
  • Onbekendheid met de enorme stdlib.
  • Heel Veel tooling (en geen apt-get).
  • Enorme build assets (Gigabytes aan caches).

Hello World

Hello World

fn main() {
    println!("Hello World!");
}

rustc hello.rs

Play

Hello Functions

fn main() {
    println!("Hello {}!", "Moon");
    greet("Mars");
}

fn greet(name: &str) {
    println!("Hello {}!", name);
}

Play

Hello Types

fn main() {
    let name = format!("{} {}", "Bèr", "Kessels");
    greet(name);
    greet(42);
}

fn greet(name: String) {
    println!("Hello {}!", name);
}
  • Wat gaat hier fout?

Play

Hello Borrow Checker

fn main() {
    let name = format!("{} {}", "Bèr", "Kessels");
    greet(name);
    println!("Goodbye, {}", name);
}

fn greet(name: String) {
    println!("Hello {}!", name);
}
  • Wat gaat hier fout?

Play

Hello Trait

pub trait Summary {
    fn summarize(&self) -> String;
}

pub struct NewsArticle {
    pub headline: String,
    pub location: String,
    pub author: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}, by {} ({})", self.headline, self.author, self.location)
    }
}

pub struct Tweet {
    pub username: String,
    pub content: String,
    pub reply: bool,
    pub retweet: bool,
}

impl Summary for Tweet {
    fn summarize(&self) -> String {
        format!("{}: {}", self.username, self.content)
    }
}

pub fn notify<T: Summary>(item: &T) {
    println!("Breaking news! {}", item.summarize());
}

Play

Getting Started

Tools

  • rustup (of apt-get install rustc rust-all)
  • rustc
  • cargo (of apt-get install cargo)
  • clippy, fmt, wasm, test, clean, publish, watch, run

Resources

Deep Dive

Duik in een voorbeeld