Download - Rust - GDG DevFest 2016 Nizhny Novgorod
#DevFest16 #GDGNN #DevFestNN16 #DevFestNN
Rust в контексте современного программирования
Никита Баксаляр — @nbaksalyarMaidSafe
Актуальность Rust
● Начало разработки в 2006 году, релиз версии 1.0 в 2015● На сегодняшний день: релизы каждые 6 недель, версия 1.13 и
широкое применение в продакшене● Скорость C++ и безопасность Go без недостатков сборки мусора
На практике: Servo● Браузерный движок нового поколения
от Mozilla● Более 500 тыс. строк кода на Rust и
более 400 участников разработки● До 4-5 раз быстрее Gecko и WebKit в
предварительных бенчмарках● Отдельные компоненты уже в Firefox,
в 2017 году — Project Quantum
Ключевые преимущества
● Бесплатные абстракции, скорость, и компиляция в машинный код
Ключевые преимущества
● Безопасность и продвинутая система типов
● Компромисс между скоростью низкоуровневых и удобством высокоуровневых языков
Небезопасные языки
● Позволяют писать некорректные и небезопасные программы(Heartbleed в OpenSSL, Shellshock в Bash)
● Используются для сложных и системных задач:поисковые движки, графические движки для игр, ядра ОС и т.д.
● Бэкенды Google, Яндекса, и других крупнейших проектов используют C++
Проблемы небезопасных языков
● Выделили память, забыли освободить:
void function() {char *string1 = malloc(5);char *string2 = malloc(10);// …free(string1);
}
Подход Rust
● Автоматическое освобождение памяти без сборки мусора● «Умные указатели»● Время жизни переменных ограничено областью видимости:
fn main() {let string = String::new();// переменная string будет освобождена
// перед выходом из функции}
Альтернативное решение: сборка мусора
● Автоматические освобождение неиспользуемой памяти
● Большинство современных языков использует GC:Google Go, Java, C#, Ruby, Python, JavaScript, Haskell, и многие другие
● Недостатки: “остановка мира” и сниженная производительность
Проблемы небезопасных языков
● Освободили память, а указатель остался:
void function(pair *p) {char *entry = malloc(5);
p->first = entry;// …free(entry);
}
Владение
fn main() {let mut str = String::from(“♥”);
function(str); …
}
Владение
fn main() {let mut str = String::from(“♥”);
function(str); str.push(‘U’); ← ошибка
}
Заимствования
fn main() {let mut str = String::from(“♥”);function(&mut str);
str.push(‘U’);}
Проблемы небезопасных языков
● Выход за границы выделенной памяти:
void function() {char *string = malloc(2);
string[0] = ‘h’; string[1] = ‘i’; string[6784745] = ‘?’;
}
«Нулевые указатели — моя главная ошибкаценой в миллиард долларов»
— Тони Хоар
Безопасные типы в Rust
enum Option<Value> {
Some(Value),None
}
let value1 = Some(123);
let value2 = None;
Альтернатива исключениям в Rust
enum Result<Value, Error> {
Ok(Value),Err(Error)
}
let success = Ok(42);
let error = Err(“Хьюстон, у нас проблема”);
Альтернатива исключениям в Rust
let result = Ok(42);
match result { Ok(value) => print!(“{}”, value), Err(error) => { … }}
ООП?
● Rust — не объектно-ориентированный язык
● Модули и структуры вместо классов и объектов
● Типажи вместо интерфейсов
Структуры
● Могут содержать данные● Могут иметь связанные методы● Инкапсуляция: контроль доступа к закрытой и открытой части структуры● Нет возможности наследования
struct User { login: String, password: String}
Типажи
● Похожи на тайпклассы в Haskell и типажи в Scala● Форма множественного наследования и полиморфизма● Методы типажей могут содержать стандартную реализацию
trait Authenticator { fn login(&self, user: &str, password: &str);
fn login_default(&self) { self.login(“Crash_Override”, “password”); }}
Типажи
● Можно добавлять методы к чужим структурам
trait Hello { fn say_hello(&self);}
Типажи
● Можно добавлять методы к чужим структурам
impl Hello for String { fn say_hello(&self) { println!(“Привет, {}!”, self); }}
Типажи
● Можно добавлять методы к чужим структурам
…"мир".to_string().say_hello();
→ "Привет, мир!"
Инструментарий Rust
● Crates.io:Более 7 000 пакетов с библиотеками.
● Cargo:Компиляция проекта;Пакетный менеджер;Встроенный фреймворк для тестирования
Поддержка интегрированных сред разработки● Дополнение кода и навигация
● Плагины для IntelliJ Idea, Eclipse и Visual Studio
● Плагин Racer для текстовых редакторов (Atom, Sublime Text, Emacs, Vim)
Интеграция с другими языками
● Python, Ruby, Node.js● Поддержка C ABI● Возможность параллелизации
Сообщество
● Русскоязычное сообщество: http://rustycrate.ruЧат в Gitter: https://gitter.im/ruRust/generalЧат в Telegram: https://telegram.me/proRustФорум: https://forum.rustycrate.ru/
● Книга “Язык программирования Rust” на русском: http://rurust.github.io/rust_book_ru/
● События: Rust Moscow Meetup,CoLaboratory: Rust в Kaspersky Lab
Процесс разработки языка
● Добавление новых возможностей языка через процесс RFC
● Стать разработчиком компилятора — легко!
● Цели на 2017:Более понятный процесс изучения для новичков;Больше инструментов разработки и лучшая поддержка IDE;Более высокая скорость компиляции.
Заключение
● Безопасность и скорость без боли
● Революция в мире браузеров за счет стабильной параллелизации вычислений
● Применение в продакшене только начинается
Спасибо за внимание!Вопросы?
Слайды будут доступны в Твиттере@nbaksalyar