objective-c scala clojure Tiene gestor de paquetes / dependencias integrado Me garantiza que no voy a meter la pata con la gestión de memoria Es un lenguaje moderno: tiene closures, destructuring, caracteristicas funcionales,... c# c java ruby python rust c++ go swift groovy objective-c scala clojure
proyecto personal • Patrocinado por Mozilla en 2009 y con compilador hecho en rust en 2011 • 1.0 fue lanzado en 15 de mayo de 2015 • Lenguaje elegido para crear Servo, el futuro layout engine de Firefox. • Usa LLVM • Version estable actual (nov 2015): 1.4
nivel ◦ portable ◦ sin garbage collector • enfocado en tres metas: ◦ velocidad ◦ seguridad ◦ concurrencia • poder ser embebido en otros lenguajes • sistema de tipos basado en traits • gestor de dependencias
let v2 = v; println!("v2[0] is: {}", v2[0]); // OK println!("v[0] is: {}", v[0]); // Error! • v esta allocado en stack, pero su contenido en heap • Vec<> no implementa el trait Copy • v2 = v crea una copia del puntero
pueden tener N referencias a una variable • Se puede tener solo una referencia mutable let mut a = vec![1,2]; let b = &a; let mut c = &mut a; // Error println!(“{:?}”, a);
se referencia siempre tiene que ser mayor que la de la variable que referencia let x : &u32; { let y = 10; x = &y; } // Error, y sale fuera del scope aqui
1..101 { match i { n if n % 15 == 0 => print!("fizzbuzz "), n if n % 3 == 0 => print!("fizz "), n if n % 5 == 0 => print!("buzz "), n => print!("{} ", n) } } }
= |i| i + value; println!("{}", add_value(30)); value = 10; // ERROR!, value ya ha sido borrowed println!("{}", add_value(30)); let mut greeting = vec![1,2,3]; { let mut a = |i| greeting.push(i); a(4) } println!("{:?}", greeting); // All right!
Rust, toda variable debe tener un valor if a.is_some() { println!("Has some"); } let mut range = 1..10; while let Some(index) = range.next() { println!("{}", index); } if let Some(b) = a { println!("{}", b); } else { println!("None!"); } let a : Option<u32> = Some(5);
std::sync [ Arc, Barrier, RwLock, Once, Mutex, CondVar, ...] • Canales de comunicación entre hilos let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel(); for id in 0..5 { let thread_tx = tx.clone(); thread::spawn(move || { thread_tx.send(id).unwrap(); }); } for _ in 0..5 { println!(rx.recv())); }
nivel de C++) • Lenguaje destinado a creación de software de alto rendimiento, sistemas operativos, game engines, web rendering engines (servo?) • Si no nos metemos con “unsafe” gran seguridad de que no la vamos a liar con uso incorrecto de la memoria. • Al ser posible ser llamado y llamar a módulos desarrollados en C/C++, es posible afrontar desarrollos reemplazando partes de nuestro sistema • Le falta una libreria de I/O asíncrono. gran debate en la comunidad
Ser un frontend de LLVM le abre muchas puertas. • Funciona en Android / iOS • Poco a poco se ha ido estabilizando • C++ es su gran alternativa, aunque carece de cosas como la seguridad en la gestión de la memoria y aspectos “avanzados” del lenguaje (aunque se han ido incluyendo en C++11, C++14, C++17) • Swift??. Aun esta encerrado en Apple, pero si lo hacen opensource multiplataforma y su sdk también, puede ser otro gran competidor.