class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, left ## `0000 trace 1` ## `0002 putobject 2` ## `0004 putobject 2` ## `0006 opt_plus
i32 { 5 } fn main() { foo(10); } ``` --- class: middle ```asm foo: movl $5, %eax movb $61, -1(%rsp) movl %edi, -8(%rsp) retq main: pushq %rax movl $10, %edi callq foo movl %eax, 4(%rsp) popq %rax retq ``` --- class: middle, center  --- class: middle ```ruby class Foo def hello "hello" end end f = Foo.new f.hello ``` --- class: middle, center  --- class: middle ```cpp struct Foo; impl Foo { fn hello(&self) -> &str { "hello" } } fn main() { let f = Foo; f.hello(); } ``` --- class: middle, center  --- class: middle, center  --- class: middle  --- class: middle, center  --- class: middle ```ruby module Bar def hello "bar" end end class Foo include Bar end f = Foo.new f.hello ``` --- class: middle, center  --- class: middle ```cpp struct Foo; trait Bar { fn hello(&self) -> &str; } impl Bar for Foo { fn hello(&self) -> &str { "hello" } } fn main() { let f = Foo; f.hello(); } ``` --- class: middle, center  --- class: middle ```ruby def hello(f) f.hello end f = Foo.new hello(f) ``` --- class: middle, center  --- class: middle ```cpp fn hello
(f: T) { f.hello(); } fn main() { let f = Foo; hello(f); } ``` --- class: middle ```cpp struct Foo; struct Qux; impl Bar for Foo { // ... impl Bar for Qux { // ... fn hello
(f: T) { // ... fn main() { let f = Foo; hello(f); let q = Qux; hello(q); } ``` --- class: middle # Monomorphization ```cpp fn hello_foo(f: Foo) { // ... fn hello_qux(f: Qux) { // ... fn main() { let f = Foo; hello_foo(f); let q = Qux; hello_qux(q); } ``` --- class: middle  --- class: middle, center  --- class: middle, center  --- class: middle, center  --- class: middle, center 