diff --git a/slides/2025-10-10-how-rust-compiles/index.html b/slides/2025-10-10-how-rust-compiles/index.html index 6f67d70..bc9bdff 100644 --- a/slides/2025-10-10-how-rust-compiles/index.html +++ b/slides/2025-10-10-how-rust-compiles/index.html @@ -25,8 +25,7 @@
-

how Rust compiles

-

i promise it's actually doing something useful while you wait

+

how rust compiles

@@ -35,7 +34,7 @@ @@ -59,7 +58,7 @@

cargo vs rustc


-                    $ cargo build -v
+                    $ cargo build
                 
cargo
@@ -71,11 +70,11 @@
-

what does rustc like, do?

-

a quick overview of the compilation phases

+

so you want to compile a crate

-

it all starts at the source

+

so you want to compile a crate

+

source code:


               #[no_mangle]
               pub fn add(a: u8, b: u8) -> u8 {
@@ -83,38 +82,6 @@
               }
             
-
-

the frontend and the backend

-
-
-              %%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%%
-              flowchart LR
-                subgraph compiler
-                  frontend --> backend
-                end
-                source --> frontend
-                backend --> binary
-            
-
-
-
-

lex, parse, resolve, typecheck, all these fancy things

-
-
-              %%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%%
-              flowchart TB
-                function --> return
-                function --> params
-                params --> a_def[a]
-                params --> b_def[b]
-                function --> body
-                body --> cl["method call"]
-                cl --> a_use[a]
-                cl --> wrapping_add
-                cl --> b_use[b]
-            
-
-

so you want to compile a crate

MIR

@@ -147,20 +114,6 @@ ```
-
- -
-
- -

codegen units


@@ -176,7 +129,7 @@ fn main() {}
                   mainll["main (LLVM IR)"]
                 end
 
-                mycgu1 --> |LLVM| mycgu1.rcgu.o
+                mycgu1 --> mycgu1.rcgu.o
 
                 mainmir --> mainll
 
@@ -358,6 +311,18 @@ fn main() { math::add() }
             
+
+ +
@@ -577,46 +542,11 @@ fn main() { math::add() } -
-
- -
-
- -
-
- -
-
-
diff --git a/slides/speaker-notes.md b/slides/speaker-notes.md deleted file mode 100644 index 7408934..0000000 --- a/slides/speaker-notes.md +++ /dev/null @@ -1,101 +0,0 @@ -# how rust compiles - -- welcome to my talk about how rust compiles - - we'll take a look at rusts compilation model -- before we get started - - example of confusing behavior arising from the model -- me -- behind cargo build - - we use cargo - - one cargo many rustc per crate - - use -v -- what does rustc do -- source example - - add function that adds -- frontend and backend -- frontend in a single slide - - parse into AST - - resolve, typecheck -- MIR - - intermediate representation - - borrow checker -- LLVM IR - - LLVM backend - - clang, swift, julia - - IR to assembly - - optimizes -- Assembly - - machine code -- it's not that simple -- backend orchestration - - how, what, and when invoking LLVM -- codegen unit - - LLVM module/object file - - group of functions - - linked together -- more codegen units - - three functions into two codegen units - - functions grouped into codegen units is complicated -- codegen units cross crate - - a great add function - - add into cgu in math crate - - object file into rlibs -- generics - - mono -- instantiating generics - - MIR to LLVM IR -- generics cross crate - - math crate only MIR - - instantiated in our own crate - - read MIR from rlib -- inlining - - a function call - - inefficient call - - maybe just turn it into 5 -- inlining - - very good - - everywhere, or very slow -- cross crate inlining catch - - access to the body -- #[inline] - - why? -- #[inline] - - like a generic function - - instantiated downstream -- #[inline] - - non-generic - - automatically for small - - not for others - - cross-crate-inline-threshold=always - - dont always use it because its slow - - dont forget about it - - benchmark - - todo -- if you dont want to worry about this as an application -- LTO - - no cross-crate-inline-threshold - - LTO - - applies optimizations once for everything at the end - - breaks crate boundaries - - slow -- fat LTO - - LLVM IR instead of machine code in libs - - combines all LLVM IR - - this CGU is huge, not parallel - - see everything - - not all optimizations for larger programs -- thin LTO - - confusing name - - try both - - LLVM IR for libs - - for generics, just in instantiating crate - - combine for summary - - summary of function (size and where to find it) - - many different units in parallel - - look at the summary for inlining -- linker plugin LTO - - fat LTO or thin LTO - - not by rustc, but by the linker - - across languages - - LLVM IR from Rust, LLVM IR from clang - - annoying to set up