#DevFest16 #GDGNN #DevFestNN16 #DevFestNN
Rust в контексте современного
программирования
Никита Баксаляр — @nbaksalyar
MaidSafe
Актуальность 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

Rust - GDG DevFest 2016 Nizhny Novgorod

  • 1.
  • 2.
    Rust в контекстесовременного программирования Никита Баксаляр — @nbaksalyar MaidSafe
  • 3.
    Актуальность Rust ● Началоразработки в 2006 году, релиз версии 1.0 в 2015 ● На сегодняшний день: релизы каждые 6 недель, версия 1.13 и широкое применение в продакшене ● Скорость C++ и безопасность Go без недостатков сборки мусора
  • 4.
    На практике: Servo ●Браузерный движок нового поколения от Mozilla ● Более 500 тыс. строк кода на Rust и более 400 участников разработки ● До 4-5 раз быстрее Gecko и WebKit в предварительных бенчмарках ● Отдельные компоненты уже в Firefox, в 2017 году — Project Quantum
  • 5.
    Ключевые преимущества ● Бесплатныеабстракции, скорость, и компиляция в машинный код
  • 6.
    Ключевые преимущества ● Безопасностьи продвинутая система типов ● Компромисс между скоростью низкоуровневых и удобством высокоуровневых языков
  • 7.
    Небезопасные языки ● Позволяютписать некорректные и небезопасные программы (Heartbleed в OpenSSL, Shellshock в Bash) ● Используются для сложных и системных задач: поисковые движки, графические движки для игр, ядра ОС и т.д. ● Бэкенды Google, Яндекса, и других крупнейших проектов используют C++
  • 8.
    Проблемы небезопасных языков ●Выделили память, забыли освободить: void function() { char *string1 = malloc(5); char *string2 = malloc(10); // … free(string1); }
  • 9.
    Подход Rust ● Автоматическоеосвобождение памяти без сборки мусора ● «Умные указатели» ● Время жизни переменных ограничено областью видимости: fn main() { let string = String::new(); // переменная string будет освобождена // перед выходом из функции }
  • 10.
    Альтернативное решение: сборкамусора ● Автоматические освобождение неиспользуемой памяти ● Большинство современных языков использует GC: Google Go, Java, C#, Ruby, Python, JavaScript, Haskell, и многие другие ● Недостатки: “остановка мира” и сниженная производительность
  • 11.
    Проблемы небезопасных языков ●Освободили память, а указатель остался: void function(pair *p) { char *entry = malloc(5); p->first = entry; // … free(entry); }
  • 12.
    Владение fn main() { letmut str = String::from(“♥”); function(str); … }
  • 13.
    Владение fn main() { letmut str = String::from(“♥”); function(str); str.push(‘U’); ← ошибка }
  • 14.
    Заимствования fn main() { letmut str = String::from(“♥”); function(&mut str); str.push(‘U’); }
  • 15.
    Проблемы небезопасных языков ●Выход за границы выделенной памяти: void function() { char *string = malloc(2); string[0] = ‘h’; string[1] = ‘i’; string[6784745] = ‘?’; }
  • 16.
    «Нулевые указатели —моя главная ошибка ценой в миллиард долларов» — Тони Хоар
  • 17.
    Безопасные типы вRust enum Option<Value> { Some(Value), None } let value1 = Some(123); let value2 = None;
  • 18.
    Альтернатива исключениям вRust enum Result<Value, Error> { Ok(Value), Err(Error) } let success = Ok(42); let error = Err(“Хьюстон, у нас проблема”);
  • 19.
    Альтернатива исключениям вRust let result = Ok(42); match result { Ok(value) => print!(“{}”, value), Err(error) => { … } }
  • 20.
    ООП? ● Rust —не объектно-ориентированный язык ● Модули и структуры вместо классов и объектов ● Типажи вместо интерфейсов
  • 21.
    Структуры ● Могут содержатьданные ● Могут иметь связанные методы ● Инкапсуляция: контроль доступа к закрытой и открытой части структуры ● Нет возможности наследования struct User { login: String, password: String }
  • 22.
    Типажи ● Похожи натайпклассы в Haskell и типажи в Scala ● Форма множественного наследования и полиморфизма ● Методы типажей могут содержать стандартную реализацию trait Authenticator { fn login(&self, user: &str, password: &str); fn login_default(&self) { self.login(“Crash_Override”, “password”); } }
  • 23.
    Типажи ● Можно добавлятьметоды к чужим структурам trait Hello { fn say_hello(&self); }
  • 24.
    Типажи ● Можно добавлятьметоды к чужим структурам impl Hello for String { fn say_hello(&self) { println!(“Привет, {}!”, self); } }
  • 25.
    Типажи ● Можно добавлятьметоды к чужим структурам … "мир".to_string().say_hello(); → "Привет, мир!"
  • 26.
    Инструментарий Rust ● Crates.io: Более7 000 пакетов с библиотеками. ● Cargo: Компиляция проекта; Пакетный менеджер; Встроенный фреймворк для тестирования
  • 27.
    Поддержка интегрированных сред разработки ● Дополнениекода и навигация ● Плагины для IntelliJ Idea, Eclipse и Visual Studio ● Плагин Racer для текстовых редакторов (Atom, Sublime Text, Emacs, Vim)
  • 28.
    Интеграция с другимиязыками ● Python, Ruby, Node.js ● Поддержка C ABI ● Возможность параллелизации
  • 29.
    Сообщество ● Русскоязычное сообщество: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
  • 30.
    Процесс разработки языка ●Добавление новых возможностей языка через процесс RFC ● Стать разработчиком компилятора — легко! ● Цели на 2017: Более понятный процесс изучения для новичков; Больше инструментов разработки и лучшая поддержка IDE; Более высокая скорость компиляции.
  • 31.
    Заключение ● Безопасность искорость без боли ● Революция в мире браузеров за счет стабильной параллелизации вычислений ● Применение в продакшене только начинается
  • 32.
    Спасибо за внимание! Вопросы? Слайдыбудут доступны в Твиттере @nbaksalyar