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
630
Closing iterators
dherman
0
730
A better future for comprehensions
dherman
0
1.9k
Evolution is Awesome
dherman
0
510
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.2k
Rust: low-level programming without the segfaults
dherman
13
8.9k
Featured
See All Featured
RailsConf 2023
tenderlove
29
940
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Being A Developer After 40
akosma
87
590k
Gamification - CAS2011
davidbonilla
80
5.1k
Bash Introduction
62gerente
608
210k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Building an army of robots
kneath
302
44k
The Cost Of JavaScript in 2023
addyosmani
45
7k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
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