Antony Polukhin - GitHub Pages+... · Браузеры Спецэффекты и анимация...

Post on 14-Jul-2020

12 views 0 download

Transcript of Antony Polukhin - GitHub Pages+... · Браузеры Спецэффекты и анимация...

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

antoshkka@yandex-team.ru

antoshkka@gmail.com

https://github.com/apolukhin

https://stdcpp.ru/