เกี่ยวกับ Rust

วีร์ สัตยมาศ

2016-03-12

For Mozilla Thailand Community Meetup

วาระ

  • Servo
  • เร็ว
  • GC และ Move semantics
  • ปลอดภัย
  • Parallel
  • เครื่องมือ

Servo

Servo เป็น Rendering Engine ตัวใหม่

Servo(2)

servo.org

Servo(3)

  • เร็ว
  • ปลอดภัย
  • Parallel

เร็ว

เทียบกับ C++

เร็ว (2)

  • rustc -O
  • cargo build --release

เร็ว (3)

ไม่ต้องใช้ Garbage Collector (GC)

ไม่ต้องใช้ GC

C ก็ไม่ต้องใช้ แต่ ...

Move semantics

  • ทุกอย่างมีเจ้าของเดียว
  • (ยกเว้นแต่จะกำหนดไว้เป็นอย่างอื่น)

let s = String::from("Firefox");

เดี๋ยวก่อน

ลอง Code ได้ที่ https://play.rust-lang.org/

Move semantics (2)

Scope และ ช่วงอายุ

	  
	    // แบบนี้ได้
	    fn main() {
               let s = String::from("Firefox");
	       println!("{}", s);
	    }
	  
	  

Move semantics (2.1)

Scope และ ช่วงอายุ

	  
	    // เจ๊ง เพราะ s หมดอายุ
	    fn main() {
	       {
                 let s = String::from("Firefox");
	       }
	       println!("{}", s);
	    }
	  
	  

Move semantics (3)

= คือโอนให้เป็นของคนอื่น

	    
	      let s = String::from("Firefox");
	      let s2 = s;
	      println!("{}", s2);
	    
	  
	    
	      let s = String::from("Firefox");
	      let s2 = s;
	      println!("{}", s);
	    
	  

Move semantics (4)

ขอยืม

	    
	      let s = String::from("Firefox");
	      let s2 = &s;
	      println!("{}", s2);
	      println!("{}", s);
	    
	  

Move semantics (5)

ขอยืม กับ โอน

	    
	      fn main() {
	        let s = String::from("Firefox");
	        {
	          let s2 = &s;
	          println!("{}", s2);
	        }
	        println!("{}", s);
	      }
	    
	  

Move semantics (6)

แต่ C++ ก็เหมือนกัน?

	    
	      std::unique_ptr p_str0(new std::string("Firefox"));
              auto p_str1 = std::move(p_str0); 
	      std::cout << *p_str1 << std::endl;
	    
	  

Runtime/Compile

ปลอดภัย

  • ไม่มี null
  • ไม่ต้อง free เอง
  • ตรวจ type ให้ตอน compile

ปลอดภัย (2)

  • ใช้ท่าคล้าย ๆ Haskell
  • บังคับ check

ปลอดภัย (3)

	    
	      fn titi(x: Option<String>>) {
                match x {
                  None => {},
		  Some(y) => {}		      
		}
              }
	    
	  

Parallel

  • เน้น immutable
  • เวลาเขียน thread compiler ช่วยดูให้ว่าอะไรแชร์ได้บ้าง

Parallel (2)

  • ทำเหมือน Go ได้
  • ใช้ mutex lock เหมือน C++ ได้
  • แต่ Rust รู้ว่าไม่ต้อง lock สิ่งที่ immutable

เครื่องมือ

  • ผมใช้ Emacs + Racer
  • แต่ลองดู Atom.io + Racer แล้วใช้ได้เหมือนกัน น่าจะชอบกัน