Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rust
Search
dherman
September 23, 2012
9
2.1k
Rust
My Emerging Languages 2012 talk: an introduction to Rust, a new open source systems language.
dherman
September 23, 2012
Tweet
Share
More Decks by dherman
See All by dherman
Rust + Node = Neon
dherman
1
310
Evolving the World's Most Popular Programming Language
dherman
0
620
Closing iterators
dherman
0
720
A better future for comprehensions
dherman
0
1.9k
Evolution is Awesome
dherman
0
500
Status Report: ES6 Modules
dherman
16
3.9k
Discussion with TC39 about the semantics of symbols
dherman
1
370
September 2013 Modules Status Update
dherman
2
1.1k
Rust: low-level programming without the segfaults
dherman
13
8.9k
Featured
See All Featured
Building an army of robots
kneath
302
43k
Bash Introduction
62gerente
608
210k
Statistics for Hackers
jakevdp
796
220k
Intergalactic Javascript Robots from Outer Space
tanoku
269
27k
Side Projects
sachag
452
42k
How to train your dragon (web standard)
notwaldorf
88
5.7k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Teambox: Starting and Learning
jrom
133
8.8k
Documentation Writing (for coders)
carmenintech
65
4.4k
Into the Great Unknown - MozCon
thekraken
32
1.5k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Writing Fast Ruby
sferik
627
61k
Transcript
None
a systems language pursuing the trifecta safe, concurrent, fast
None
None
None
None
None
github.com/mozilla/servo
$ hg clone http://hg.mozilla.org/mozilla-central ... 66238 files updated, 0 files
merged, 0 files removed, 0 files unresolved $ cd mozilla-central $ find . -name '*.c' -or -name '*.cpp' -or -name '*.h' -or -name '*.tbl' | xargs wc -l | fgrep total | awk '{total = total + $1}END{print total}' 5433119
2009: Graydon starts full-time work on Rust 2010: Team begins
to grow 2011: Self-hosting via LLVM 2012: 0.1, 0.2, 0.3, 0.4 (soon), and beyond...
♥ The Rust Team Brian Anderson • Tim Chevalier •
Graydon Hoare • Niko Matsakis • Patrick Walton Interns and Alumni Michael Bebenita • Ben Blum • Rafael Espíndola • Roy Frostig • Marijn Haverbeke • Eric Holk • Lindsey Kuper • Elliott Slaughter • Paul Stansifer • Michael Sullivan
• stack allocation • data ownership • monomorphisation and inlining
• actors • message-passing • failure • type safety • pattern matching • type classes • no null
PERFORMANCE CONCURRENCY TYPES
FAST
“Sometimes, cleaning up your code makes it slower even when
it shouldn’t.” — Robert O’Callahan “Abstraction Penalties, Stack Allocation and Ownership Types” http://j.mp/abstraction-penalties
let vec = [1, 2, 3]; vec.each(|item| { print(fmt!("%d ",
item)); true });
let vec = [1, 2, 3]; for vec.each |item| {
print(fmt!("%d ", item)); }
fn from_origin(x: float, y: float) -> float { let x0
= 0.0, y0 = 0.0; dist(x, y, x0, y0) }
struct Point { x: float, y: float }
fn from_origin(p: Point) -> float { let origin = Point
{ x: 0.0, y: 0.0 }; dist(p, origin) }
fn print_point(p: &Point) { match *p { Point {x,y} =>
println(fmt!("(%f, %f)", x, y)) } }
fn print_point(p: &Point) { match *p { Point {x,y} =>
println(fmt!("(%f, %f)", x, y)) } } fn f() { let p = Point { ... }; print_point(&p); }
let p = @Point { ... }; print_point(p);
let p = ~Point { ... }; print_point(p);
let p = ~Point { ... }; box.topLeft = move
p; // deinitialized print_point(p); // error
let p; // uninitialized print_point(p); // error p = ~Point
{ ... };
Rust C++ &T! T& @T! shared_ptr<T> ~T! unique_ptr<T>
CONCURRENT
heap
heap
heap
None
Shared Heap
Shared Heap
Shared Heap
let (ch, port) = pipes::stream(); do spawn |move ch| {
let s = ~Point { x: 1.0, y: 2.0 }; ch.send(s); } let s = port.recv(); assert s.x == 1.0; assert s.y == 2.0;
SAFE
fn is_empty<T>(v: &[T]) -> bool { v.len() == 0 }
struct Monster { name: &str, mut health: int } struct
Player { mut health: int }
impl Monster { fn attack(&self, player: &Player) { player.health -=
10; } } monster.attack(&player);
trait ToJSON { fn to_json(&self) -> ~str; }
impl Monster : ToJSON { fn to_json(&self) -> ~str {
fmt!(...) } } impl Player : ToJSON { fn to_json(&self) -> ~str { fmt!(...) } }
fn save<T:ToJSON>(x: &T, file: &str) { let writer = file_writer(...).get();
writer.write(x.to_json()); } save(&player, "p.json"); save(&monster, "m.json");
struct<T:Send> Chan<T> { ... } impl<T:Send> Chan<T> { fn send(&self,
x: T) { ... } }
struct ARC<T:Const Send> { ... }
let img: Image = load_image(); let handle0: ARC<Image> = ARC(move
img); for N.times { let handle = handle0.clone(); do spawn |move handle| { display_image(handle); } }
Modula-3 unsafe module Java native sun.misc.Unsafe Ocaml Obj.magic Haskell unsafePerformIO
Rust unsafe { ... }
regions, region subtyping & polymorphism, arenas traits as existentials mutability
tracking, purity, and borrow checking freezing/thawing data structures task-local storage linked failure one-shot closures macros
Good reads smallcultfollowing.com/babysteps pcwalton.github.com
Join us rust-lang.org
[email protected]
irc.mozilla.org :: #rust
Thank you.
Image credits Sean Martell http://blog.seanmartell.com Martyn http://www.flickr.com/photos/martyn/438111857/in/set-102261 Ian Kobylanski http://www.flickr.com/photos/iankobylanski/6151659680
Sudhir Naik http://www.flickr.com/photos/sudhirnaik/4890017884/ Thomas Gibbard http://www.flickr.com/photos/22305783@N06/3947478553