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

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

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