Владимир Матвеев: "Rust: абстракции и безопасность, совершенно бесплатно" (Обзор языка Rust: для чего он предназначен, его ключевые особенности, инфраструктура)
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
Алексей Куканов, Intel.
Последняя версия стандарта С++ добавляет в язык и библиотеку поддержки средства для использования потоков исполнения (threads) и синхронизации между ними. Однако это лишь необходимая низкоуровневая база для внедрения параллелизма. Эффективная разработка параллельных программ требует высокоуровневого API, реализующего типичные шаблоны использования параллелизма в виде, пригодном для применения в широком спектре алгоритмов и приложений. В докладе речь пойдёт о наиболее часто встречающихся параллельных шаблонах, реализованных в программных моделях Intel® Threading Building Blocks и Intel® Cilk Plus, и о примерах их использования.
Название для привлечение внимания. На самом деле, презентация о том, что а) писать парсеры это просто, б) писать всякие вычислялки это просто, в) делается это вот так, г) бояться этого не нужно, а нужно делать.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
Алексей Куканов, Intel.
Последняя версия стандарта С++ добавляет в язык и библиотеку поддержки средства для использования потоков исполнения (threads) и синхронизации между ними. Однако это лишь необходимая низкоуровневая база для внедрения параллелизма. Эффективная разработка параллельных программ требует высокоуровневого API, реализующего типичные шаблоны использования параллелизма в виде, пригодном для применения в широком спектре алгоритмов и приложений. В докладе речь пойдёт о наиболее часто встречающихся параллельных шаблонах, реализованных в программных моделях Intel® Threading Building Blocks и Intel® Cilk Plus, и о примерах их использования.
Название для привлечение внимания. На самом деле, презентация о том, что а) писать парсеры это просто, б) писать всякие вычислялки это просто, в) делается это вот так, г) бояться этого не нужно, а нужно делать.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Надеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
http://bit.ly/2mainstream
Никита Прокопов из AboutEcho.com рассказывает о Clojure, 6 марта 2013
Эта лекция — часть курса «Немейнстримовые технологии разработки», читаемого в Новосибирском Государственном Университете
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
В этом докладе Дмитрий кратко рассказывает о таком звере, как LLVM, о котором много кто слышал, но немногие щупали.
Что такое компилятор на самом деле? Как происходит компиляция программы, как работают оптимизации и, наконец, откуда берется неопределенное поведение в детерменированных программах на C++?
Догнать и перегнать boost::lexical_castRoman Orlov
Разбор нестандартной реализации преобразования целого числа в строку без использования циклов и рекурсивных вызовов времени исполнения - только рекурсия на этапе компиляции
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019corehard_by
Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Когда мы работаем с БД, мы зачастую получаем сырые буферы, в то время как хочется получать данные в виде структур, классов и контейнеров C++. Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Описанный в докладе подход можно адаптировать практически к любому протоколу уровня приложений.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
В докладе будут затронуты принципиальные вопросы — зачем нам программировать на шаблонах, как мы это делаем в C++11/14 и как будем это делать в C++17. Проведем параллель с функциональными языками (привет Haskell!). На примере реального кода разберем fold-expressions и увидим, чем опасен constexpr-if. А также взглянем на метапрограммирование в стиле C++11/14 и C++17 глазами компилятора.
В докладе раскрыты слабые места Python, проблемы с GC, функциональным стилем, реализацией стандартных структур данных и интерпретатора CPython.
Автор: Кирилл Лашкевич
Надеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
http://bit.ly/2mainstream
Никита Прокопов из AboutEcho.com рассказывает о Clojure, 6 марта 2013
Эта лекция — часть курса «Немейнстримовые технологии разработки», читаемого в Новосибирском Государственном Университете
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
В этом докладе Дмитрий кратко рассказывает о таком звере, как LLVM, о котором много кто слышал, но немногие щупали.
Что такое компилятор на самом деле? Как происходит компиляция программы, как работают оптимизации и, наконец, откуда берется неопределенное поведение в детерменированных программах на C++?
Догнать и перегнать boost::lexical_castRoman Orlov
Разбор нестандартной реализации преобразования целого числа в строку без использования циклов и рекурсивных вызовов времени исполнения - только рекурсия на этапе компиляции
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019corehard_by
Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Когда мы работаем с БД, мы зачастую получаем сырые буферы, в то время как хочется получать данные в виде структур, классов и контейнеров C++. Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Описанный в докладе подход можно адаптировать практически к любому протоколу уровня приложений.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
В докладе будут затронуты принципиальные вопросы — зачем нам программировать на шаблонах, как мы это делаем в C++11/14 и как будем это делать в C++17. Проведем параллель с функциональными языками (привет Haskell!). На примере реального кода разберем fold-expressions и увидим, чем опасен constexpr-if. А также взглянем на метапрограммирование в стиле C++11/14 и C++17 глазами компилятора.
В докладе раскрыты слабые места Python, проблемы с GC, функциональным стилем, реализацией стандартных структур данных и интерпретатора CPython.
Автор: Кирилл Лашкевич
EXPOLINE was founded in 1990. during almost twenty years of our active life in advertising business we gained a lot of experience and invaluable knowledge from many fields involving advertising medium production. Many of our business partners take into consideration our suggestions and use our help while building a marketing plan. We always try to find the right balance between the cost and our product prices. Our aim is to support the process of brand image development and create tools of sales support. Our customers’ satisfaction and their rewarding economic results are equally a measure of success. We manage to achieve success and the steady increase of the number of our clients, where some of them stay with us for many years, is the fact to prove it. EXPOLINE product may be also seen abroad. For several years we have been sending our products – flags, banners, stickers, illuminating advertising to demanding markets of western Europe and to Ukraine, Slovakia, Hungary, Slovenia, Czech Republic, Romania and even to United Arab Emirates and Republic of South Africa.
Николай Красноярский: "Секретный доклад" (Немного о безопасности и анонимности в сети Интернет. Epic fails последнего времени. Что не так с security. Что не так с нами. Upgrade your mind)
The 1099-MISC is used to report those payments that have been made towards jobs or to workers or independent contractors for the jobs undertaken by them.
Come cambia il mondo del lavoro a causa della Tecnologia? Quali sono i fattori chiave di questa trasformazione? In che modo l'Innovazione gioca un ruolo importante nel successo di un'impresa? Cosa fare davanti alla preoccupante ascesa delle macchine?
Grazie a queste slide che forniranno da supporto, proveremo a riflettere sul modo in cui lavoro è cambiato e sta cambiando con l'avvento della tecnologia e dell'innovazione. Proveremo a riflettere su quelle skills che oggi rappresentano delle capacità richiestissime dal mercato. Concluderemo presentando i concetti di "creatività" e "capitale umano", quest'ultimo da sempre caro alla prof.ssa Montalcini.
The gift guide for all your girlfriendsPinky To Posh
She’s the friend that will always look on the bright side of things. That drunk text you made, the major work slip-up… no big deal. She will always lift you up whenever you’re feeling down and insecure. She a good girl but deserves not just a good, but a great gift.
She’s the friend that can tell when you’re not being yourself. She’s older, wiser, and always knows the right thing to do…whether you like hearing it or not. She deserves something sophisticated with a little sparkle.
She’s the instafamous friend who has close to 10k followers but knows none of them are true friends and she’s always been your #1 fan. She’s supported your dreams no matter how big they are. You guys communicate through emojis and somehow it all makes sense. She needs something she’s really gonna “like”.
She edgy, a trendsetter, a badass bitch. She is the friend that helps you let your hair down and just have fun. She inspires you to be yourself and not care what others think. She’s getting a thoughtful trendy present this year!
ЛЕКЦИЯ 5. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Нас окружает мир сетей, мобильных устройств, сайтов, облаков. Чтобы работать с этим миром, придумано невероятное количество технологий и языков программирования. Есть ли среди них место для языков Си/Си++? Стоит ли тратить время на их изучение, стоит ли использовать их в своих проектах? Не пора ли этим языкам на пенсию? Эти темы в своем докладе обсудит Андрей Карпов, активно участвующий в жизни сообщества Си++-программистов. Забегая вперед можно утверждать - языки Си/Си++ живее всех живых. Андрей расскажет о развитии языка и новых возможностях, появившихся в Си++11. Многие возможности существенно облегчают работу программиста и сокращают объем кода.
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Java 8, самой заметной фичей которой стало появление лямбд, вышла два года назад, а в этом году мы даже начали её использовать в продакшен коде Идеи. Такое заметное нововведение в языке вызывает множество вопросов. Какие возможности перед нами открываются и какие проблемы при неаккуратном использовании лямбд могут возникнуть, как лямбды устроены внутри, во что они компилируются и как исполняются — вот темы, которые мы обсудим на докладе.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Надежный обмен данными в гетерогенной среде, между разными платформами и технологиями является одним из ключевых моментов разработки сложных систем. Во время обмена данные преобразуются в некоторый промежуточный формат совместимый между платформами. Преобразование в подобный формат и из него — крайне рутинная и подверженная ошибкам работа.
Метаописание данных неким декларативным языком с последующей автогенерацией типизированных структур облегчает жизнь разработчику. Снимает с него необходимость задумываться о промежуточном формате, о правильном порядке полей, а типизированность гарантирует выявление ошибок еще на этапе компиляции кода.
В докладе будет рассмотрено несколько подобных решений, их плюсы и минусы. Также будет рассмотрен с практической стороны наш собственный формат метаданных, используемый нами на протяжении более 5 лет.
Целевая аудитория:
Ограничений нет, но в большей степени разработчики, имеющие уже определенный опыт разработки разнородных систем или приступающие к подобной задаче.
31 мая – 1 июня в Киеве состоялась конференция HOTCODE 2013.
Сергей Тепляков, эксперт Luxoft Training по .Net, С++ и архитектуре приложений, выступил с докладом «C# Deep Dive».
Тезисы доклада:
«Когда-то в далеком 2002-м году язык C# был прост, как 2 копейки. Но у любого «живого» языка есть одна особенность, приятная и неприятная одновременно — в язык начинают добавляться новые возможности, чтобы наши с вами типовые задачи решались проще и эффективнее. Но с каждой новой возможностью появляются и свои тонкости, незнание которых может лишить столь нужных в нашей жизни конечностей, причем иногда самым изощренным образом. А поскольку язык C# развивается очень динамично, то за время жизни на его просторах появилось много маленьких грабелек, которые мы с вами и научимся обходить ;)».
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Saratov open it teach talk.
Дамир Яраев:
Введение в Apache Cassandra (В ходе презентации Дамир расскажет, когда и почему стоит переходить с проверенных временем реляционных баз данных на ставшие модными в последнее время решения на базе NoSQL. В качестве примера рассмотрит колоночную NoSQL базу данных Apache Cassandra)
It consists of 3 major parts:
1) Cassandra architecture / how reads and writes work - It is almost in alignment with official C* book by DataStax (pictures are from there) - It can be useful for those who either never used Cassandra or has some questions. During my presentation on-site I found that it makes sense to listen to this even for those who already read it sometime ago
2) Data Modeling on CQL3 - it can be helpful for those who never used Cassandra to learn CQL3 a little - as well as for those who worked with pre-CQL3 approach to understand what happens under the sweet CQL3 structures
3) Remaining things like DataStax Java Driver, C* known bugs
Concurrency — на самом деле важно, заняты ли параллельные треды совместной работой.
Все знают, что разделяемое состояние — плохая идея. Альтернатива — передача immutable-сообщений для обмена данными.
Эксепшены в многопоточной программе — головная боль. Альтернатива — supervision hierarchies.
Переход от одной машины к кластеру.
Точки расширения: mailboxes, dispatchers.
Дополнительные возможности: транзакционная память.
Fuel's current use cases, architecture and next stepsOpen-IT
Fuel is open source initiative which provides great automation and flexibility for:
* CentOS and Ubuntu provisioning on bare metal servers
* Disk partitioning, including software RAIDs. Support of hardware RAIDs is in the roadmap
* Complex network configurations, including VLANs, GRE and bonding
* Network verification (VLANs, DHCP) before deployment
* Automated deployment of OpenStack components and Ceph
* Health Check - a set of short-running tests to ensure functionality of deployed environment
Vagrant - поднимаем проект на рабочей машине
Vagrant может быть еще проще (Vagrant plugins)
Как Ansible упрощает разворачивание проекта в Vagrant
А вы пробовали Docker?
Rust: абстракции и безопасность, совершенно бесплатно
1. Rust: абстракции и безопасность,
совершенно бесплатно
Владимир Матвеев
vmatveev@qubell.com
1 / 70
2. Место
Близко к железу, но большой простор для ошибок:
С
С++
Высокоуровневые, безопасные, но дают меньше контроля:
Java
Haskell
Python
Ruby
JS
Go
...
2 / 70
3. Классы ошибок
В C++:
Висящие указатели
Доступ за границами массивов
Утечки памяти
Переполнение буфера
Use-after-free
Гонки данных
Iterator invalidation
В Java:
NullPointerException
ConcurrentModificationException
Утечки памяти (!)
3 / 70
4. Выводы
Просто «Best practices» недостаточно
Безопасность с помощью идиом/гайдов не обеспечить
Компилятор должен сам отклонять небезопасные
программы
4 / 70
5. Решение
Rust обеспечивает безопасность работы с памятью с
помощью мощного статического анализа
Нет явного управления памятью, компилятор отслеживает
аллокации и деаллокации
Если программа компилируется, то она работает с
памятью безопасно
Zero-cost abstractions, как в С++
Вывод типов сильно помогает как при написании, так и
при чтении
5 / 70
6. История
Появился как личный проект
С 2009 спонсируется Mozilla Research
Первый анонс в 2010 году
В 2011 компилирует себя
В 2012 выходит версия 0.1
...
6 / 70
7. Будущее
Начало 2015 - релиз первой стабильной версии
Стабилизация языка и API
Центральный репозиторий пакетов
Множество отложенных фич
Типы высшего порядка
Ещё более продвинутые макросы
Вычисления при компиляции
...
7 / 70
8. Rust
компилируемый (LLVM)
быстрый
безопасный
со статической типизацией
с выводом типов
с бесплатными абстракциями
с функциональными элементами
минимальный рантайм (либо его отсутствие)
...
8 / 70
9. Кроссплатформенность
LLVM => множество платформ
Официально поддерживаются:
Linux
Mac OS X
Win32/Win64
Также работает под Android и iOS
9 / 70
12. Срезы
let array: [u8, ..16] = [0, ..16];
let slice: &[u8] = &array;
println!("{}", slice.len()); // 16
Строковые срезы (и вообще строки) всегда в UTF-8:
let s: &str = "abcde";
let str_buf: String = s.into_string();
12 / 70
17. С-подобный синтаксис
fn main() {
for i in range(0, 10) {
println!("Hello world!");
}
}
Всё — выражения
let m = if x % 2 == 0 { "even" } else { "odd" };
Вывод типов
fn take_int(x: int) { ... }
let x = 10;
take_int(x); // x is inferred as int
17 / 70
18. Циклы
let (mut x, mut y) = (random_int(), random_int());
loop {
x += 3;
if x < y { continue; }
y -= 3;
if x > y { break; }
}
let mut n = 0;
while n < 100 {
n += 1;
if n % 5 == 2 { n += 13; }
}
18 / 70
19. Сопоставление с образцом
switch как в C:
let x: uint = 10;
let name = match x {
1 => "one",
2 => "two",
_ => "many"
};
Деструктуризация как в Haskell:
let mut f = File::open("/tmp/input");
match f.read_to_end() {
Ok(content) => println!("{} bytes", content.len()),
Err(e) => println!("Error: {}", e)
}
19 / 70
20. Сопоставление с образцом
Для срезов:
let x = [1, 2, 3, 4];
match x.as_slice() {
[1, x, ..rest] => {
println!("2nd: {}, all others: {}", x, rest);
}
_ => println!("Something else")
}
При объявлении переменных и параметров:
fn sum_tuple((x, y): (int, int)) -> int {
x + y
}
20 / 70
21. Сопоставление с образцом
if let, while let из Swift:
if let Some(r) = from_str::<int>("12345") {
println!("String "12345" is {}", r);
}
while let Ok(token) = next_token() {
println!("Next token: {}", token);
}
21 / 70
22. Функции
fn multiply(left: uint, right: uint) -> uint {
left + right
}
#[no_mangle]
pub extern fn visible_from_c(arg: u32) -> u32 {
arg + arg
}
22 / 70
29. Трейты
Ср. с классами типов в Haskell:
class Display a where
display :: a -> String
class Add a rhs result where
add :: a -> rhs -> result
А также реализации для произвольных типов, множественная
диспетчеризация, ассоциированные типы, etc.
29 / 70
30. Trait objects
fn print_slice<T: Show>(items: &[T]) {
for item in items.iter() {
println!("{} ", item);
}
}
print_slice(&[1i, 2i, 3i]); // ok
print_slice(&["a", "b"]); // ok
print_slice(&[1i, 2i, "a"]); // compilation error :(
30 / 70
31. Trait objects
Трейты как интерфейсы:
fn print_slice(items: &[&Show]) {
for item in items.iter() {
println!("{}", item);
}
}
print_slice(&[&1i, &2i, &3i]); // ok
print_slice(&[&"a", &"b"]); // ok
print_slice(&[&1i, &2i, &"a"]); // ok!
31 / 70
32. Трейты
Zero-cost on-demand abstraction:
Ограничения на дженерики — статический полиморфизм,
мономорфизация, инлайнинг
Trait objects — динамический полиморфизм, виртуальные
таблицы, позднее связывание
Cost is explicit — сразу видно, где именно появляется
оверхед
32 / 70
34. Ownership and borrowing
Владение и заимствование — ключевые концепции Rust
С помощью статических проверок на их основе компилятор
способен предотвратить огромное число ошибок управления
ресурсами: use-after-free, double-free, iterator invalidation, data
races
Владение данными основывается на теории линейных типов
(linear types). Авторы Rust вдохновлялись языками Clean и
Cyclone; см. также unique_ptr в C++
34 / 70
35. Ownership
{
int *x = malloc(sizeof(int));
// do stuff
*x = 5;
free(x);
}
35 / 70
36. Ownership
{
int *x = malloc(sizeof(int));
// do stuff
*x = 5;
free(x);
}
{
let x = box 5;
}
36 / 70
37. Ownership
fn add_one(mut num: Box<int>) {
*num += 1;
}
let x = box 5i;
add_one(x);
println!("{}", x); // ! error: use of moved value: x
Move-семантика в действии!
37 / 70
38. Ownership
fn add_one(mut num: Box<int>) -> Box<int> {
*num += 1;
num
}
let x = box 5i;
let y = add_one(x);
println!("{}", y); // 6
38 / 70
39. Copy
Некоторые типы реализуют трейт Copy; они автоматически
копируются вместо перемещения:
let x: int = 10;
let y = x;
println!("{}", x);
39 / 70
40. RAII
Владение данными + move semantics + деструкторы =
безопасный RAII
{
let mut f = File::open(&Path::new("/some/path")).unwrap();
// work with file ...
} // f's destructor is called here
// (unless it is moved somewhere else)
Но move semantics подразумевает передачу права владения,
что возможно далеко не всегда:
let mut f = File::open(&Path::new("/some/path")).unwrap();
let buf = [0u8, ..128];
f.read(buf).unwrap();
println!("{}", buf); // ! use of moved value: buf
40 / 70
41. Borrowing
Владелец данных может предоставить к ним доступ с
помощью ссылок:
fn with_one(num: &int) -> int {
*num + 1
}
let x = box 5i;
println!("{}", with_one(&*x)); // 6
41 / 70
42. Borrowing
&T — разделяемые/иммутабельные (shared/immutable)
&mut T — неразделяемые/мутабельные (exclusive/mutable)
let x = 10i;
let p1 = &x;
let p2 = &x; // ok
let mut x = 10i;
let p1 = &mut x;
let p2 = &x; // ! cannot borrow x as immutable because
// ! it is also borrowed as mutable
let mut x = 10i;
let p1 = &mut x;
let p2 = &mut x; // ! cannot borrow x as mutable
// ! more than once at a time
42 / 70
43. Borrowing and mutability
«Эксклюзивность» мутабельных ссылок исключает очень
большой класс ошибок вида use-after-free (и не только):
let mut v: Vec<int> = vec![1, 2];
let e = &v[0];
v.push(3); // reallocates the vector, moving its contents
// ! cannot borrow v as mutable because
// ! it is also borrowed as immutable
let mut num = box 5i;
let e = &*num;
num = box 6i; // ! cannot assign to num because it is borrowed
let mut v = vec![1i, 2, 3];
for &e in v.iter() {
println!("{}", e);
if e == 2 { v.push(-42); } // ! cannot borrow v as mutable
}
43 / 70
44. Borrowing and mutability
Отсутствие неожиданностей:
fn do_stuff(data: &mut BigData, should_process: || -> bool) {
assert!(data.is_safe());
if should_process() {
unsafely_handle_data(data);
}
}
44 / 70
45. Borrowing and mutability
Наличие двух мутабельных ссылок позволяет реализовать
transmute() (aka reinterpret_cast) в безопасном коде:
fn my_transmute<T: Clone, U>(value: T, other: U) -> U {
let mut x = Left(other);
let y = match x {
Left(ref mut y) => y,
Right(_) => panic!()
};
x = Right(value);
y.clone()
}
45 / 70
46. Lifetimes
«Наивное» заимствование может вызвать проблемы:
1. создаётся ресурс X;
2. на ресурс X берётся ссылка a;
3. ресурс X уничтожается;
4. к [уничтоженному] ресурсу X осуществляется доступ через
ссылку a.
Use after free, доступ к закрытому файлу, etc.
Решение — статически обеспечить невозможность 4 перед 3.
46 / 70
47. Lifetimes
С каждой ссылкой ассоциирован параметр — время жизни
того объекта, на который она указывает. Компилятор
статически проверяет, что каждая ссылка всегда «живёт»
меньше, чем исходный объект:
fn make_ref<'a>() -> &'a int {
let x = 10i;
&x // ! x does not live long enough
}
fn first_and_last<'a>(slice: &'a [T]) -> (&'a T, &'a T) {
(&slice[0], &slice[slice.len()-1])
}
fn first_and_last(slice: &[T]) -> (&T, &T) { // identical
(&slice[0], &slice[slice.len()-1])
}
47 / 70
48. Lifetimes
Lifetime-параметры можно ассоциировать с областями
видимости:
let x;
{
let n = 5i;
x = &n; // ! n does not live long enough
}
println!("{}", *x);
48 / 70
50. Lifetimes
Специальный идентификатор 'static обозначает время жизни
всей программы:
static ANSWER: int = 42;
fn print_static_int_only(r: &'static int) { // '
println!("{}", *r);
}
fn main() {
print_static_int_only(&ANSWER); // ok
let r = 21;
print_static_int_only(&r); // ! r does not live long enough
}
const MESSAGE: &'static str = "Hello world!";
50 / 70
51. Shared ownership
В рамках одного потока — подсчёт ссылок:
use std::rc::Rc;
{
let r = Rc::new(vec![1, 2, 3]);
let r2 = r.clone();
println!("{}", *r);
println!("{}", *r2);
} // both references go out of scope, Vec is destroyed
51 / 70
53. Потоки
Создаются функцией spawn():
spawn(move || { // unboxed closure
println!("Hello from other thread!");
});
Потоки — это потоки ОС.
Система типов гарантирует, что замыкание не захватит
«опасные» переменные.
53 / 70
54. Каналы
Общение между потоками происходит через каналы:
let (tx, rx) = channel();
spawn(move || {
tx.send(4u + 6);
tx.send(5u + 7);
});
println!("{}, {}", rx.recv(), rx.recv());
54 / 70
55. Shared state
Данные «без ссылок внутри» разделяемые с помощью Arc:
use std::sync::Arc;
let data = Arc::new(vec![1u, 2, 3]);
let for_thread = data.clone();
spawn(move || {
println!("From spawned thread: {}", *for_thread);
});
println!("From main thread: {}", *data);
55 / 70
56. Mutable shared state
За счёт системы типов использование синхронизации
обязательно. Таким образом, исключаются гонки данных
(data races):
use std::sync::{Arc, Mutex};
let data = Arc::new(Mutex::new(vec![1u, 2, 3]));
let for_thread = data.clone();
spawn(move || {
let mut guard = for_thread.lock();
guard.push(4);
println!("{}", *guard);
});
let mut guard = data.lock();
guard.push(5);
println!("{}", *guard);
56 / 70
63. Единица компиляции — crate
pub mod a {
mod b {
// ...
}
pub mod c {
// ...
}
}
mod d {
// ...
}
На выходе — готовый бинарник (библиотека или executable)
63 / 70
64. Менеджер сборки — Cargo
разработан Yehuda Katz — автором Bundler
сборка и управление проектом:
отслеживание зависимостей
компиляция зависимостей, как на Rust, так и на C
компиляция проекта
запуск тестов, модульных и интеграционных
генерация пакетов и их деплой в репозиторий
reproducible builds
64 / 70
65. crates.io — центральный репозиторий
Открылся совсем недавно
Предназначен, в основном, для стабильных релизов
400 пакетов спустя полторы недели
Ядро будущей экосистемы
65 / 70
67. Servo — https://github.com/servo/
исследовательский браузерный движок
активно развивается, уже проходит какие-то тесты
~100000 строк
rustc — https://github.com/rust-lang/rust
сам компилятор Rust
самый старый крупный проект
~400000 строк
Cargo — https://github.com/rust-lang/cargo
менеджер сборки
один из наиболее новых проектов, idiomatic style
~30000 строк
67 / 70
68. Piston — https://github.com/PistonDevelopers
коллекция проектов, связанных с разработкой игр
байндинги к OpenGL и другим графическим (и не
только) библиотекам
игровой движок
GUI-библиотека
Zinc — https://zinc.rs
ARM-стек
эффективный и безопасный фреймворк для RTOS-
систем
~17000 строк
Iron — https://ironframework.org/
наиболее популярный веб-фреймворк (есть и другие!)
middleware-based
вместе с HTTP-библиотекой Hyper ~8000 строк
68 / 70