diff --git a/img/compiler_complaint.png b/img/compiler_complaint.png new file mode 100644 index 0000000..7296d07 --- /dev/null +++ b/img/compiler_complaint.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0467e6d0e9c81afea4164d28def71999233b3848868c60425c8838c0998270dd +size 32187 diff --git a/rust-intro.org b/rust-intro.org index f15904b..b1419f7 100644 --- a/rust-intro.org +++ b/rust-intro.org @@ -5,11 +5,11 @@ #+OPTIONS: p:nil pri:nil prop:nil stat:t tags:t tasks:t tex:t #+OPTIONS: timestamp:t title:t toc:t todo:t |:t #+TITLE: \includesvg[height=.25\textheight]{img/rust-logo-blk}\newline An introduction to Rust -#+DATE: \today #+AUTHOR: \href{mailto:finga@onders.org}{finga} #+EMAIL: finga@onders.org #+SUBTITLE: A language empowering everyone to build reliable and efficient software. -#+DESCRIPTION: +#+DATE: \today +#+DESCRIPTION: An introduction into Rust and its ecosystems. #+LANGUAGE: en #+KEYWORDS: rust programming #+SELECT_TAGS: export @@ -18,6 +18,7 @@ #+OPTIONS: H:2 #+LATEX_CLASS: beamer +#+LATEX_CLASS_OPTIONS: [aspectratio=1610] #+COLUMNS: %45ITEM %10BEAMER_env(Env) %10BEAMER_act(Act) %4BEAMER_col(Col) %8BEAMER_opt(Opt) #+LATEX_HEADER: \usepackage{svg}\hypersetup{colorlinks=true,linkcolor=black,urlcolor=gray} #+BEAMER_THEME: Frankfurt @@ -25,7 +26,6 @@ #+BEAMER_FONT_THEME: #+BEAMER_INNER_THEME: #+BEAMER_OUTER_THEME: -#+LaTeX_CLASS_OPTIONS: [smaller] * Rust ** Abstract @@ -35,7 +35,7 @@ #+END_CENTER *** Rust, the language - - A bit more than 10 years old (2010) + - First appearance 2010 - Memory safe without gcing, optional reference counting - Ownership, lifetimes, traits, functional paradigms - Variables are immutable by default and can be shadowed @@ -52,24 +52,37 @@ - Strong type system prevents [[https://doc.rust-lang.org/nomicon/races.html][data races]], brings [[https://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html]['fearless concurrency']] (amongst others). - Seamless C interop, and [[https://doc.rust-lang.org/rustc/platform-support.html][dozens of supported platforms]] (based on - LLVM).[fn:3] + LLVM).[fn:4] - [[https://insights.stackoverflow.com/survey/2021#technology-most-loved-dreaded-and-wanted]["Most loved language"]] for 6 years in a row. - Modern tooling: ~cargo~ (builds just work), ~clippy~ (450+ code quality lints), ~rustup~ (easy toolchain management). -** Strengths and Weaknesses[fn:2] +** Strengths and Weaknesses[fn:3] *** Points you might run into (Weaknesses) - - Steep learning curve[fn:4] compiler enforcing (esp. memory) + - Steep learning curve[fn:5] compiler enforcing (esp. memory) rules that would be "best practices" elsewhere. - Missing Rust-native libs in some domains, target platforms - (esp. embedded), IDE features.[fn:4] + (esp. embedded), IDE features.[fn:5] - Longer compile times than "similar" code in other - languages.[fn:4][fn:5] + languages.[fn:5][fn:6] - No formal language specification, can prevent legal use in some - domains (aviation, medical, ...).[fn:6] + domains (aviation, medical, ...).[fn:7] - Careless (use of ~unsafe~ in) libraries can secretly break safety guarantees. +** Problems and security Rust tries to conquer + #+BEGIN_CENTER + #+LaTeX:\includegraphics[width = 0.8\textwidth]{img/compiler_complaint.png} + [fn:8] + #+END_CENTER + + - Dangling pointers / memory safety + - Iterator invalidation + - Thread safety / concurreny + - Segfaults + - Error handling + - Zero-cost abstractions + ** Where to start? *** First Steps - [[https://tourofrust.com/TOC_en.html][Tour of Rust]] @@ -77,10 +90,11 @@ - [[https://dhghomon.github.io/easy_rust/Chapter_1.html][Rust in Easy English]] - [[https://doc.rust-lang.org/rust-by-example/][Rust by Example]] (~$ rustup docs --rust-by-example~) - [[https://doc.rust-lang.org/std/][The Rust Standard Library]] (~$ rustup docs --std~) - - [[https://doc.rust-lang.org/nomicon/][The Rustonomicon]]: About unsafe Rust (~$ rustup docs --nomicon~) + - [[https://doc.rust-lang.org/nomicon/][The Rustonomicon]]: The Art of unsafe Rust (~$ rustup docs + --nomicon~) - Use '~$ rustup help docs~' to get an overview -*** Helpful sites +*** Other helpful sites - [[https://cheats.rs][cheats.rs]] - [[https://programming-idioms.org/cheatsheet/Rust][programming-idioms.org]] @@ -94,6 +108,131 @@ - [[https://www.reddit.com/r/rust][r/rust]] - [[https://this-week-in-rust.org/][This Week in Rust]] +** Language + - Semicolons have meaning + - Mutability + - Shadowing + - Functional paradigms + +** Mutability and shadowing +*** Immutable variable + #+BEGIN_SRC rust + let foo = 5; + #+END_SRC + +*** Mutable variable + #+BEGIN_SRC rust + let mut bar = 5; + bar = 6; + #+END_SRC + +*** Shadowing + #+BEGIN_SRC rust + let baz = 5; + let baz = baz + 3; + #+END_SRC + +** Type aliases + +** Tuple structs +*** Definition of a tuple struct + #+BEGIN_SRC rust + struct Rectangle(usize, usize); + #+END_SRC + +*** Instantiation of a tuple struct + #+BEGIN_SRC rust + let rect = Rectangle(3, 5); + #+END_SRC + +*** Access of a tuple struct's field + #+BEGIN_SRC rust + rect.0; + rect.1; + #+END_SRC + +** Structs + - Direct access vs. getter and setter + - ~Something::new(item)~ and ~Something::default()~ + +*** Definition of a struct + #+BEGIN_SRC rust + struct Something { + id: usize, + item: String, + } + #+END_SRC + +** Error related types + - Heavy use of ~Option~ and ~Result~ + +*** Option + #+BEGIN_SRC rust + pub enum Option { + None, + Some(T), + } + #+END_SRC + +*** Result + #+BEGIN_SRC rust + pub enum Result { + Ok(T), + Err(E), + } + #+END_SRC + +** Error handling + +*** Unrecoverable errors \rightarrow panics + #+BEGIN_SRC rust + fn get_data() -> Data { + ... + panic!("Cannot get data"); + } + #+END_SRC + +*** Recoverable error with anyhow + #+BEGIN_SRC rust + fn get_data() -> Result { + ... + Ok(data) // return is only used for "early" returns + } + ... + let data = get_data()?; + ... + #+END_SRC + +** Use functional language features + - ~vec![1, 2, 3].iter()~ + - ~vec![1, 2, 3].iter().sum()~ + - ~vec![1, 2, 3].iter().map(|x| x + 1).collect()~ + - ~foo.into_iter().filter(|i| i.bar == 0).collect()~ + - ~Iterator~ trait + +** Control structures + - ~if~, ~if let~, ~match~ + - ~loop~, ~for~, ~map()~ + +** Tests + - Use ~assert!()~ family + - Unit tests + - Put them into a test module + - Annotate the test module with ~#[cfg(test)]~ + - Annotate the tests with ~#[test]~ + - Documentation testing + - Integration testing + - Integration tests are put into the ~src/tests/~ directory + +** Documentation + - Documentation comments: ~///~ + - Markdown notation + - ~cargo doc~ runns rustdoc which generates html docs + - ~cargo doc --open~ runs rustdoc and opens the result in a browser + - rustdoc documentation: https://doc.rust-lang.org/beta/rustdoc/index.html + +** FFI (Foreign Function Interface) + * Cargo ** Cargo #+BEGIN_CENTER @@ -105,8 +244,36 @@ ** What is it? - Package manager + - Cargo calls ~rustc~, the Rust compiler - Build tool - - A Cargo project contains least one crate + - A Cargo project contains at least one crate + +** Hello, World + Executing ~`cargo new foobar`~ creates a new project... + +*** foobar/Cargo.toml + #+BEGIN_SRC toml + [package] + name = "foo" + version = "0.1.0" + authors = ["finga "] + edition = "2018" + #+END_SRC + \tiny + #+BEGIN_SRC toml + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + #+END_SRC + \normalsize + #+BEGIN_SRC toml + [dependencies] + #+END_SRC + +*** foobar/src/main.rs + #+BEGIN_SRC rust + fn main() { + println!("Hello, world!"); + } + #+END_SRC ** Docs - [[https://doc.rust-lang.org/cargo/index.html][The Cargo Book]] (~$ rustup docs --cargo~) @@ -118,12 +285,27 @@ - ~checkmate~: Run a list of checks (~check~, ~format~, ~build~, ~test~, ~doc~, ~audit~). - ~clippy~: Linter and static code analysis. - - ~deb~: Automatically create a binary Debian package. - - ~edit~: Modify your ~Cargo.toml~ from the command line. + - ~deb~: Automatically create a Debian package. - ~flamegraph~: Generate flamegraphs about anything. - ~fmt~: Format Rust code according to style guidelines. - ~install-update~: Keep all your Cargo commands up to date. +*** @@comment: comment@@ + Cargo downloads your Rust package's dependencies, compiles your + package, makes distributable packages, and uploads them to + [[https://crates.io][crates.io]], the Rust community's package registry. + +** The Rust (package) registry + +*** Official registry + [[https://crates.io][crates.io]] + +*** Unofficial [[https://crates.io][~crates.io~]] frontend + [[https://lib.rs][lib.rs]] same but different.. + +** Docs + - The [[https://doc.rust-lang.org/cargo/][Cargo Book]]. + * Setup ** Install the Rust-Toolchain *** Install Rust @@ -140,16 +322,55 @@ - Activate nightly locally (in current dir): ~$ rustup override set nightly~ -* Hands on +** Handle the Rust toolchain with ~rustup~ -* Testing +*** Install the Rust toolchain ([[https://rustup.rs][~rustup.rs~]]) + #+BEGIN_SRC sh + $ curl --proto '=https' --tlsv1.2 -sSf \ + https://sh.rustup.rs | sh + #+END_SRC -* Documentation +*** Update ~rustup~ + #+BEGIN_SRC sh + $ rustup self update + #+END_SRC + +*** Check for updates for installed toolchains + #+BEGIN_SRC sh + $ rustup check + #+END_SRC + +*** Update toolchains if outdated + #+BEGIN_SRC sh + $ rustup update + #+END_SRC * IDE support - [[https://areweideyet.com/][Are we IDE yet]] +** Are we IDE yet?[fn:9] + \tiny +| | \rotatebox{90}{Syntax highlightning (.rs)} | \rotatebox{90}{Syntax highlightning (.toml)} | \rotatebox{90}{Snippets} | \rotatebox{90}{Code Completion} | \rotatebox{90}{Linting} | \rotatebox{90}{Code Formatting} | \rotatebox{90}{Go-to Definiton} | \rotatebox{90}{Debugging} | \rotatebox{90}{Documentation Tooltips} | +|---------------------+--------------------------------------------+----------------------------------------------+--------------------------+---------------------------------+-------------------------+---------------------------------+---------------------------------+---------------------------+----------------------------------------| +| Atom | [X] | [X] | [X] | [X] | [X] | [X] | [X] | | [X] | +| Emacs | [X] | [X] | [X] | [X] | [X] | [X] | [X] | | [X] | +| Sublime | [X] | [X] | [X] | [X] | [X] | [X] | [X] | | | +| Vim/Neovim | [X] | [X] | [X] | [X] | [X] | [X] | [X] | | [X] | +| VS Code | [X] | [X] | [X] | [X] | [X] | [X] | [X] | [X] | [X] | +| BBedit | [X] | [X] | [X] | | | [X] | [X] | | | +| Geany | [X] | | | | | | | | | +| gedit | [X] | | | [X] | | | [X] | | | +| Kakoune | [X] | [X] | [X] | [X] | [X] | [X] | [X] | | [X] | +| Kate | [X] | [X] | | [X] | [X] | [X] | [X] | | | +| Micro | [X] | [X] | | | [X] | [X] | | | | +| Midnight Commander | [X] | | | | | | | | | +| Textadept | [X] | [X] | [X] | [X] | [X] | | [X] | | | +|---------------------+--------------------------------------------+----------------------------------------------+--------------------------+---------------------------------+-------------------------+---------------------------------+---------------------------------+---------------------------+----------------------------------------| +| Eclipse | [X] | | [X] | [X] | [X] | [X] | [X] | [X] | [X] | +| IntelliJ-based IDEs | [X] | [X] | [X] | [X] | [X] | [X] | [X] | [X] | [X] | +| Visual Studio | [X] | | | [X] | | | [X] | [X] | | +| GNOME Builder | [X] | | [X] | [X] | [X] | [X] | [X] | | | +| Ride | [X] | | | | | | | | | -* (Standard?) crates +* Common Crates - [[https://crates.io][crates.io]]/[[https://lib.rs][lib.rs]] - [[https://github.com/rust-unofficial/awesome-rust][Awesome Rust]] @@ -185,8 +406,11 @@ * Footnotes [fn:1] [[https://commons.wikimedia.org/wiki/File:Bruine_roest_op_tarwe_(Puccinia_recondita_f.sp._tritici_on_Triticum_aestivum).jpg][Wikimedia]] -[fn:2] Copied from: https://cheats.rs. -[fn:3] Work on GCC: [[https://rust-gcc.github.io/][rust-gcc]] and [[https://news.ycombinator.com/item?id=27775544][gcc rust backend]]. -[fn:4] [[https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html#why-not-use-rust][Rust survey]] -[fn:5] [[https://news.ycombinator.com/item?id=23538220][The Rust compiler isn't slow; we are]] -[fn:6] [[https://people.mpi-sws.org/%7Ejung/thesis.html][Understanding and Evolving the Rust Programming Language]] +[fn:2] Copied list from: [[https://cheats.rs/#tab-hello-3][cheats.rs]]. +[fn:3] Copied list from: [[https://cheats.rs/#tab-hello-4][cheats.rs]]. +[fn:4] Work on GCC: [[https://rust-gcc.github.io/][rust-gcc]] and [[https://news.ycombinator.com/item?id=27775544][gcc rust backend]]. +[fn:5] [[https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html#why-not-use-rust][Rust survey]] +[fn:6] [[https://news.ycombinator.com/item?id=23538220][The Rust compiler isn't slow; we are]] +[fn:7] [[https://people.mpi-sws.org/%7Ejung/thesis.html][Understanding and Evolving the Rust Programming Language]] +[fn:8] https://xkcd.com/371/ +[fn:9] [[https://areweideyet.com/][areweideyet.com]]