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