rust: история языка и контекст применения
TRANSCRIPT
История Rust
● Появился в 2006 году.● Множество проб и ошибок в дизайне по ходу
разработки: акторы и сборка мусора.● Эпоха стабильности: релиз 1.0 в 2015.
Servo
● Проект Servo: браузерный движок нового поколения, разрабатывается компаниями Mozilla и Samsung как замена для Gecko в Firefox.
● Более ~500 тыс. строккода и 400 контри-бьюторов.
● До 4 раз быстрееGecko в предвари-тельных бенчмарках.
Почему Rust?
● OCaml с C-подобным синтаксисом.● Компиляция в машинный код.● Безопасность.● Скорость.
Проблемы небезопасных языков
● Ручная работа с памятью:● Утечки.● Висячие указатели.● Переполнения буфера.
Подход Rust: владение
● Одна переменная — одно значение.
let a = "hello";
Передача владения
● Значения переменных можно перемещать:let variable = <значение>;let new_owner = variable;new_owner.method();// Далее мы не можем обращаться к variable,// поскольку владение передано new_owner.
Заимствования
● Временная передача владения:let variable = SomeStructure {};let borrow = &variable;print!(borrow.calculate());
● Количество заимствований не ограничено, пока мы не изменяем данные.
Изменяемые заимствования
● Главное правило: изменять данные можно только в одном месте.
● Временная передача владения с возможностью изменения:let mut variable = <значение>;{ let mut borrow = &mut variable; borrow.change(); // Здесь мы не имеем доступа к переменной variable.}// Владение вернулось к variable:variable.change();
Изменяемые заимствования
● Полная запись:let mut variable = <значение>;{ // Перемещаем владение из variable в borrow: let mut borrow = variable; ... // Возвращаем владение variable: variable = borrow;}
Почему это важно
● Избавляет от утечек памяти.● Исключает висячие указатели.● Упрощает параллелизацию кода.
Строгая типизация
● Подсчет и проверка ссылок происходят на этапе компиляции.
● Статический анализатор кода, встроенныйв компилятор.
● Вывод типов по алгоритму Хиндли-Милнера:
let a = 12; // не указываем типlet b = "hello";
ООП?
● Вместо классов — структуры.● Вместо наследования — делегирование.● Вместо интерфейсов — типажи.
Структуры
struct DataGroup {
a: u8,
b: u8
}
● Почти что классы (но без наследования).● Инкапсуляция данных.● Открытые и закрытые методы.
Типажи
trait Queryable {
fn query(&self) -> String;
}
● Обеспечивают полиморфизм.● Форма множественного наследования — методы
типажей могут содержать стандартную реализацию.
● Также известны как тайпклассы в Хаскелле.
Оператор match
● Больше, чем switch/case.● Сопоставление с образцом (pattern
matching):match (var) { 1...5 => ..., // От 1 до 5 8 | 10 => ..., // 8 или 10 _ => ..., // Любые другие паттерны}
Про скорость
● Задачи, зависящие от процессора (CPU-bound) и от ввода-вывода (I/O-bound).
● Динамическая типизация и виртуальные машины без JIT-компиляции снижают производительность.
● Высокая скорость — одна из целей разработки Rust'а.
● Абстракции не требуют больше памяти или процессорного времени.
Зачем все это нужно
● Модули для других языков с ускорением медленных участков кода.
● Проект Neon: расширения для Node.js.● Замена для C и C++.
Спасибо за внимание!Вопросы?
Ссылка на слайды будет втвиттере @nbaksalyar.
Ресурсы:
http://rustycrate.ru — русскоязычное сообществоразработчиков на Rust. Форум, чат в Gitter, статьи и
переводы.
https://www.rust-lang.org — официальный сайт.
http://servo.org — браузерный движок Servo.