Rust: история языка и контекст применения

nbaksalyar 630 views 18 slides Feb 15, 2016
Slide 1
Slide 1 of 18
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18

About This Presentation

Слайды с баркемпа на #UlCamp Winter 2016


Slide Content

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