LINUX.ORG.RU

Видео докладов с C++ CoreHard Autumn 2018

 


7

8

На канале сообщества CoreHard появились видеозаписи докладов с прошедшей в начале ноября в Минске конференции C++ CoreHard Autumn 2018.

Важный дисклаймер. На конференции были проблемы с Интернетом и он-лайн трансляцией, поэтому в каких-то видеозаписях есть проблемы (например, выпадение отдельных кусочков).

Text Formatting For a Future Range-Based Standard Library - Arno Schödl
Concurrency and Parallelism in C++17 and C++20/23 - Rainer Grimm
Что должен знать каждый C++ программист или Как проводить собеседование - Игорь Садченко и Ко
Информационная безопасность и разработка ПО - Евгений Рыжков
Что не умеет оптимизировать компилятор - Александр Зайцев
Метаклассы: воплощаем мечты в реальность - Сергей Садовников
Asynchronous programming with ranges - Ivan Čukić
Обучаем на Python, применяем на C++ - Павел Филонов
Создание пакетов для открытых библиотек через conan.io - Константин Ивлев
Полезный constexpr - Антон Полухин
Кодогенерация C++ кроссплатформенно. Продолжение - Алексей Ткаченко
Обработка списков на C++ в функциональном стиле - Вадим Винник
Заглядываем под капот «Поясов по C++» - Илья Шишков
Ускорение сборки C++ проектов, способы и последствия - Александр Жоров
C++ CoreHard Autumn 2018. Знай свое «железо»: иерархия памяти - Александр Титов
Actors vs CSP vs Tasks vs ... - Евгений Охотников
Debug C++ Without Running - Anastasia Kazakova

Слайды докладов можно найти здесь

★★★★★

Спасибо! Надо будет посмотреть с свободное время.

Чего молчите-то?) Интересный же язык. У меня вот после Rust снова проснулся интерес к Си++. По сути, два языка Си и Си++ в наше время являются основополагающими для системы. Все остальное производно.

dave ★★★★★
()
Ответ на: комментарий от dave

Спасибо!

Да мне-то и не за что. Это сообществу corehard гран мерси за проведение таких мероприятий. В этот раз было более 300 человек. Еще не C++Russia, конечно, но прогресс за пару лет ощутимый.

Интересный же язык

После C++11 язык стал совсем другим, а C++14 и C++17 увели его от C++98/03 еще дальше. Насколько, что в самом C++ сообществе раскол еще больше усилился. Если раньше приверженцы «modern C++» по заветам Александреску еще как-то находили общий язык с любителями «C with classes», то сейчас между апологетами этих крайних точек зрения просто непреодолимая пропасть :)

А язык, не смотря на то, что стал еще сложнее и обзавелся дополнительными наборами граблей, в повседневном использовании намного удобнее и проще, чем C++98/03.

eao197 ★★★★★
() автор топика

жаль Антона, звук паршивый

anonymous
()
Ответ на: комментарий от eao197

Да, язык становится все сложнее. Если взять тот же Rust, то последний просто минималистичный, компактный и простой по сравнению с плюсами.

По заветам Александреску - это, когда почти весь код находится в хедерах, и там используются сплошные шаблоны?) (его знаменитую книгу лет 10 назад прочитал)

dave ★★★★★
()
Ответ на: комментарий от dave

Да, язык становится все сложнее

Фокус в том, что эта сложность возникает не просто так. Практически все, что есть в языке, кому-то нужно в тех или иных условиях.

Другое дело, что среднестатистическому C++нику нужно только небольшое подмножество C++, поэтому в каждом проекте, по сути, используют нечто вроде «диалектов» — наборы только тех фич, которые признаны «оправданными» для проекта.

Насколько «оправданными» — еще один интересный вопрос. Яркая иллюстрация — это запрет на использование исключений в Google :)

По заветам Александреску - это, когда почти весь код находится в хедерах, и там используются сплошные шаблоны?

Да, когда многие вещи реализуются через шаблоны. Размещение кода в хедера — это следствие использования шаблонов. Может быть, когда в С++ когда-нибудь модули завезут, шаблоны останутся, но вот использовать их можно будет и без хедеров.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Яркая иллюстрация — это запрет на использование исключений в Google :)

Дык, в «Стандартах программирования» Саттера и упомянутого Александреску явно говорят о нестыковках в реализациях. Может, что-то поменялось с тех пор.

Да, и в случае embedded исключения сжирают секции данных. Помню, как на Palm OS их отключал явно.

Может быть, когда в С++ когда-нибудь модули завезут, шаблоны останутся, но вот использовать их можно будет и без хедеров.

Помнится, Страуструп еще в 3-м издании обещал, что шаблоны когда-нибудь можно будет размещать в *.cpp-файлах, но что-то потом не срослось. Надо бы прочитать, что пишет в 4-м издании.

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 2)
Ответ на: комментарий от dave

Дык, в «Стандартах программирования» Саттера и упомянутого Александреску явно говорят о нестыковках в реализациях. Может, что-то поменялось с тех пор.

Может там речь шла о том, что объектники, скомпилированные разными компиляторами, может быть проблематично слинковать в один исполняемый файл.

Если же работать в рамках одного компилятора, то проблем нет вообще.

Тут еще вот какая штука с современным C++. 20 или даже еще 15 лет назад обыденным было получение откуда-то готовых .lib/.a/.so файлов, которые нужно было линковать со своим кодом не имея исходников для этих .lib/.a/.so файлов, и, поэтому, было актуально каким компилятором и с какими настройками все это собрано. Сейчас из-за пришествия OpenSource и широкого использования шаблонов практически все зависимости доступны в исходниках. Поэтому пересобрать их под себя и под свой компилятор — это вообще даже не вопрос.

Да, и в случае embedded исключения сжирают секции данных.

А еще они плохо предсказуемы. Поэтому не могут применяться, скажем, в hard real-time системах. И исключения нельзя бросать из коллбэков, которые отдаются в C-шные библиотеки (в общем случае, по крайней мере).

Противопоказания для исключений есть. Но их не так много. В том же Google или Mozilla запросто можно было бы жить с исключениями, но этого не происходит по историческим причинам.

Ну и еще в C++ всерьез рассматривают возможность заиметь более дешевые исключения: «Zero-overhead deterministic exceptions: Throwing values» (ссылка старая, может сейчас уже есть более свежая ревизия этого предложения).

Помнится, Страуструп еще в 3-м издании обещал, что шаблоны когда-нибудь можно будет размещать в *.cpp-файлах, но что-то потом не срослось.

В стандарт C++98 была заложена возможность «экспорта» шаблонов. Но не взлетела. К моменту принятия C++03 только в одном компиляторе эта возможность была реализована. Да и компилятор этот, Comeau C++, был редким зверем и в живую его мало кто видел.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Может быть, когда в С++ когда-нибудь модули завезут, шаблоны останутся, но вот использовать их можно будет и без хедеров.


Я не вдавался в детали текущих предложений по реализации модулей, но очень надеюсь, что хедеры как таковые уйдут в конце концов в историю (или в область совместимости с С). Стоит немного пописать на языке, имеющем поддержку модулей (Python, D, Java, etc), как совсем пропадает желание мокаться обратно в include-hell.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от m0rph

что хедеры как таковые уйдут в конце концов в историю (или в область совместимости с С).

И в область совместимости с современным C++. Никто гигатонны существующего C++ кода под модули портировать не будет.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Комитет очень боится ломать обратную совместимость, но это не всегда хорошо. Разработчик - гордая птица, не пнешь - не полетит. Его надо стимулировать к переходу на новый стандарт, показывая пользу новых крутых возможностей. Время от времени можно и сломать немного обратную совместимость, ради действительно ценных изменений. Хотя признаю, модули - это довольно серьезное изменение.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Время от времени можно и сломать немного обратную совместимость, ради действительно ценных изменений.

На это не пойдут. Ранее существовавшие предложения по модулям завернули, насколько я слышал, как раз потому, что крупные игроки, вроде Блумберга, заявили, что они не будут переписывать свою огромную кодовую базу под новый стандарт. Поэтому модули должны сосуществовать с хидерами.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Ранее существовавшие предложения по модулям завернули, насколько я слышал, как раз потому, что крупные игроки, вроде Блумберга, заявили, что они не будут переписывать свою огромную кодовую базу под новый стандарт. Поэтому модули должны сосуществовать с хидерами.

Вот тебе и все прелести разработки комитетом. Любители C++ должны страдать.

hateyoufeel ★★★★★
()
Ответ на: комментарий от eao197

всерьез рассматривают возможность заиметь более дешевые исключения: «Zero-overhead deterministic exceptions: Throwing values»

И это вместо того, чтобы добавит Result в std? Необучаемые.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

И это вместо того, чтобы добавит Result в std?

А ты предложение читал или только заголовок?

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

А ты предложение читал или только заголовок?

Да (мне кажется, что в каком-то давнем топике я даже приводил на него ссылку). Не скажу, что я читал внимательно, но когда вместо expected<int, errc> safe_divide(int i, int j) предлагается int safe_divide(int i, int j)throws, остается только пожать плечами,

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

остается только пожать плечами,

Наверное до тех пор, пока не задумаешься, как использовать expected в перегрузке операторов и в конструкторах.

eao197 ★★★★★
() автор топика

Осторожно, невежество.

https://youtu.be/JU_RAcsfQVs?t=294

Неверно, базовая концепция устройства любого ЦПУ - инструкции НИКОГДА не работают с памятью. Они даже и с кешом работают только нулевого(первого уровня).

https://youtu.be/JU_RAcsfQVs?t=350

Операций с памятью.

https://youtu.be/JU_RAcsfQVs?t=415

Тактируемая логика никогда не измеряется временем. Это первое, второе - эксперт всё перепутал. 0.5нс при средней частоте 3ггц это 3 такта на нс, либо 1.5 такта на 0.5 нс. Очевидно, что в данном контексте любая логика имеет гранулярность в 1 такт и не может быть полтора. Но мы предположим, что цифры имели смысл и эксперт говорил о 2/4ггц. Это 1/2 такта. В любом случае это «вызывающе неверная информация», но тут есть лазейка и на неё можно съехать, ведь некоторый класс инструкций на том самом интеле подходят под наивные представления экспертов. Посмотрим, что будет дальше.

https://youtu.be/JU_RAcsfQVs?t=453

Проблема не в расстоянии. Какая у нас там скорость света? 0.3ккк метров в секунду. 0.5 нс - это частота 2ггц, либо c(0.3 * 10^9) / 2 * 10^9, либо 0.3 / 2, либо 0.15 метра за такт. Т.к. это дуплекс, то будет 0.075метра/такт, либо 7.5сантиметра. Пациент явно прогуливал уроки в школе.

https://youtu.be/JU_RAcsfQVs?t=466

В чём проблема их найти? Зачем их искать, если у тебя есть адрес? Но я помогу пациенту - проблемой памяти является само устройство памяти и её мусорная частота работы(которая является прямым следствием). Память просто дерьмо, а не дерьмовая память дорогая.

https://youtu.be/JU_RAcsfQVs?t=469

Потому что это не будет иметь смысла, а причину я уже написал выше.

https://youtu.be/JU_RAcsfQVs?t=517

Неверно. Он не сможет выполнять зависимой список инструкций.

https://youtu.be/JU_RAcsfQVs?t=525

Полная херня, никакие инструкции нельзя исполнять заранее. Можно исполнять любые свободные инструкции, а откуда они взялись - неважно. Самой базовой концепцией является SMT, а не ооо.

https://youtu.be/JU_RAcsfQVs?t=531

С чего вдруг? В контексте зависимого потока инструкций он ничего не может исправить, а вне этого контекста - это исправляется левой ногой.

https://youtu.be/JU_RAcsfQVs?t=574

Тут у нас уже появились кэши и мы точно можем сказать - повезло пациенту на 415, либо нет:

Летенси l1 кэша 5тактов. Ну тут у нас явно имеется ввиду 1.5 гигагерца. Вообщем, тут даже считать не нужно - цифры просто ахинея нероятная.

https://youtu.be/JU_RAcsfQVs?t=583

Тут он явно сравнивает эти цифры. На самом деле в контексте сравнения с упомянутым выше классом инструкций - соотношение примерно правильное, 1/5.

https://youtu.be/JU_RAcsfQVs?t=586

А тут пошла отборная ахинея. ОоО никакую разницу покрыть не может. Разница 1/5 - это уровень параллелизма кода 5, чего попросту не бывает в реальности. Если у твоего кода уровень параллелизма 5 - ему вообще не нужнен ОоО и прощая херня.

https://youtu.be/JU_RAcsfQVs?t=610

Так, ну тут эксперт помножил на ноль попытки защитников свести тему на «он просто рассказывал об абстрактном процессоре, а не об интеле» - он подтвердил, что говорит он об интеле.

А второе - он явно не открывал мануала, ведь никаких 10-30метров l3 нету. Там типичная num(с)a, поэтому либо там нет 10-30метров, либо там нет такого летенси.

https://youtu.be/JU_RAcsfQVs?t=632

Опять же, кэши не измерятся в байтах. Но то такое.

https://youtu.be/JU_RAcsfQVs?t=745

Полная херня. Ни в какую память ничего не посылается. Ядро работает только с l1. И если чтение не проходит - оно делегируется следующему уровню. Что там дальше происходит - ядру насрать.

Самое интересное, что так работает любой кэш. Везде. И откуда берутся все эти представления экспертов - неясно. Они не то что мануалы интела не читали - они даже базовых вещей не понимают.

https://youtu.be/JU_RAcsfQVs?t=779

Pf так же ортогонален кэшам/памяти.

https://youtu.be/JU_RAcsfQVs?t=793

Тут пациент поплыл. Он не смог объяснить причины их дублирования. Никакое переиспользование к делу не относится. Если же мы рассматриваем эту система в контексте вменяемых представлений, то ответ очевиден - мы не можем читать из l-1, только из текущего. Именно поэтому l2 не может читать из памяти, а l1 из l2, а процессор из l2.

https://youtu.be/JU_RAcsfQVs?t=864

Опять же, очень наивные представления. А потом эксперты из яндекса плывут в комментах на хабре.

https://youtu.be/JU_RAcsfQVs?t=927

Подобная иерархия не имеет никакого отношения к оптимальности и прочим куллстори. Назначение её простое - эмулировать колхозные представления. Кэш всегда будет медленнее прямого доступа к нескольким уровням памяти. И причина существования его простая - прозрачность. Он невидим для рядового эксперта и не требует для него усилий.

https://youtu.be/JU_RAcsfQVs?t=978

Всё, это конечная. Всё именно так на что я намекал выше. Пациент попросту не понимает разницу между летенси и трупутом. Т.е. он вещал нам о летенси, а теперь выкатывает график пропускной способности, т.е. трупута.

https://youtu.be/JU_RAcsfQVs?t=1180

Мда, я бы уже бежал с позором из аудитории. Память одна случилась - это полная ахинея, от первой до последней буквы. Никакой один тред никогда не утилизирует память. А что касается RA bandwidth, то она вообще чуть ли не линейно скалируется.

https://youtu.be/JU_RAcsfQVs?t=1218

Эта ахинея. С чего ты взял, что сгенерированные твоей историей реквесты упираются в возможности памяти? Тебя обманули. Опять же, пациент явно не понимает даже базовых вещей, описанных в википедии.

https://youtu.be/JU_RAcsfQVs?t=1226

Чуть меньше разбираются. Какие громкие заявления.

https://youtu.be/JU_RAcsfQVs?t=1341

Кончается печально тогда, когда подобные эксперты что-то там пытаются мерить, а выходит херня. Примеры выше.

Если я знаю как и что работает - мне не нужно ничего измерять, ведь я итак знаю как написал лучше. Измерения нужны для более рандомных явлений, либо при написании хайлевел кода, где ты ничего не знаешь о том, что снизу. И пистон типичный тому пример.

https://youtu.be/JU_RAcsfQVs?t=1423

Как это мило, эксперт сам себя разоблачил.

https://youtu.be/JU_RAcsfQVs?t=1487

Какая же херня. Это просто ужас, при этом эксперт даже примера вменяемого не нашел. Он просто взял в качестве примера блас от вендора. Почему он не привёл два примера? Три? Правильно, потому что их нет. Да и сам блас это по-сути хелворд.

nebanbmenyapls
()

https://youtu.be/JU_RAcsfQVs?t=1517

Полная херня разоблачённая уже десятки раз. Во-первых адепты просто не в состоянии вменяемо трактовать эти O, да и самая концепция мусорная. Во-вторых, как я уже говорил, это множество раз разоблачили даже в ясельной группе С++-мира(привет list).

Далее пошла полная херня про проиграет. Пациент даже базовых тезисов используемой концепции не знает. Проиграет оно только В ОБЩЕМ случае, т.е. на отрезке 0 ... inf. Реальные мир не состоит из общего случая, даже наоборот.

https://youtu.be/JU_RAcsfQVs?t=1559

Никакого отношения крестовые аллокаторы не имеют к «правильной» аллокации. Это кусок дерьма, который пытаются всем сила править, выкатывая пулы и прочие базворды.

Никакого copy/move так же не существует. Это абстракция управления владением ресурсами, которая к языку отношения не имеет и одно не заменяет другое.

https://youtu.be/JU_RAcsfQVs?t=1666

Умножение матриц. У него явно какая-то фиксация на этом. Но я сообщаю эксперту новость - проблема умножения матриц ортогональна последовательному обходу. Даже тут ошибка.

А по поводу матриц я знаю откуда всё это берётся. Там есть одна статейка про память из которой эти эксперты всё копипастят, выдавая себя за экспертов. А больше ничего и нету. Вот и закончилась экспертность.

https://youtu.be/JU_RAcsfQVs?t=1884

О боже, дататрансфер у него случился. О боже, какую же херню он несёт. Кэшлайны никак не связаны с памятью, процессором и прочей хернёй. Они так называются потому, что это следствие имплементации кэша. Меморилайн. О да.

О боже, какая же херня. Это просто ужас. В контексте летенси абсолютно насрать сколько ты там лишних данных таскаешь в кэшлайне. А вещал ты именно об летенси. Правда потом почему-то съехал.

https://youtu.be/JU_RAcsfQVs?t=2058

О боже, я уже не могу. Он опять всё перепутал. AOS/SOA никакого отношения к холодным/горячи данным не имеют. Это всё про обход данных и про оптимальность чтения(в контексте той же пакетной обработки).

Разделение на холодные/горячие данные никакого отношение к AOS/SOA не имеют. Для их разделение не нужно делить структуру на массив полей - достаточно её просто разделить. Ты показал просто частный случай, который перепутал с другой историей.

https://youtu.be/JU_RAcsfQVs?t=2278

Полная херня про 300раз. Где пруфы, билли? К тому же, вся история полная херня. Какой-то кривой пересказ методички. К тому же история не является проблемой только атомиков - это общая проблема, даже на х86, который множество подобных проблем нивелирует.

https://youtu.be/JU_RAcsfQVs?t=2396

Какую же херню он несёт. Он где-то услышал про false sharing, но там где он о нём услышал - не объясняются причины возникновения и он пытается это объяснять, но объяснить он не может т.к. нихрена не понимает.

Ответ на этот вопрос прост. Никаких чтений интов не существует и об этом было выше сказано. Чтение гранулярно кэшлайну, а значит там каждый тред читает по 64байта. Очевидно, что 4 инта(подряд) не могут существовать в рамках 4 отдельных кэшлайнах, а значит треду читают один лайн. От того он и false, что его не осознают адепты представления которых о памяти заканчивается на интах.

https://youtu.be/JU_RAcsfQVs?t=2531

Не, он явно одарённый. Он выше сам же говорил о том, что читается на самом деле не байтами, а кэшлайнами. Причём тут не знает, знает. Ты вообще способен связать два тезиса произнесённых с разницей в пару минут?

https://youtu.be/JU_RAcsfQVs?t=2627

Правильно и ты его не читал. Я так обожаю этих экспертов, которые ссылаются на то, чего в глаза не видели.

https://youtu.be/JU_RAcsfQVs?t=2630

Не там ничего подобного.

nebanbmenyapls
()
Ответ на: комментарий от yoghurt

Да нет, я даже не придирался особо. Я смотрел, смотрел охреневал молча. А потом он начала вещать о том, что «вот вы говно, а я эксперт» и меня затриггерило.

nebanbmenyapls
()
Ответ на: комментарий от nebanbmenyapls

Ну я пока слушал вполуха, тоже пару раз обращал внимание, а так, закрывая глаза, доклад для введения в тему очень даже ничего - достаточно систематизирован

yoghurt ★★★★★
()
Ответ на: комментарий от tailgunner

Да, как-то не вовремя у него эффект медикаментозного лечения закончился. :(

eao197 ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

ЕМНИП, докладчик в начале предупреждал, что доклад будет очень поверхностный и рассчитанный на тех, кто вообще слабо представляет себе взаимодействие CPU и памяти. Может быть из-за склеек в видео это не зафиксировано на записи.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Если все действительно так плохо, как говорит царь, то это ппц. Пора бы уже понять, что c++ и поверхностно понятия несовместимые.

Deleted
()
Последнее исправление: rj45 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Во-первых, видео доступно и вы сами можете посмотреть, составить свое мнение.

Я, например, на докладе не услышал никаких откровений, но и не услышал ничего, чтобы противоречило моему собственному опыту и тем немногим знаниям, которые у меня есть в этой области.

Во-вторых, для вас может быть неожиданно, но и в мире C++ есть a) новички, которые в принципе мало что знают, и b) люди, которые специализируются на каких-то других прикладных нишах. Всего знать невозможно и если, например, вы делаете инструментарий на базе clang-а или занимаетесь расчетами прочности конструкций или обсчитываете модели коррозийной стойкости, о том же false-sharing вы вообще можете не иметь представления.

eao197 ★★★★★
() автор топика

Спасибо, что каждый раз составляете дайджест докладов различных мероприятий и создаёте тему здесь.

Неплохо было бы и в новости/мини-новости оформить.

EXL ★★★★★
()
Ответ на: комментарий от zamazan4ik

Вот, блин, не надо. А то переедет тема в talks и все.

Хорошо хоть царь в этот раз зарегистрировался, его можно в игнор добавить.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

поэтому в каждом проекте, по сути, используют нечто вроде «диалектов»

а как же говнокодеры, которые вжаривают «ООП» и «паттерны» во все поля?

i36_zubov
()
Ответ на: комментарий от i36_zubov

а как же говнокодеры, которые вжаривают «ООП» и «паттерны» во все поля?

А чем это противоречит тому, что я сказал про «диалекты»?

eao197 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

кто вообще слабо представляет себе взаимодействие CPU и памяти

может они из жабы пришли или еще из каких нибудь модных языков

i36_zubov
()
Ответ на: комментарий от eao197

Тут еще вот какая штука с современным C++. 20 или даже еще 15 лет назад обыденным было получение откуда-то готовых .lib/.a/.so файлов, которые нужно было линковать со своим кодом не имея исходников для этих .lib/.a/.so файлов, и, поэтому, было актуально каким компилятором и с какими настройками все это собрано. Сейчас из-за пришествия OpenSource и широкого использования шаблонов практически все зависимости доступны в исходниках. Поэтому пересобрать их под себя и под свой компилятор — это вообще даже не вопрос.

А в промышленно-промышленном энтерпрайзе что-то изменилось?

В стандарт C++98 была заложена возможность «экспорта» шаблонов. Но не взлетела. К моменту принятия C++03 только в одном компиляторе эта возможность была реализована. Да и компилятор этот, Comeau C++, был редким зверем и в живую его мало кто видел.

Помню-помню про такой чудо-компилятор. Жаль, что не стали развивать, как и не стали развивать Digital Mars. А Borland, интересно, продолжают развивать?

Вообще, что мне нравится в Си++ - это обилие компиляторов. Даже российские есть, например, с поддержкой C++ 11. Вот Mozilla если вдруг, случись что, загнется, то что тогда будет с Rust? Несмотря на всю опенсорсность, деньги все равно нужны на развитие.

dave ★★★★★
()
Ответ на: комментарий от dave

А в промышленно-промышленном энтерпрайзе что-то изменилось?

ХЗ, последние несколько лет у нас очень узкоспециализированная область деятельности, к энтерпрайзу отношения не имеющая.

Вроде как это глобальная тенденция, которая затронула всех. Разве что с поправкой, что в каких-то больших компаниях проекты могут долго сидеть на старых версиях компиляторов и переход на новые стандарты там может откладываться на годы. Тут же недавно обсуждалась статья с Хабра про перевод кодовой базы 1С на C++14. Наглядный тому пример.

Вообще, что мне нравится в Си++ - это обилие компиляторов.

При этом это одна из основных причин отсутствия единого build tool-а для C++. И одна из причин того, что экосистема C++ застряла где-то в 1980-х.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

я просто видел вживую какое говно вытворяют творческие программисты. и «писать на диалекте» встречается совсем уж в каких-то нишах, типа микроконтроллеров с Qt внутри. оборудование измерительное или ККТ.

А как только есть возможность выпендриться, так они херачат вообще всё что могут.

i36_zubov
()
Ответ на: комментарий от zamazan4ik

https://www.youtube.com/watch?v=dAmhGElNUX0 :

https://youtu.be/dAmhGElNUX0?t=692

Аллокация может содержать сайд-эффекты. Ты либо выпиливай возможность переопределять op new, либо у тебя проблемы. Шланг попросту игнорирует сайд-эффекты в op new - такой компилятор достоин помойки.

К тому же, этот случай нахрен ненужен и не имеет смысла.

https://youtu.be/dAmhGElNUX0?t=774

Пациент явно не понимает тему. Вектор там не сработает потому, что они не могут игнорировать сайд-эффекты в юзер-коде. И никогда этого не будет.

Да чего говорить, пациент даже не понимает(либо не сообщает), что работает это чисто из-за интов, ведь при создании этих объектов(базовых) нет сайд-эффектов.

https://godbolt.org/z/8_WHEg - бам и шланг обдристался, хотя тут изи выпиливается new.

В конечном итоге - что мы видим? Это очередной пример того как шланг ссыт в уши адептам. Запиливается просто какой-то убогий мусор и о нём трубят на каждом углу, а реально это просто треш. Убогий и бесполезный треш.

https://youtu.be/dAmhGElNUX0?t=778

И не увидишь. Ты просто ещё не понял как это работает. В этом вся суть шланга.

https://youtu.be/dAmhGElNUX0?t=792

Правильно, потому что это вообще не компилятор.

https://youtu.be/dAmhGElNUX0?t=873

Правильно, и эти лимиты у шланга выше. Вот и ещё одна суть супер-компилятора.

https://youtu.be/dAmhGElNUX0?t=922

Молодец, тоже правильно.

https://youtu.be/dAmhGElNUX0?t=941

Улучшить ситуацию просто - запилить нормальный язык, а не страдать хернёй со всякими бесполезными constexpr и прочим. Но тут проблема не столько в языке и компиляторах, сколько в их адептах.

Достаточно посмотреть на рядовые изваяние, где пацаны до сих пор не осилил header-only. Их код никогда не будет оптимизирован - это фундаментальный баг в пациентах.

Причины тому просты - компиляторы и язык не может идти по пути полноценного анализа кода в ситуации, когда существует раздельная компиляция. И не надо мне рассказывать про «миллионы строк кода» - это миллионы строк кода явление настолько редкое, да и все эти миллионы без споблем делятся на модули.

https://youtu.be/dAmhGElNUX0?t=1025

О боже, что за ахинея пошла. Теоремы. Теоремы существуют только за партой, а на уровне вычислений существует только арифметика, причём арифметика уровня железяки ортогональна запартной.

https://youtu.be/dAmhGElNUX0?t=1045

Просто x там будет за партой.

И да, именно для таких правил и существует fm, который подтирается железячными правилами. А пациент говорит «слабый» - ога.

https://youtu.be/dAmhGElNUX0?t=1110

Это не кастыль. Так работают все оптимизации, почти все. Банальный поиск паттерном/реплейс.

https://youtu.be/dAmhGElNUX0?t=1300

Это неважно. Анализатор в шланге тормазит так, что его уже мало что замедлит.

https://youtu.be/dAmhGElNUX0?t=1613

А теперь расскажи это пацанам с раздельной компиляцией.

https://youtu.be/dAmhGElNUX0?t=1631

Забудь про шланг - он мёртв. Никакого прогресса нет, деградация по производительности разы. Ты уже демонстрировал то, что делают авторы шланга. Им не нужны оптимизации - им нужен примитивный хайп.

https://youtu.be/dAmhGElNUX0?t=1842

Ну пациент явно не понимает даже базовых вещей. «оптимизации нету». Хотя об этом я уже писал - что за глупые представления у людей об оптимизациях, будто бы это какие-то волшебные хрени и всё их отсутствие объясняется их отсутствием.

Нет, у тебя тут фундаментальная проблемы и ты о ней говорил - у тебя левый юзерский код, который ты пытаешься как-то анализировать. Ты хочешь, чтобы компилятор каким-то образом понимал, что делает твой код? Это невозможно.

Ты хочешь добавить это понимание для вещей из базовой библиотеки? Дак они могут быть реализованы по разному. Тот же шланг умеет в две либы - какую выбрать? Опять же - это противоречит базовым концепциям языка, где декларируется «либы - есть внешняя для языка логика» и std не исключение.

К тому же пациент написал и про буст, что просто множит на ноль предыдущий пункт.

https://youtu.be/dAmhGElNUX0?t=2053

сАлиасинг это дерьмо, это мусорный костыль существующий из-за того, что говнокод и говнокомпилятор не может в итоге дать хороший результат. Любая оптимизация основанная на догмате не является вменяемой по определению.

https://youtu.be/dAmhGElNUX0?t=2196

Опять всё вернулось к тому же самому - пациент вещает какие-то странные вещи. Почему не оптимизируется? Очевидно и ему показано на листинге - есть несколько внешних вызовов, которые могут делать всё что угодно и выкинуть их никак нельзя. Что же так сложно осознать такую простую вещь.

Единственное, что ты тут можешь оптимизировать - это опять делать те самые кастыли как fm - т.е. просто искать подобный паттерн использования и выкидывать лишние вызовы. Но это дерьмо и полная херня, которая нихрена не работает и докладчик сам хаял такой подход.

https://youtu.be/dAmhGElNUX0?t=2662

Правильно. В этом и суть, а виноват в этом шланг. Гении маркетинга в шланге решили - а давайте мы подхалявим, делать оптимизации на базе УБ очень просто, да и такого никто не делает - покажем всем как можем. Много из этой херни пытались пропихнуть в стандарт и что-то даже удачно.

Все эти оптимизации целиком и полностью бесполезны, т.к. их вообще нет. Это просто пыль в глаза(примеры докладчик уже показывал, а я их развивал).

К тому же, на подобные вопросы «сами виноваты» - это не ответ. Это херня. Трактовка подобными пациентами УБ не имеет смысла. Они пытаются трактовать УБ как «недопустимое» - хотя УБ это не синоним «недопустимое». Вот так просто можно людей обмануть, впарив им совершенно другое понятие за исходное.

https://youtu.be/dAmhGElNUX0?t=2708

Это только текущая история, а когда всё это начиналось они тащили всю эту херню тоннами. Потом стали жаловатся, стали спрашивать «где профит» - пришлось маневрировать.

https://youtu.be/dAmhGElNUX0?t=2775

Правильно. Это фундаментальная проблема шланга - какой-то оптимальный код он генерирует только в маня-фантазиях его же адептов. В реальности всё не так. Я пару раз в жизни видел когда, который шланг сгенерировал лучше и то причина там была в менее жестких ручках(об этом говорилось выше, у шланга ограничения по анализу кода менее жесткие).

https://youtu.be/dAmhGElNUX0?t=2828

Пацан говорил про форсинлайн.

https://youtu.be/dAmhGElNUX0?t=2885

А я знаю почему. Зачем что-то пилить, если можно впаривать дерьмо и хайпить? Шланг уже давно не «тот самый новаторский стартап».

https://youtu.be/dAmhGElNUX0?t=2923

Шланг это один большой баг. Там вообще нет оптимизаций(кроме совсем базовых) более серьёзных, нежели хелворды уровня реплейса. Хелвордами очень хорошо пускать пыль в глаза на конференциях(типа выпила op new), а вот реальные оптимизации требуют более серьёзного подхода. А зачем им заниматься, если итак хавают?

https://youtu.be/dAmhGElNUX0?t=3058

По поводу модулей. Всё зависит от имлементации. Если они осилят реализовать модули через инжекты прекомпилированного кода(т.е. такие инклюды на стероидах), то будет быстрее. Если это будет очередная херня уровня «просто соберём *.o в пакеты и прикостылим таблицу экспортов) - будет медленнее и никогда с этим ничего не сделаешь. И никакое лто не поможет.

Кстати, я когда-то срался со шлангером на тему убого lto в llvm. Оказывается всё так, как я предполагал и видел.

nebanbmenyapls
()
Ответ на: комментарий от zamazan4ik

Проблема этого доклада, языка и компилятора в целом - это отсутствие желания решать проблемы, а вместо этого происходит какая-то херня.

Это больше на тему другого доклада(про метаклассы. Там пациент так же нёс отборную херню, про какие там ast и прочее), но и контракты являются типичным примером. На базе этого очень просто будет понять фундаментальные проблемы.

У нас есть констэкспр, рефлексия, метаклассы, атрибуты, контракты - что это такое?

По порядку. Что такое constexpr? Это мусорный костыль, который позволяет создавать выражения, вход, контекст и выход - константа. Костылём является некий суррогат, заменитель нужного. Что нам нужно? Правильно, нам нужны компилтайм-вычисления, причём не в узком смысле. Мы просто хотим разделить программу на две части - одну часть исполнять сразу, а вторую потом. В идеальном случае вторая должна поражаться при помощи первой.

Что такое атрибуты? Это просто неведомая херня. Что мы хотим получить? Возможность навешивать мета-свойства на любые объекты времени компиляции.

Что такое контракты? Это такие же мета-свойства.

Что такое типы? Это объекты типа времени компиляции, в которые преобразуются все наши определения. Преобразуется в набор свойств.

Что такое рефлексия? Это какой-то мусорный костыль. Что нам нужно ? Доступ к этим объектам типов, доступ и возможность построения операций над ними.

Что такое метаклассы? Это определение типа через ручную генерацию объекта типа.

А теперь подумаем - что же это всё такое? Что такое наша программа? Что такое наш код? Его структура и элементы? Это просто декративное api создания/описания этих самих компилтайм-сущностей.

Внимание вопрос - могут ли эти сущности определятся через сущности базового языка? Да. Могут ли эти сущность экспортироваться с уровня рантайма компилятора? Да.

И что же мы можем сделать? Правильно, нам достаточно ввести одно понятие - исполнение в рамках рантайма компилятора.

Что мы получим? Всё очень просто:

in_compiler_runtime_ctx {
  class object_t {
    define_method(...);
    ... 
  };
}

//в обычном контексте.

object_t cl_t {
  f() {}
};

//на самом деле это банальное деклативное описание:

in_compiler_runtime_ctx {
  auto cl_t = object_t(...);
  cl_t.define_method(f, expr_obj, ...);
}

//в конечном итоге мы получаем один и тот же объект в двух контекстах. Что такое рефлксия?
in_compiler_runtime_ctx { 
  cl_t.define_method(c, other_expr_obj, ...);
  cl_t.methdos();// -> список методов
}

//что такое контракты?

void f() {
  in_compiler_runtime_ctx {
    f.add_contract(contract|exp|...)
    assert(f.args[0] == double);//да, это работает - т.к. тут типы это объекты, точно так же как f
  }
}

//что такое метакласс?

in_compiler_runtime_ctx {
  class metacl: object_t {// это уже метакласс. По определению. Ничего не нужно
    ...
  }
}

metacl cl {};

//что такое оптимизации?

auto sort(rng) { 
  in_compiler_runtime_ctx {
    if(rng.is_sorted) sort.expr = return rng;
  }
  //impl
  in_compiler_runtime_ctx {
    rng.is_sorted = true;
  }
}

void f() {
  auto rng = {1, 2, 3, 4, 5};
  sort(rng);
  in_compiler_runtime_ctx {
    rng.is_sorted;// -> true
  }

  sort(rng);//sort == sort(rng) {return rng;}
  sort(rng);//
  sort(rng);//
  sort(rng);//
  //С отменой sort() сложнее, тут нужно реализовывать на уровне мета-информации стек операций, на уровне других операций описывать require. А далее, если стек содержит ненужные для require трансформации - удалять их. Если к мета-объекту происходят множественные обращения - require для каждой операцией над объектом сливаются.
  //слишком много нужно писать - мне лень писать псевдокод для этого случая.
}


const auto v;//декларация в in_compiler_runtime_ctx объекта v.
in_compiler_runtime_ctx {
  auto value = gen();
  ...
  v.value = value;
}

//к тому же, что-то наподобие in_compiler_runtime_ctx{...} - уже есть. Это [[...]].

В конечном итоге, мы приходим к тому - что проблемой является текущая, убогая парадигма. И пациенты вместо того, чтобы решить проблему - костылят сотни решений, которые делают одно и тоже. Они пытаются в каких-то вещах эмулировать вменяемое поведение языка.

Такая же ситуация и в оптимизациях. Попытка воссоздать логику описанную в программе - порочна и глупа, ведь если ты можешь её воссоздать - программист тебе нахрен не нужен.

nebanbmenyapls
()
Ответ на: комментарий от eao197

И исключения нельзя бросать из коллбэков, которые отдаются в C-шные библиотеки (в общем случае, по крайней мере).

опять пургу несёшь? меня за это на собеседовании на последнее место работы спрашивали. да, область не самая распостранённая, но и ничего сверхъестественного в этом нет.

anonymous
()
Ответ на: комментарий от m0rph

Разработчик - гордая птица, не пнешь - не полетит.

пинать нужно правильно. если он в своё личное время всё перенесёт, то какой вопрос?

anonymous
()
Ответ на: комментарий от hateyoufeel

Вот тебе и все прелести разработки комитетом.

ну, мы написали несколько больше чем на %language_name

anonymous
()
Ответ на: комментарий от nebanbmenyapls

надеюсь, тебя не успеют забанить

Самой базовой концепцией является SMT, а не ооо.

а как ты смотришь на давешнее заявление линуса нашего торвальдса... по поводу того, что smt легче отколючить чем чинить?

anonymous
()

и платить за if+ на каждый вызов?

if - это ужасно, но if+ - это, конечно, совсем капец. Но хотя бы за каждый вызов платить не надо - только за те, которые возвращают Result.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

слишком уныло троллишь

if+ — это if плюс какая-то обработка, которая, как минимум, забивает i-кеш и btb.

посчитай процент Result-ов в любой своей нетривиальной программе...

anonymous
()
Ответ на: комментарий от tailgunner

Ну ты-то посчитал?

посчитал.

1. можно ли обработать ошибку по месту? конечно да. лет 10 назад я расковыривал такую функцию на 1500 строк. за неделю, выделив выделяемое, сократил её где-то до 500.

2. обычно, обработка ошибки имеет смысл на 3-5-10 уровней выше.

3. её пробрасывание на каждом из этих уровней я и называю if+.

4. отдельным пунктом стоит потенциальная потеря точности при этом пробрасывании. лет 5 назад пришлось работать с кодом, где для этого использовались отдельно положительные и отрицательные коды ошибок...

anonymous
()
Ответ на: надеюсь, тебя не успеют забанить от anonymous

Я понятия не имею - что он там говорил и в каком контексте. SMT это единственное, что может позволить говнокоду существовать в рамках «параллельного» мира. Если его отключить - пацаны уедут в палеолит.

nebanbmenyapls
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.