C++ на практике+ irreplaceable.pdf · Браузеры Спецэффекты и...
Transcript of C++ на практике+ irreplaceable.pdf · Браузеры Спецэффекты и...
Antony Polukhin
Полухин Антон
Незаменимый C++
Disclaimer
Незаменимый C++ 3 / 122
Содержание
● На C++ больше не пишут?● C++ vs. Asm● C++ vs. Rust● C++ vs. Go● C++ vs. (Java + C#)● Слабые места C++● Что с этим делать
Незаменимый C++
Asm
C++20
Заблуждение №1На C++ больше не пишут программ
Незаменимый C++
Программы
Незаменимый C++ 6 / 122
Программы ● Поисковые движки
Незаменимый C++ 7 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)
Незаменимый C++ 8 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры
Незаменимый C++ 9 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры
Незаменимый C++ 10 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация
Незаменимый C++ 11 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)
Незаменимый C++ 12 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)● «Виртуальные машины»
Незаменимый C++ 13 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)● «Виртуальные машины»● Научные программы (CERN и Бозон Хиггса)
Незаменимый C++ 14 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)● «Виртуальные машины»● Научные программы (CERN и Бозон Хиггса)● Части ОС (Драйверы, userspace)
Незаменимый C++ 15 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)● «Виртуальные машины»● Научные программы (CERN и Бозон Хиггса)● Части ОС (Драйверы, userspace)● Автопром
Незаменимый C++ 16 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)● «Виртуальные машины»● Научные программы (CERN и Бозон Хиггса)● Части ОС (Драйверы, userspace)● Автопром● Заводы
Незаменимый C++ 17 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)● «Виртуальные машины»● Научные программы (CERN и Бозон Хиггса)● Части ОС (Драйверы, userspace)● Автопром● Заводы● Биржа
Незаменимый C++ 18 / 122
Программы ● Поисковые движки● Большинство высоконагруженных програм (Такси)● Игры● Браузеры● Спецэффекты и анимация● Компиляторы (не только компиляторы для С++)● «Виртуальные машины»● Научные программы (CERN и Бозон Хиггса)● Части ОС (Драйверы, userspace)● Автопром● Заводы● Биржа● Офисные приложения
Незаменимый C++ 19 / 122
ОК, чем C++ привлекает сегодня?
Незаменимый C++
C++
Незаменимый C++ 21 / 122
C++ + zero-overhead
Незаменимый C++ 22 / 122
C++ + zero-overhead
+ неограниченные возможности
Незаменимый C++ 23 / 122
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
Незаменимый C++ 24 / 122
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
+ безопасность
Незаменимый C++ 25 / 122
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
+ безопасность?
Незаменимый C++ 26 / 122
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
+ безопасность?
+ небольшой рантайм
Незаменимый C++ 27 / 122
Сравним с другими языками!
Незаменимый C++
С++ vs. Asm
Незаменимый C++
C++ vs. Asm
Незаменимый C++ 30 / 122
C++ vs. Asm + Ассемблер позволяет выжать максимум из железа
Незаменимый C++ 31 / 122
C++ vs. Asm + Ассемблер позволяет выжать максимум из железа
- непереносимый код
Незаменимый C++ 32 / 122
C++ vs. Asm + Ассемблер позволяет выжать максимум из железа
- непереносимый код
- очень медленная разработка
Незаменимый C++ 33 / 122
C++ vs. Asm + Ассемблер позволяет выжать максимум из железа
- непереносимый код
- очень медленная разработка
- не всегда быстрее
Незаменимый C++ 34 / 122
C++ vs. Asm + Ассемблер позволяет выжать максимум из железа
- непереносимый код
- очень медленная разработка
- не всегда быстрее
Незаменимый C++ 35 / 122
Заблуждение №2Большие программы на C++ работают медленнее чем на ASM
Незаменимый C++
C++ vs. Asm (или как завалить Asm разработчика)
x % 2361 == 7
Незаменимый C++ 37 / 122
C++ vs. Asm (или как завалить Asm разработчика)
Незаменимый C++ 38 / 122
C++ vs. Asm (или как завалить Asm разработчика)
Незаменимый C++ 39 / 122
С++ vs. Rust
Незаменимый C++
C++ vs. Rust
Незаменимый C++ 41 / 122
C++ vs. Rust + Отличная безопасность?
Незаменимый C++ 42 / 122
C++ vs. Rust + Отличная безопасность?
+ Потенциальная возможность оптимизировать лучше C++
Незаменимый C++ 43 / 122
Заблуждение №3Rust более/такой же производительный как C++
Незаменимый C++
Анатомия компилятора (упрощённо)
Незаменимый C++
С++С Rust ...
Middle end
Ada Go
IR
IR
Power PCx86 Alpha ...Arm x86_64
45 / 122
C++ vs. Rust
Незаменимый C++ 46 / 122
C++ vs. Rust Вроде норм.
Незаменимый C++ 47 / 122
C++ vs. Rust Вроде норм.
Переходим на Rust?
Незаменимый C++ 48 / 122
C++ vs. Rust Вроде норм.
Переходим на Rust?
Oh, wait!..
Незаменимый C++ 49 / 122
C++ vs. Rust Вроде норм.
Переходим на Rust?
Oh, wait!..
C C++ — noop→
C Rust — PAIN!!!!!!!→
Незаменимый C++ 50 / 122
C Rust→● unsafe {} нет безопасности→
Незаменимый C++ 51 / 122
C Rust→● unsafe {} нет безопасности→● Нет возможности использовать C headers
● Надо генерировать свои– Обновление библиотек — БОЛЬ!– Надо headers руками допатчивать– Мучительные страдания с borrow checker на сложных С проектах [https://hackernoon.com/why-im-dropping-rust-fd1c32986c88]
Незаменимый C++ 52 / 122
C С++→Берёте и используете C headers
● Оборачиваете в классы по необходимости
Незаменимый C++ 53 / 122
Заблуждение №4Программа написанная на языке Rust X не содержит ошибок
Незаменимый C++
Anything● unsafe или аналоги нет безопасности→
Незаменимый C++ 55 / 122
Anything● unsafe или аналоги нет безопасности→● если ваша программа компилится, это ещё не
значит что всё ОК
Незаменимый C++ 56 / 122
С++ vs. Go
Незаменимый C++
C++ vs. Go
Незаменимый C++ 58 / 122
C++ vs. Go - <великое множество>
Незаменимый C++ 59 / 122
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе корутин
Незаменимый C++ 60 / 122
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе корутин
● Boost.Fibers
Незаменимый C++ 61 / 122
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе корутин
● Boost.Fibers● Yandex.Taxi userver
Незаменимый C++ 62 / 122
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе корутин
● Boost.Fibers● Yandex.Taxi userver● Quantum
Незаменимый C++ 63 / 122
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе корутин
● Boost.Fibers● Yandex.Taxi userver● Quantum● Folly fibers
Незаменимый C++ 64 / 122
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе корутин
● Boost.Fibers● Yandex.Taxi userver● Quantum● Folly fibers● Coroutines TS
Незаменимый C++ 65 / 122
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе корутин
● Boost.Fibers● Yandex.Taxi userver● Quantum● Folly fibers● Coroutines TS● C++20
Незаменимый C++ 66 / 122
Python vs. Go Go скорее конкурент Python, чем C++
Незаменимый C++ 67 / 122
Заблуждение №5Бенчмарки показывают что прогарммы на X быстрее C++
Незаменимый C++
Добро пожаловать в мир «честных» бенчмарков!
Незаменимый C++
Типичные ошибки
● Отключается сборщик мусора
Незаменимый C++ 70 / 122
Типичные ошибки
● Отключается сборщик мусора● Код написан не на C++
Незаменимый C++ 71 / 122
Типичные ошибки
● Отключается сборщик мусора● Код на C++ написан в стиле float* f = new float;
Незаменимый C++ 72 / 122
Типичные ошибки
● Отключается сборщик мусора● Код на C++ написан в стиле float* f = new float;● На Х написана другая программа
Незаменимый C++ 73 / 122
Типичные ошибки
● Отключается сборщик мусора● Код на C++ написан в стиле float* f = new float;● На Х написана другая программа● Тестируется библиотека а не язык
Незаменимый C++ 74 / 122
Заблуждение №6Сборщик мусора не добавляет накладных расходов
Незаменимый C++
Mark and sweep
Незаменимый C++ 76 / 122
structures
struct list_node {
list_node* next;
list_node* prev;
};
struct slist_node {
slist_node* next;
};
Незаменимый C++ 77 / 122
structures
vector<void*> root;
Незаменимый C++ 78 / 122
structures
vector<void*> root; // root[0] — это slist_node или list_node?
Незаменимый C++ 79 / 122
structures
vector<void*> root; // Сколько указателей и где они?
vector<Object*> root;
Незаменимый C++ 80 / 122
structures
struct list_node {
__meta vptr;
list_node* next;
list_node* prev;
};
struct slist_node {
__meta vptr;
slist_node* next;
};
Незаменимый C++ 81 / 122
Stop the world ● Все потоки останавливаются
Незаменимый C++ 82 / 122
Stop the world ● Все потоки останавливаются● Проходим по всем узлам графа, помечая
достижимые узлы
Незаменимый C++ 83 / 122
Stop the world ● Все потоки останавливаются● Проходим по всем узлам графа, помечая
достижимые узлы● ????
Незаменимый C++ 84 / 122
Stop the world ● Все потоки останавливаются● Проходим по всем узлам графа, помечая
достижимые узлы● ????● Profit
Незаменимый C++ 85 / 122
Stop the world ● Все потоки останавливаются● Проходим по всем узлам графа, помечая
достижимые узлы● ????● Profit
● На современном железе больше 1 ядра!
Незаменимый C++ 86 / 122
Stop the world ● Все потоки останавливаются● Проходим по всем узлам графа, помечая
достижимые узлы● ????● Profit
● На современном железе больше 1 ядра!● При каждой сборке мусора мы проходимся по
всем узлам постоянно перепроверяя живые →узлы
Незаменимый C++ 87 / 122
No stop the world
● Ничего не останавливается
Незаменимый C++ 88 / 122
No stop the world
● Ничего не останавливается● Многопоточно разбираем мусор
Незаменимый C++ 89 / 122
No stop the world
● Ничего не останавливается● Многопоточно разбираем мусор● Ура!
Незаменимый C++ 90 / 122
No stop the world
● Ничего не останавливается● Многопоточно разбираем мусор● Ура!● НО
Незаменимый C++ 91 / 122
No stop the world
● Ничего не останавливается● Многопоточно разбираем мусор● Ура!● НО● Нам нужно синхронизировать все потоки через
атомарные инструкции
Незаменимый C++ 92 / 122
No stop the world
● Ничего не останавливается● Многопоточно разбираем мусор● Ура!● НО● Нам нужно синхронизировать все потоки через
атомарные инструкции● Это очень дорого, если не мы последними
трогали ресурс
Незаменимый C++ 93 / 122
No stop the world
● Ничего не останавливается● Многопоточно разбираем мусор● Ура!● НО● Нам нужно синхронизировать все потоки через
атомарные инструкции● Это очень дорого, если не мы последними
трогали ресурс● Мы делаем это при каждой сборке мусора!
Незаменимый C++ 94 / 122
+ Не проходим лишние разы
Незаменимый C++ 95 / 122
structures
struct list_node {
shared_ptr<list_node> next; // atomic refcounter
shared_ptr<list_node> prev; // atomic refcounter
};
struct slist_node {
shared_ptr<slist_node> next; // atomic refcounter
};
Незаменимый C++ 96 / 122
Это ещё не всё!
shared_ptr<Object> some;
Незаменимый C++ 97 / 122
Это ещё не всё!
shared_ptr<Object> some; // Скоро будет больно!
Незаменимый C++ 98 / 122
Это ещё не всё!
shared_ptr<Object> some; // Скоро будет больно!
shared_ptr<Object> prev = some.a; // ...
Незаменимый C++ 99 / 122
Это ещё не всё!
shared_ptr<Object> some; // Скоро будет больно!
shared_ptr<Object> prev = some.a; // ...
prev.a = some; // Циклические ссылки!
Незаменимый C++ 100 / 122
С++ vs. (Java + C#)
Незаменимый C++
C# ?? Java
Незаменимый C++ 102 / 122
C# ?? Java ● См. «Сборщики Мусора»
Незаменимый C++ 103 / 122
Logstash – Программа для сбора, трансформации и складирования логов.
Бесплатное и очень популярное Open Source приложение на Java.
Что может пойти не так?
Незаменимый C++ 104 / 122
Logstash – Программа для сбора, трансформации и складирования логов.
Бесплатное и очень популярное Open Source приложение на Java.
Что может пойти не так?
Незаменимый C++ 105 / 122
Слабые места C++
Незаменимый C++
C++
Незаменимый C++ 107 / 122
C++ - скрытый высокий порог вхождения
- неограниченные возможности- проблемы с безопасностью
Незаменимый C++ 108 / 122
C++ - скрытый высокий порог вхождения
- неограниченные возможности- проблемы с безопасностью
- отсутствие изкоробочности
- крошечная стандартная библиотека- отсутствие готовой инфраструктуры
Незаменимый C++ 109 / 122
ОК, а что делать то?
Незаменимый C++
Незаменимый C++ 111 / 122
Итоги
Незаменимый C++
Итоги
Незаменимый C++ 113 / 122
Итоги ● C++ везде
Незаменимый C++ 114 / 122
Итоги ● C++ везде ● C++ крайне популярен
Незаменимый C++ 115 / 122
Итоги ● C++ везде ● C++ крайне популярен● С++ - самый производительный инструмент для
написания больших приложений
Незаменимый C++ 116 / 122
Итоги ● C++ везде ● C++ крайне популярен● С++ - самый производительный инструмент для
написания больших приложений● Относитесь со скепсисом к бенчмаркам
Незаменимый C++ 117 / 122
Итоги ● C++ везде ● C++ крайне популярен● С++ - самый производительный инструмент для
написания больших приложений● Относитесь со скепсисом к бенчмаркам● Не верьте managed языкам, которые говорят что
они быстрее C++
Незаменимый C++ 118 / 122
Итоги ● C++ везде ● C++ крайне популярен● С++ - самый производительный инструмент для
написания больших приложений● Относитесь со скепсисом к бенчмаркам● Не верьте managed языкам, которые говорят что
они быстрее C++● С++ не идеален!..
Незаменимый C++ 119 / 122
Итоги ● C++ везде ● C++ крайне популярен● С++ - самый производительный инструмент для
написания больших приложений● Относитесь со скепсисом к бенчмаркам● Не верьте managed языкам, которые говорят что
они быстрее C++● С++ не идеален!..
● ...но это исправимо
Незаменимый C++ 120 / 122
Спасибо
Полухин АнтонСтарший разработчик Yandex.Taxi
https://github.com/apolukhin
https://stdcpp.ru/