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. @AndrewRadev • Rails & React в ProductHunt • “Програмиране с

    Rust” във ФМИ • TърновоКонф 2018
  2. Ownership fn main() { // `variants` държи собственост let variants

    = vec!["rock", "paper", "scissors"]; // ... } // -> variants се деалокира
  3. 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 се деалокира
  4. 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 се деалокира
  5. 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);
  6. Lifetimes // Няма да се компилира: fn find(s: &str, pattern:

    &str) -> Option<&str> { s.matches(pattern).next() }
  7. 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
  8. Ownership fn get_user_choice() -> &str { // -> невъзможно //

    ... } fn get_user_choice() -> &'static str { "rock" // най-краткото, 80% ще въведат това anyway }
  9. 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() }
  10. Lifetimes fn main() { let text = String::from("истината, цялата истина");

    let result = find(&text, &String::from("цялата")); println!("{:?}", result); }
  11. Borrow checker • По едно и също време към една

    стойност може да съществува само едно от следните: ➢ точно една mutable референция ➢ произволен брой immutable референции
  12. Lifetimes fn main() { let text = String::from("истината, цялата истина");

    let result = find(&text, &String::from("цялата")); text.push_str(" или поне 30% от нея"); println!("{:?}", result); }
  13. 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
  14. Защо толкова сложно? • Ownership – всичко се деалокира автоматично

    и само веднъж • Borrow checker – всички “указатели” са винаги валидни • Lifetimes – necessary evil за локална валидност на функциите • Логична сложност, не случайна сложност
  15. Garbage collection? • GC изобщо не е “просто” :) •

    Ruby – GC по време на request • Go: неконфигурируем GC, минимизира паузи, за сметка на други неща (цък) • Embedded (дрони, коли, самолети, ракети) – GC напълно се избягва
  16. Quickmd: Защо? • Github CSS • Self-contained • Vim keybinding-и

    (разбира се) • Update on change • “Quick”
  17. Quickmd: Защо Rust? • Self-contained – едно exe, it Just

    Works • Малко езици всъщност имат адекватни binding-и • На Python не беше много “quick” • Лесно е (да, наистина)
  18. Толкова ли е трудно наистина? • Един семестър, 40 часа,

    3-4 домашни, между другите лекции, контролни • Един месец за крайния проект, между другите изпити • 2-3 курс, тук-таме 4ти
  19. Не ядат само уеб ‘леб хората • Rust не предписва

    за какво ще го използвате • Съответно: използва се за всякакви неща • Не е толкова лесен, но не е и толкова труден • Изпипан е, харесван е, и това движи нещата напред
  20. Бъдещето на Rust? • 8ма година “най-харесван” :) • Web

    tooling? • Desktop apps? • Rocket science? • Каквото си искаме – стига да има желание, със софтуера всичко е правимо
  21. Ресурси • 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 седмици)