История 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.