All streams
Search
Write a publication
Pull to refresh
17
0

User

Send message
Можете посмотреть на CPython. Много писанины, но не rocket science.
А я бы с интересом посмотрел, зачем вам таскать thread или graph между модулями.
Есть какой-то компилятор, у которого рыночная доля сравнима с Microsoft C++???
Конечно есть — Microsoft C++ предыдущих версий. Каждая со своим рантаймом и своим ABI, вопросами совместимости которого до недавнего времени в MS не заморачивались.

А про «get out»… поживём, увидим
Я внезапно осознал, что был в корне неправ, get out не нужен. Больше легаси — сложнее язык — выше порог входа — меньше конкуренция — работа будет всегда. Ура комитету!
А вот давайте не рассказывать сказок?
«Грубо говоря». Они, несомненно, есть, но какова их рыночная доля?

это про язык у которого есть три способа разбора командной строки
«А у вас негров линчуют»? Я далёк от мнения, что Python идеален и не привожу его в пример, но идеи в Zen вполне здравые. Лучше перенимать у других хорошее, чем плохое, не так ли?

А есть языки, где «80% стандартной библиотеки морально устарела»… но ими люди пользуются
Ну да, the ones people complain about and the ones nobody uses.
Однако, у того же автора есть и другая цитата, про much smaller and clearer language struggling to get out. Рант, в основном, о том, что в языке достаточно легаси на уровне кода, если тянуть за собой еще и бинарное легаси — 'get out' не наступит никогда: в C++23 решили ABI не ломать «с небольшим перевесом», а в 26 решат не ломать единогласно, потому что:
— за 6 лет никто и не почешется подготовиться к этому ломанию
— кода, верующего в ABI, станет тупо вдвое больше.
Вы сейчас описали ситауцию в Windows. А вот в мире Linux и Unix — всё было совсем по другому.
Ну да, потому что там, грубо говоря, на всю экосистему один компилятор и одна библиотека, можно упарываться от души.

Вот документ, там всё стандартизовано и описано
Речь не столько о calling convention или там virtual table layout (это всё десятилетиями прекрасно работает в том же COM), сколько о структурах данных.
Пример: std::vector можно реализовать как { BlockBeginPointer, DataEndPointer, BlockEndPointer }, а можно и как { BlockBeginPointer, DataSize, BlockSize }. Документ этого не оговаривает, стандарт этого тоже не оговаривает. Ваш пример с COW сюда же.

И вот именно повторения этой ситуации (затягивание внедрения новой версии C++ лет так на 5-7) комитет и решил избежать…
… и теперь каждые 3 года мы имеем новый стандарт с новыми способами выстрелить себе в ногу, потому что старые расширять нельзя из-за этого вашего ABI, как и баги исправлять.

Пройдет ещё 10 лет и в стандарте появятся какие-нибудь sane_regex, fast_unordeded_map, mutable_initializer_list и т.п. потому что прогресс неизбежен, но то, что есть — священная корова. Не трожь, а то GCC сломается.

А через 20 лет 80% стандартной библиотеки окажется морально устаревшей, но будет висеть мертвым грузом, ибо совместимость.

«There should be one-- and preferably only one --obvious way to do it» — это, увы, не про C++.
мы тут вообще-то про с++
Да вы что, я и не заметил.
Ок, «интерфейсы с Trivial & Standard Layout типами данных». Так понятнее?

Завернуть можно всё, вопрос в желании.
С небольшим перевесом голосов решили ABI в C++23 не ломать.

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

Я вот всегда считал очевидным и самим собой разумеющимся, что Стандарт описывает интерфейс, а не имплементацию, а потому никакого ABI в C++ нет, не было и не будет.

Если вдруг надо вынести код в библиотеку — используем C-интерфейсы между модулями. Всё. Работает с любой версией любого компилятора.
Выставлять наружу C++ объекты тоже, в принципе, можно, но будет работать только с той же версией того же компилятора и с теми же параметрами сборки, поэтому имеет смысл только в том случае, когда контролируем всю кодовую базу и можем всё пересобрать при необходимости, т.е., в основном, «только для внутреннего потребления».

Банальности уровня «мойте руки перед едой».

А теперь, оказывается, в дикой природе нашлись уникумы, решившие, что протаскивать всё через C-интерфейсы сложно, а поэтому давайте закладываться в публичных интерфейсах на недокументированное поведение. Оно же работает сейчас, а значит, очевидно, будет работать всегда.
Казалось бы — да и хрен с ними, да? Естественный отбор же, да?

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

Казалось бы — а причем здесь вообще стандарт, если сохранение бинарного представления — это забота компилятора?

А при том, что новые фичи не всегда можно впихнуть в старое представление, а заседающим в комитете разработчикам компиляторов проще слать лесом любые пропозалы, «ломающие ABI» (которого нет), чем вызывать на себя гнев пользователей, не читающих документацию. Тормозя развитие языка и прогресс.

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


Зачем что-то представлять, KB971033
Стюарт Баттерфилд, создатель Flickr и Slack, развил эту мысль до самобытной концепции «пирамиды богатства», которая помогает прийти к парадоксальному выводу: даже большие деньги не обязательно улучшат вашу жизнь каким-либо заметным образом.

… поэтому зарплату мы вам повышать не будем.

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

Очевидно, что поведение зависит от имплементации std::ostream& operator<<(std::ostream& os, const Data& data), которую вы не привели.
Надо ещё как минимум не перемешать вывод из разных потоков.
В пределах одной записи (<<) вывод и не перемешивается, а уж как именно упорядочивать отдельные записи можете знать только вы.

выводила в консоль прям конкретно посимвольную зебру из двух потоков
Значит писали посимвольно.
Аргументы против move несколько натянуты:

Я не хочу тратить усилия на реализацию move-семантики для всех типов, владеющих ресурсами
Для ~95% таких типов можно переиспользовать unique_ptr, реализовав только custom deleter.

Я не хочу иметь во всех своих типах пустое состояние. Часто оно не к месту. Бывает, что его сложно или невозможно добавить. И всегда это лишние усилия на поддержку
«Moved from» это не совсем «пустое состояние». Объект должен уметь получать новое значение и корректно удаляться, обнулять вообще всё нет необходимости.

Даже если move-семантика реализуема, она может быть непозволительна из-за того, что мы хотим раздать указатели на этот объект
Как вы сами отметили, trivially_relocatable тут ничем не поможет. Guaranteed NRVO — это прекрасно само по себе, но раздача указателей на локальный объект, возвращаемый из функции — это как-то очень вычурно.

Даже если перемещение допустимо, будет затрачено время на то, чтобы «занулить» первоначальный объект, и потом удалить его по всем правилам
В общем случае это обнуление одного владеющего указателя. Небесплатно конечно, но вряд ли будет узким местом.

воспринимается мной как пропаганда религии и очень оскорбительна для меня

Шапка на иконке в каком-то редакторе — это такая мелочь.
Вот выходной 25 декабря — настоящее оскорбление.
Я надеюсь, этот пользователь его отрицает и гордо проводит на работе.
Отнюдь — модель переусложнена. Сферического коня человека достаточно.
Обойти их можно так: попробовать связаться с пользователями по другим каналам и объяснить, как переместить письмо из «Спама» во «Входящие», добавив ваш обратный e-mail в адресную книгу.

Если не подписывать пользователей на рассылку без их ведома, не прятать настойки подписки в дебрях интерфейса и отписывать по первому требованию, сразу и навсегда — возможно, вас перестанут добавлять в спам.
Ясно, спасибо.
Однако, разделение declaration и assignment — в общем случае, дурной тон (в решарпере вроде даже диагностика есть), т.е. в реальном мире там скорее всего будет std::string_view sv = foo(); и dangling reference никуда не денется.
* Мы хотели убить присвоение временных строк в std::string_view:
std::string foo();

std::string_view sv;
sv = foo(); // Compiles... dangling reference

А заодно вы хотели убить и
std::string foo();
void bar(std::string_view sv);

bar(foo()); // perfectly fine
?
Или как предлагалось это различать?
богомерского std::string, ещё более богомерского std::wstring

Строки вам чем не угодили?

Information

Rating
Does not participate
Registered
Activity