Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust: Настояще и бъдеще (БургасКонф 2022)

Rust: Настояще и бъдеще (БургасКонф 2022)

През 2018та зарибявах хора по Rust в Търново, но за четири години езика акумулира доста популярност. Все още е статично типизиран и учудващо удобен, все още е малко трудничък за научаване, но далеч не невъзможен и инкрементално по-удобен.

Дали ще се задържи или няма да се отлепи от земята? Поне за момента траекторията му върви бавно и постепенно нагоре. Ще ви разкажа малко за какво се използва, защо толкова програмисти го харесват и какво, всъщност, му е толкова трудното за научаване.

Andrew Radev

August 29, 2022
Tweet

More Decks by Andrew Radev

Other Decks in Programming

Transcript

  1. ust: настояще и бъдеще

    View Slide

  2. @AndrewRadev

    Rails & React в ProductHunt

    “Програмиране с Rust” във ФМИ

    TърновоКонф 2018

    View Slide

  3. Какво ново от 2018та?

    View Slide

  4. Какво ново?

    View Slide

  5. Какво ново?

    View Slide

  6. Какво ново?

    View Slide

  7. Какво старо?

    View Slide

  8. Какво ново?

    View Slide

  9. Защо е чак толкова харесван? 🤔
    Стокхолмски синдром 🇸🇪

    View Slide

  10. Какво му е трудното?
    (demo)

    View Slide

  11. Какво му е трудното?
    1. Ownership / Move semantics
    2. Lifetimes
    3. Borrow checker

    View Slide

  12. Ownership
    fn main() {
    // `variants` държи собственост
    let variants = vec!["rock", "paper", "scissors"];
    // ...
    } // -> variants се деалокира

    View Slide

  13. Ownership
    fn main() {
    // `variants` държи собственост
    let variants = vec!["rock", "paper", "scissors"];
    // `variants` се премества
    let computer_choice = get_computer_choice(variants);
    // -> variants се деалокира
    // ...
    }
    fn get_computer_choice(variants: Vec<&str>) -> &str {
    let random_int: usize = rand::random();
    variants[random_int % variants.len()]
    } // -> variants се деалокира

    View Slide

  14. Ownership
    fn get_user_choice() -> &str {
    let mut user_choice = String::new();
    let _ = std::io::stdin().read_line(&mut user_choice);
    user_choice.trim()
    } // -> user_choice се деалокира

    View Slide

  15. Ownership / Borrowing
    fn get_user_choice(buffer: &mut String) -> &str {
    let _ = std::io::stdin().read_line(buffer);
    buffer.trim()
    }
    let mut buffer = String::new();
    let user_choice = get_user_choice(&mut buffer);

    View Slide

  16. Lifetimes
    // Няма да се компилира:
    fn find(s: &str, pattern: &str) -> Option<&str> {
    s.matches(pattern).next()
    }

    View Slide

  17. Lifetimes
    // Няма да се компилира:
    fn find(s: &str, pattern: &str) -> Option<&str> {
    // ...
    }
    error[E0106]: missing lifetime specifier
    --> src/main.rs:1:43
    |
    1 | fn find(s: &str, pattern: &str) -> Option<&str> {
    | ---- ---- ^ expected named
    lifetime parameter
    |
    = help: this function's return type contains a borrowed
    value, but the signature does not say whether it is borrowed
    from `s` or `pattern`
    help: consider introducing a named lifetime parameter

    View Slide

  18. Ownership
    fn get_user_choice() -> &str { // -> невъзможно
    // ...
    }
    fn get_user_choice() -> &'static str {
    "rock" // най-краткото, 80% ще въведат това anyway
    }

    View Slide

  19. Lifetimes
    fn find<'a, 'b>(s: &'a str, pattern: &'b str)
    -> Option<&'a str> {
    s.matches(pattern).next()
    }
    fn find<'a>(s: &'a str, pattern: &str) -> Option<&'a str> {
    s.matches(pattern).next()
    }

    View Slide

  20. Lifetimes
    fn main() {
    let text = String::from("истината, цялата истина");
    let result = find(&text, &String::from("цялата"));
    println!("{:?}", result);
    }

    View Slide

  21. Borrow checker

    По едно и също време към една стойност
    може да съществува само едно от следните:

    точно една mutable референция

    произволен брой immutable референции

    View Slide

  22. Lifetimes
    fn main() {
    let text = String::from("истината, цялата истина");
    let result = find(&text, &String::from("цялата"));
    text.push_str(" или поне 30% от нея");
    println!("{:?}", result);
    }

    View Slide

  23. Lifetimes
    error[E0502]: cannot borrow `text` as mutable because it is
    also borrowed as immutable
    --> src/main.rs:9:5
    |
    7 | let result = find(&text, &String::from("цялата"));
    | ----- immutable borrow occurs here
    8 |
    9 | text.push_str("или поне 30% от нея");
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow
    occurs here
    10 |
    11 | println!("{:?}", result);
    | ------ immutable borrow later used
    here

    View Slide

  24. Защо е толкова сложно?
    За да бъде просто :)

    View Slide

  25. Защо толкова сложно?

    Ownership – всичко се деалокира
    автоматично и само веднъж

    Borrow checker – всички “указатели” са
    винаги валидни

    Lifetimes – necessary evil за локална
    валидност на функциите

    Логична сложност, не случайна сложност

    View Slide

  26. Garbage collection?

    GC изобщо не е “просто” :)

    Ruby – GC по време на request

    Go: неконфигурируем GC, минимизира паузи,
    за сметка на други неща (цък)

    Embedded (дрони, коли, самолети, ракети) –
    GC напълно се избягва

    View Slide

  27. Rocket science
    React, Ember, Vue,
    Svelte

    View Slide

  28. За боба, ‘леба, че и за уеба

    View Slide

  29. За боба, ‘леба, че и за уеба

    View Slide

  30. За боба, ‘леба, че и за уеба

    View Slide

  31. За боба, ‘леба, че и за уеба

    View Slide

  32. За боба, ‘леба, че и за уеба

    View Slide

  33. Не ядат само уеб ‘леб хората

    View Slide

  34. Quickmd: Защо?

    Github CSS

    Self-contained

    Vim keybinding-и (разбира се)

    Update on change

    “Quick”

    View Slide

  35. Quickmd: Защо Rust?

    Self-contained – едно exe, it Just Works

    Малко езици всъщност имат адекватни
    binding-и

    На Python не беше много “quick”

    Лесно е (да, наистина)

    View Slide

  36. Десктоп неща

    GTK binding-и

    Tauri

    Egui

    View Slide

  37. Всякакви неща

    View Slide

  38. Всякакви неща

    View Slide

  39. Всякакви неща

    View Slide

  40. Толкова ли е трудно наистина?

    Един семестър, 40 часа, 3-4 домашни, между
    другите лекции, контролни

    Един месец за крайния проект, между
    другите изпити

    2-3 курс, тук-таме 4ти

    View Slide

  41. По-опитни студенти...

    View Slide

  42. По-опитни студенти...

    View Slide

  43. “Empowering”

    View Slide

  44. “Empowering”

    View Slide

  45. Не ядат само уеб ‘леб хората

    Rust не предписва за какво ще го използвате

    Съответно: използва се за всякакви неща

    Не е толкова лесен, но не е и толкова труден

    Изпипан е, харесван е, и това движи нещата
    напред

    View Slide

  46. Бъдещето на Rust?

    8ма година “най-харесван” :)

    Web tooling?

    Desktop apps?

    Rocket science?

    View Slide

  47. Rocket science?

    View Slide

  48. Rocket science?

    View Slide

  49. Бъдещето на Rust?

    8ма година “най-харесван” :)

    Web tooling?

    Desktop apps?

    Rocket science?

    Каквото си искаме – стига да има желание,
    със софтуера всичко е правимо

    View Slide

  50. Ресурси

    The Rust Book: https://doc.rust-lang.org/stable/book/

    Rust курса във FMI: https://fmi.rust-lang.bg/

    (Вижте “стари издания” за видео в секция
    “Материали”)

    Разни проекти от курса:
    https://github.com/fmi/rust-projects

    Кой предлага работа на Rust? /r/rust

    (Нов тред всеки 6 седмици)

    View Slide