mirror of
https://github.com/Noratrieb/website.git
synced 2026-01-14 17:05:02 +01:00
better gaming
This commit is contained in:
parent
bcfaf55513
commit
d57e076267
2 changed files with 165 additions and 29 deletions
|
|
@ -25,7 +25,8 @@
|
||||||
<div class="reveal">
|
<div class="reveal">
|
||||||
<div class="slides">
|
<div class="slides">
|
||||||
<section>
|
<section>
|
||||||
<h2>how rust compiles</h2>
|
<h2>how Rust compiles</h2>
|
||||||
|
<h4>i promise it's actually doing something useful while you wait</h4>
|
||||||
</section>
|
</section>
|
||||||
<section style="height: 100%">
|
<section style="height: 100%">
|
||||||
<div style="display: flex; align-items: flex-start; height: 100%">
|
<div style="display: flex; align-items: flex-start; height: 100%">
|
||||||
|
|
@ -34,7 +35,7 @@
|
||||||
<iframe
|
<iframe
|
||||||
height="600"
|
height="600"
|
||||||
width="800"
|
width="800"
|
||||||
src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=aa4567f7a97dd255dc4f314ae2b5d63c"
|
src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=7ac62650fd0b942ae5952b0027e0c1ce"
|
||||||
referrerpolicy="no-referrer"
|
referrerpolicy="no-referrer"
|
||||||
></iframe>
|
></iframe>
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -58,7 +59,7 @@
|
||||||
<p>cargo vs rustc</p>
|
<p>cargo vs rustc</p>
|
||||||
<div style="display: grid; grid-template-columns: 2fr 1fr 2fr">
|
<div style="display: grid; grid-template-columns: 2fr 1fr 2fr">
|
||||||
<pre><code data-trim>
|
<pre><code data-trim>
|
||||||
$ cargo build
|
$ cargo build -v
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<div style="display: flex; align-items: center">cargo</div>
|
<div style="display: flex; align-items: center">cargo</div>
|
||||||
<div style="display: flex; flex-direction: column; align-items: flex-start">
|
<div style="display: flex; flex-direction: column; align-items: flex-start">
|
||||||
|
|
@ -70,11 +71,11 @@
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>so you want to compile a crate</h2>
|
<h2>what does rustc like, do?</h2>
|
||||||
|
<h4>a quick overview of the compilation phases</h4>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>so you want to compile a crate</h2>
|
<h2>it all starts at the source</h2>
|
||||||
<p>source code:</p>
|
|
||||||
<pre><code data-trim>
|
<pre><code data-trim>
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn add(a: u8, b: u8) -> u8 {
|
pub fn add(a: u8, b: u8) -> u8 {
|
||||||
|
|
@ -82,6 +83,38 @@
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>the frontend and the backend</h2>
|
||||||
|
<div class="mermaid">
|
||||||
|
<pre>
|
||||||
|
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%%
|
||||||
|
flowchart LR
|
||||||
|
subgraph compiler
|
||||||
|
frontend --> backend
|
||||||
|
end
|
||||||
|
source --> frontend
|
||||||
|
backend --> binary
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>lex, parse, resolve, typecheck, all these fancy things</h2>
|
||||||
|
<div class="mermaid">
|
||||||
|
<pre>
|
||||||
|
%%{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]
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>so you want to compile a crate</h2>
|
<h2>so you want to compile a crate</h2>
|
||||||
<p>MIR</p>
|
<p>MIR</p>
|
||||||
|
|
@ -114,6 +147,20 @@
|
||||||
```
|
```
|
||||||
</textarea>
|
</textarea>
|
||||||
</section>
|
</section>
|
||||||
|
<section data-markdown>
|
||||||
|
<textarea data-template>
|
||||||
|
## but compiling a ton of crates can't be that simple!
|
||||||
|
|
||||||
|
- yes
|
||||||
|
</textarea>
|
||||||
|
</section>
|
||||||
|
<section data-markdown>
|
||||||
|
<textarea data-template>
|
||||||
|
## backend orchestration
|
||||||
|
|
||||||
|
- the how, what, and when of invoking LLVM
|
||||||
|
</textarea>
|
||||||
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>codegen units</h2>
|
<h2>codegen units</h2>
|
||||||
<pre><code>
|
<pre><code>
|
||||||
|
|
@ -129,7 +176,7 @@ fn main() {}
|
||||||
mainll["main (LLVM IR)"]
|
mainll["main (LLVM IR)"]
|
||||||
end
|
end
|
||||||
|
|
||||||
mycgu1 --> mycgu1.rcgu.o
|
mycgu1 --> |LLVM| mycgu1.rcgu.o
|
||||||
|
|
||||||
mainmir --> mainll
|
mainmir --> mainll
|
||||||
|
|
||||||
|
|
@ -311,18 +358,6 @@ fn main() { math::add() }
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section data-markdown>
|
|
||||||
<textarea data-template>
|
|
||||||
## instantiation modes
|
|
||||||
|
|
||||||
the two ways to instantiate MIR:
|
|
||||||
|
|
||||||
- in the definition crate (Globally Shared)
|
|
||||||
- in the using crate (Local Copy)
|
|
||||||
- generic functions
|
|
||||||
- `#[inline]` functions
|
|
||||||
</textarea>
|
|
||||||
</section>
|
|
||||||
<section data-markdown>
|
<section data-markdown>
|
||||||
<textarea data-template>
|
<textarea data-template>
|
||||||
## inlining
|
## inlining
|
||||||
|
|
@ -341,7 +376,7 @@ fn main() { math::add() }
|
||||||
</section>
|
</section>
|
||||||
<section data-markdown>
|
<section data-markdown>
|
||||||
<textarea data-template>
|
<textarea data-template>
|
||||||
## inlining
|
## let's inline it
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
fn add(a: u8, b: u8) -> u8 {
|
fn add(a: u8, b: u8) -> u8 {
|
||||||
|
|
@ -364,13 +399,13 @@ fn main() { math::add() }
|
||||||
## cross-crate inlining
|
## cross-crate inlining
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
fn add(a: u8, b: u8) -> u8 {
|
pub fn add(a: u8, b: u8) -> u8 {
|
||||||
a + b
|
a + b
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
```rust
|
```rust
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = add(1, 4); // what is the body?...
|
let x = math::add(1, 4); // what is the body?...
|
||||||
println!("{x}");
|
println!("{x}");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
@ -382,13 +417,13 @@ fn main() { math::add() }
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
#[inline]
|
#[inline]
|
||||||
fn add(a: u8, b: u8) -> u8 {
|
pub fn add(a: u8, b: u8) -> u8 {
|
||||||
a + b
|
a + b
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
```rust
|
```rust
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = add(1, 4); // 💡 it's a + b
|
let x = math::add(1, 4); // 💡 it's a + b
|
||||||
println!("{x}");
|
println!("{x}");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
@ -398,13 +433,13 @@ fn main() { math::add() }
|
||||||
<div style="display: flex; flex-direction: row; gap: 16px">
|
<div style="display: flex; flex-direction: row; gap: 16px">
|
||||||
<pre><code data-trim class="language-rust">
|
<pre><code data-trim class="language-rust">
|
||||||
#[inline]
|
#[inline]
|
||||||
fn add(a: u8, b: u8) -> u8 {
|
pub fn add(a: u8, b: u8) -> u8 {
|
||||||
a + b
|
a + b
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<pre><code data-trim class="language-rust">
|
<pre><code data-trim class="language-rust">
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = add(1, 4);
|
let x = math::add(1, 4);
|
||||||
println!("{x}");
|
println!("{x}");
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
@ -441,7 +476,7 @@ fn main() { math::add() }
|
||||||
## `#[inline]`
|
## `#[inline]`
|
||||||
- `#[inline]` enables cross-crate inlining of non-generic functions
|
- `#[inline]` enables cross-crate inlining of non-generic functions
|
||||||
- for very small functions, this happens automatically
|
- for very small functions, this happens automatically
|
||||||
- for other functions, it doesn't, because it would be slow
|
- for other functions, it doesn't, because it would be slow (try with `-Zcross-crate-inline-threshold=always`)
|
||||||
- don't over-apply it in a library, but also don't forget about it
|
- don't over-apply it in a library, but also don't forget about it
|
||||||
- benchmark!
|
- benchmark!
|
||||||
</textarea>
|
</textarea>
|
||||||
|
|
@ -542,11 +577,11 @@ fn main() { math::add() }
|
||||||
<textarea data-template>
|
<textarea data-template>
|
||||||
## linker-plugin-lto
|
## linker-plugin-lto
|
||||||
|
|
||||||
- "original" LTO
|
- fat LTO style and thin LTO style
|
||||||
- like fat LTO
|
|
||||||
- the merging is not done by rustc but by the linker
|
- the merging is not done by rustc but by the linker
|
||||||
- works across languages (Rust (rustc) + C (clang))
|
- works across languages (Rust (rustc) + C (clang))
|
||||||
- great for FFI
|
- great for FFI
|
||||||
|
- annoying to set up
|
||||||
</textarea>
|
</textarea>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
101
slides/speaker-notes.md
Normal file
101
slides/speaker-notes.md
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
# 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
|
||||||
|
- CFG
|
||||||
|
- 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
|
||||||
|
- 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue