An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.
-
Upload
june-quinn -
Category
Documents
-
view
229 -
download
0
Transcript of An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.
![Page 1: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/1.jpg)
An Introduction to
Rust Programming Language
Haozhong ZhangJun 1, 2015
![Page 2: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/2.jpg)
Acknowledgment
Parts of contents in the following slides may use contents from following sources.•Aaron Turon, The Rust Programming Language,
Colloquium on Computer Systems Seminar Series (EE380) , Stanford University, 2015.•Alex Crichton, Intro to the Rust programming
language, http://people.mozilla.org/~acrichton/rust-talk-2014-12-10/•The Rust Programming Language,
https://doc.rust-lang.org/stable/book/
![Page 3: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/3.jpg)
What is Rust?
From the official website (http://rust-lang.org):
“Rust is a systems programming language that runs blazingly fast, prevents nearly all segfaults, and guarantees thread safety. ”
![Page 4: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/4.jpg)
A brief historyPre-2009
Graydone Hoare
terrible memory leakages/bugs in Firefox
2009Mozilla Corp.
Experimental web browser layout engine: Servo
2013Samsung Corp. Joined
2015/05/15v1.0 Stable Released!
![Page 5: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/5.jpg)
Who are using Rust?
• rustc: Rust compiler• https://github.com/rust-lang/rust
• Cargo: Rust’s package manager• https://github.com/rust-lang/cargo
• Servo: Experimental web browser layout engine• https://github.com/servo/servo
• Piston: A user friendly game engine• https://github.com/PistonDevelopers/piston
• Iron: An extensible, concurrent web framework• https://github.com/iron/iron
•…
![Page 6: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/6.jpg)
Control & SafetyThings make Rust Rust.
![Page 7: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/7.jpg)
In the real world …
•Rust is the coating closest to the bare metal.
![Page 8: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/8.jpg)
As a programming language …
•Rust is a system programming language barely on the hardware.• No runtime requirement (eg. GC/Dynamic Type/…)•More control (over memory allocation/destruction/…)• …
fn main() { println!(“Hello, world!”);}
![Page 9: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/9.jpg)
More than that …
C/C++
more control,less safety
Haskell/Python
less control,more safety
more control,more safety
Rust
![Page 10: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/10.jpg)
What is control?typedef struct Dummy { int a; int b; } Dummy; void foo(void) { Dummy *ptr = (Dummy *) malloc(sizeof(struct Dummy)); ptr->a = 2048; free(ptr);}
ptr
.a
.b
Stack Heap
Precise memory layout
Lightweight reference
Deterministic destruction
.a = 2048
![Page 11: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/11.jpg)
Rust’s Solution: Zero-cost Abstractionstruct Dummy { a: i32, b: i32 } fn foo() { let mut res: Box<Dummy> = Box::new(Dummy { a: 0, b: 0 }); res.a = 2048;}
res
.a = 0
.b = 0
Stack Heap
.a = 2048
Variable binding
Memory allocation
Resource owned by res is freed automatically
![Page 12: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/12.jpg)
Side Slide: Type Inferencestruct Dummy { a: i32, b: i32 } fn foo() { let mut res: Box<Dummy> = Box::new(Dummy { a: 0, b: 0 }); res.a = 2048;}
![Page 13: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/13.jpg)
What is safety?typedef struct Dummy { int a; int b; } Dummy; void foo(void) { Dummy *ptr = (Dummy *) malloc(sizeof(struct Dummy)); Dummy *alias = ptr; free(ptr); int a = alias.a; free(alias);}
ptr
alias
.a
.b
Stack Heap
Dangling Pointer
Use after free
Double free
Aliasing Mutation
![Page 14: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/14.jpg)
Rust’s Solution: Ownership & Borrowing
Compiler enforces:•Every resource has a unique owner.•Others can borrow the resource from its owner.•Owner cannot free or mutate its resource while it is
borrowed.
Aliasing Mutation
No need for runtime Memory safety Data-race freedom
![Page 15: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/15.jpg)
Ownershipstruct Dummy { a: i32, b: i32 } fn foo() { let mut res = Box::new(Dummy { a: 0, b: 0 });}
res
.a = 0
.b = 0
Stack Heap
owns
res is out of scope and its resource is freed automatically
![Page 16: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/16.jpg)
Ownership: Lifetime
• Lifetime is determined and checked statically.
struct Dummy { a: i32, b: i32 } fn foo() { let mut res: Box<Dummy>; { res = Box::new(Dummy {a: 0, b: 0}); } res.a = 2048;}
Lifetime that res owns the resource.
Compiling Error: res no longer owns the resource
![Page 17: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/17.jpg)
Ownership: Unique Ownerstruct Dummy { a: i32, b: i32 } fn foo() { let mut res = Box::new(Dummy { a: 0, b: 0 }); take(res); println!(“res.a = {}”, res.a);}
fn take(arg: Box<Dummy>) {}
Ownership is moved from res to arg
arg is out of scope and the resource is freed automatically
Compiling Error!
Aliasing Mutation
![Page 18: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/18.jpg)
Immutable/Shared Borrowing (&)struct Dummy { a: i32, b: i32 } fn foo() { let mut res = Box::new(Dummy{ a: 0, b: 0 }); take(&res); res.a = 2048;}
fn take(arg: &Box<Dummy>) { arg.a = 2048;}
Resource is immutably borrowed by arg from res
Resource is still owned by res. No free here.
Resource is returned from arg to res
Aliasing Mutation
Compiling Error: Cannot mutate via an immutable reference
![Page 19: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/19.jpg)
Immutable/Shared Borrowing (&)
•Read-only sharing
struct Dummy { a: i32, b: i32 } fn foo() { let mut res = Box::new(Dummy{a: 0, b: 0}); { let alias1 = &res; let alias2 = &res; let alias3 = alias2; res.a = 2048; } res.a = 2048;}
![Page 20: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/20.jpg)
Mutable Borrowing (&mut)Aliasing Mutationstruct Dummy { a: i32, b: i32 }
fn foo() { let mut res = Box::new(Dummy{a: 0, b: 0});
take(&mut res); res.a = 4096;
let borrower = &mut res; let alias = &mut res;}
fn take(arg: &mut Box<Dummy>) { arg.a = 2048;}
Mutably borrowed by arg from res
Returned from arg to res
Multiple mutable borrowingsare disallowed
![Page 21: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/21.jpg)
Side Slide: Mutability
•Every resource in Rust is immutable by default.•mut is used to declare a resource as mutable.
struct Dummy { a: i32, b: i32 } fn foo() { let res = Box::new(Dummy{a: 0, b: 0});
res.a = 2048; let borrower = &mut res;}
Error: Resource is immutable
Error: Cannot get a mutable borrowing of an immutable resource
![Page 22: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/22.jpg)
Concurrency & Data-race Freedomstruct Dummy { a: i32, b: i32 }
fn foo() { let mut res = Box::new(Dummy {a: 0, b: 0});
std::thread::spawn(move || { let borrower = &mut res; borrower.a += 1; });
res.a += 1;}
Error: res is being mutably borrowed
res is mutably borrowed
Spawn a new thread
![Page 23: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/23.jpg)
UnsafeLife is hard.
![Page 24: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/24.jpg)
Mutably Sharing
•Mutably sharing is inevitable in the real world.•Example: mutable doubly linked list
prev
next
prev
next
prev
next
struct Node { prev: option<Box<Node>>, next: option<Box<Node>>}
![Page 25: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/25.jpg)
Rust’s Solution: Raw Pointers
•Compiler does NOT check the memory safety of most operations wrt. raw pointers.•Most operations wrt. raw pointers should be
encapsulated in a unsafe {} syntactic structure.
prev
next
prev
next
prev
next
struct Node { prev: option<Box<Node>>, next: *mut Node}
Raw pointer
![Page 26: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/26.jpg)
Rust’s Solution: Raw Pointers
let a = 3;
unsafe { let b = &a as *const u32 as *mut u32; *b = 4;}
println!(“a = {}”, a);
I know what I’m doing
Print “a = 4”
![Page 27: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/27.jpg)
Foreign Function Interface (FFI)•All foreign functions are unsafe.
extern { fn write(fd: i32, data: *const u8, len: u32) -> i32;}
fn main() { let msg = b”Hello, world!\n”; unsafe { write(1, &msg[0], msg.len()); }}
![Page 28: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/28.jpg)
Inline Assembly
#![feature(asm)]fn outl(port: u16, data: u32) { unsafe { asm!(“outl %0, %1” : : “a” (data), “d” (port) : : “volatile”); }}
![Page 29: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/29.jpg)
Other GoodiesEnums, Pattern Match, Generic, Traits, Tests, …
![Page 30: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/30.jpg)
Enums
•First-class• Instead of integers (C/C++)
•Structural• Parameters• Replacement of union in C/C++
![Page 31: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/31.jpg)
Enums
enum RetInt { Fail(u32), Succ(u32)}
fn foo_may_fail(arg: u32) -> RetInt { let fail = false; let errno: u32; let result: u32; ... if fail { RetInt::Fail(errno) } else { RetInt::Succ(result) }}
![Page 32: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/32.jpg)
Enums: No Null Pointers
enum std::option::Option<T> { None, Some(T)}
struct SLStack { top: Option<Box<Slot>>}
struct Slot { data: Box<u32>, prev: Option<Box<Slot>>}
![Page 33: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/33.jpg)
Pattern Match
let x = 5;
match x { 1 => println!(“one”), 2 => println!(“two”), 3|4 => println!(“three or four”), 5 ... 10 => println!(“five to ten”), e @ 11 ... 20 => println!(“{}”, e); _ => println!(“others”),}
Compiler enforces the matching is complete
![Page 34: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/34.jpg)
Pattern Match
let x = Dummy{ a: 2048, b: 4096 };
match x { Dummy{ a: va, b: vb } => va + vb,}
match x { Dummy{ a: va, .. } => println!(“a={}”, va),}
![Page 35: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/35.jpg)
Pattern Match
enum RetInt { Fail(u32), Succ(u32)}
fn foo_may_fail(arg: u32) -> RetInt { ...}
fn main() { match foo_may_fail(2048) { Fail(errno) => println!(“Failed w/ err={}”, errno),
Succ(result) => println!(“Result={}”, result), }}
![Page 36: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/36.jpg)
Pattern Match
enum std::option::Option<T> { None, Some(T)}
struct SLStack { top: Option<Box<Slot>>}
fn is_empty(stk: &SLStack) -> bool { match stk.top { None => true, Some(..) => false, }}
![Page 37: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/37.jpg)
Generic
struct SLStack { top: Option<Box<Slot>>}
struct Slot { data: Box<u32>, prev: Option<Box<Slot>>}
fn is_empty(stk: &SLStack) -> bool { match stk.top { None => true, Some(..) => false, }}
struct SLStack<T> { top: Option<Box<Slot<T>>>}
struct Slot<T> { data: Box<T>, prev: Option<Box<Slot<T>>>}
fn is_empty<T>(stk: &SLStack<T>) -> bool { match stk.top { None => true, Some(..) => false, }}
![Page 38: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/38.jpg)
Traits
•More generic
•Typeclass in Haskell
![Page 39: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/39.jpg)
Traitstrait Stack<T> { fn new() -> Self; fn is_empty(&self) -> bool; fn push(&mut self, data: Box<T>); fn pop(&mut self) -> Option<Box<T>>;}
impl<T> Stack<T> for SLStack<T> { fn new() -> SLStack<T> { SLStack{ top: None } }
fn is_empty(&self) -> bool { match self.top { None => true, Some(..) => false, } }}
Type implemented this trait
Object of the type implementing this trait
![Page 40: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/40.jpg)
Traits
trait Stack<T> { fn new() -> Self; fn is_empty(&self) -> bool; fn push(&mut self, data: Box<T>); fn pop(&mut self) -> Option<Box<T>>;}
fn generic_push<T, S: Stack<T>>(stk: &mut S, data: Box<T>) { stk.push(data);}
fn main() { let mut stk = SLStack::<u32>::new(); let data = Box::new(2048); generic_push(&mut stk, data);}
![Page 41: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/41.jpg)
Traits
trait Clone { fn clone(&self) -> Self;}
impl<T> Clone for SLStack<T> { ...}
fn immut_push<T, S: Stack<T>+Clone>(stk: &S, data: Box<T>) -> S { let mut dup = stk.clone(); dup.push(data); dup}
fn main() { let stk = SLStack::<u32>::new(); let data = Box::new(2048); let stk = immut_push(&stk, data);}
![Page 42: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/42.jpg)
Tests
•Rust provides a builtin test system.
![Page 43: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/43.jpg)
Tests
#[test]fn test_pop_empty_stack() { let stk = SLStack::<u32>::new(); assert!(stk.pop() == None); }
Testing annotation
$ rustc --test slstack.rs; ./slstackrunning 1 testtest test_pop_empty_stack … ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Passed
![Page 44: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/44.jpg)
Tests
#[test]fn test_pop_empty_stack() { let stk = SLStack::<u32>::new(); assert!(stk.pop() == None); }
Testing annotation
$ rustc --test slstack.rs; ./slstackrunning 1 testtest test_pop_empty_stack … FAILED
--- test_pop_empty_stack stdout --- thread ‘test_pop_empty_stack’ panicked at ‘assertion failed: stk.pop() == None’, slstack.rs: 4
failures: test_pop_empty_stack
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured
Failed
![Page 45: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/45.jpg)
Documentation Tests
/// # Examples/// ```/// let stk = SLStack::<u32>::new();/// assert!(stk.pop() == None);/// ```fn pop(&mut self) -> Option<Box<T>> { ... }
$ rustdoc --test slstack.rs; ./slstackrunning 1 testtest test_pop_empty_stack_0 … ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Passed
![Page 46: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/46.jpg)
Others
•Closures•Concurrency•Comments as documentations•Hygienic macro•Crates and modules•Cargo: Rust’s package manager•…
![Page 47: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/47.jpg)
Learning & Development Resources
![Page 48: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/48.jpg)
Official Resources
•Rust website: http://rust-lang.org/•Playground: https://play.rust-lang.org/•Guide: https://doc.rust-lang.org/stable/book/•Documents: https://doc.rust-lang.org/stable/•User forum: https://users.rust-lang.org/•Dev forum: https://internals.rust-lang.org/•Source code: https://github.com/rust-lang/rust• IRC: server: irc.mozilla.org, channel: rust•Cargo: https://crates.io/
![Page 49: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/49.jpg)
3rd Party Resources
•Rust by example: http://rustbyexample.com/•Reddit: https://reddit.com/r/rust•Stack Overflow: https://
stackoverflow.com/questions/tagged/rust
![Page 50: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/50.jpg)
Academic Research
•https://doc.rust-lang.org/stable/book/academic-research.html
![Page 51: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/51.jpg)
Projects
• rustc: Rust compiler• https://github.com/rust-lang/rust
• Cargo: Rust’s package manager• https://github.com/rust-lang/cargo
• Servo: Experimental web browser layout engine• https://github.com/servo/servo
• Piston: A user friendly game engine• https://github.com/PistonDevelopers/piston
• Iron: An extensible, concurrent web framework• https://github.com/iron/iron
•On Github• https://github.com/trending?l=rust
![Page 52: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/52.jpg)
Development Environment
•Microsoft Visual Studio• Rust plugin: https://
visualstudiogallery.msdn.microsoft.com/c6075d2f-8864-47c0-8333-92f183d3e640
• Emacs• rust-mode: https://github.com/rust-lang/rust-mode• racer: https://github.com/phildawes/racer• flycheck-rust: https://github.com/flycheck/flycheck-rust
• Vim• rust.vim: https://github.com/rust-lang/rust.vim• racer: https://github.com/rust-lang/rust.vim
![Page 53: An Introduction to Rust Programming Language Haozhong Zhang Jun 1, 2015.](https://reader033.fdocuments.net/reader033/viewer/2022051018/56649e965503460f94b9a4d0/html5/thumbnails/53.jpg)
Questions?