Обновить
1
1.6

Специалист по теории типов USB-кабелей

Отправить сообщение

В варианте SHITTY_CODEGEN он видать не смог раскрыть один из шаблонов поэтому нагенерил три варианта функций GoRec с тремя разными типами возврата ввиде лямбд, кторые он вынужден вызывать по отдельности, строки 25, 31, 37.

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

Беглый взгляд показывает, что идет вызов GoRec(nfa.initState, 0), плюс унутре там парсится пустая строка, если я чего-то не проглядел. Попробуй в "std::string_view string" чем то проинициализировать.

Match передаётся снаружи, так что компилятор не знает, что будет в string и в nfa.

О Боже, во что превратили С++ за последние 20 лет :)

Лучший в мире инструмент для обеспечения job security.

и вот тогда каждый написанный тест даёт максимум эффекта. то есть имеет максимум соотношения "качество/цена".

Которое не то что ноль, а отрицательное.

Распознавать-то распознаёт, только иногда делает с этим адовую ерунду, когда там требуются какие-то дополнительные оптимизации: https://gcc.godbolt.org/z/bh6Gx5hxq

Мне лень по ассемблеру строить полный call graph, но у clang есть хотя бы один рекурсивный путь с call, а gcc делает что-то либо очень гениальное, либо очень тупое для -DSHITTY_CODEGEN-случая (и там тоже есть какие-то рекурсивные пути с call — gcc'шный кодген мне понимать сильно тяжелее, чем clangовский в этом случае).

При этом аналогичный SHITTY_CODEGENу (с паттерн-матчингом и вот этим всем) ФП-код компилируется в хвостовую рекурсию без всяких вызовов, как и ожидается.

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

в всего лишь несколько строк

То же самое, что «в несколько раз меньше строк», да.

Я многие другие вещи писал (и писал о некоторых из них на хабре), от расстояния Левенштейна до разных регулярок. Вполне себе плюсовая производительность.

БПФ что на хаскеле, что на плюсах я буду писать не явными поэлементными циклами, а с использованием векторных примитивов.

Компилятору наверное проще оптимизировать цикл, чем рекурсию?

Компилятору проще оптимизировать то, смысл чего он «понимает». При этом даже loop-invariant code motion можно делать не всегда, потому что не факт, что цикл выполнится хотя бы один раз, и не факт, что у LICMнутого выражения нет сайд-эффектов.

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

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

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

Поразительная вертлявость (хотя первые четыре буквы лучше заменить на «омер»).

Во первых, я не жаловался.

Это неважно. Указывали на недостатки. Показывали как недостатки. Объясняли, почему сишников это не устраивает.

Конкретная формулировка здесь неважна, важно только то, что якобы неяВность определённой фичи раста является недостатком (поводом отказаться, етц) для людей с альтернативным складом ума, и потом говорите, что C++ без ещё более неяВной фичи для этих же людей — плохо, и с неяВной фичей он был бы лучше, и она бы не была недостатком (поводом отказаться, етц).

Шиза.

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

Не надо врать. Вы сказали, что эта возможность является причиной отказа. Вы прямо написали, что возможность скрывать детали реализации неприемлема для сишников (а не «может быть неприемлема», например).

Я предложил конкретные условия. Когда это могло быть автоматически.

Угу, только эти конкретные условия недостаточно формализированы, нелокальны, и ведут к на самом деле большим прболемам в поддержке кодовых баз (за что вы так ратовали рядом).

Но тут ведь главное — предложить. Поучаствовать. Высказать. Насколько это осмысленно ­— совершенно неважно. Хоть код копипасти, хоть автомагией занимайся.

Опять же слово «могло» фигурирует.

Что это вообще значит в данном случае? Типа, может делать, а может и не делать, монетку кидает? Или это ваше предложение — это так, не предложение, а фантазии вслух, уровня «может, на Гаити съездить» — «может, автомувать, если перегрузка одна»?

Лучше бы вы последовали совету, подышали свежим воздухом. Научитесь сначала читать вы сами, прежде чем указывать другим. У вас фантазии в голове

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

При этом любых вопросов по существу вы избегаете как огня, и в лучшем случае просто переводите тему, а чаще — напрочь игнорируете эти вопросы. c++11 проблема потому что sfinae, но в c++03 с ним всё норм, но код неоднозначен, но в enable_if_t всё просто, но проблема, но надо тащить библиотеку.

Ну это очевидный самообман.

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

В чём ответственность?

Потому, что они ответственны за всю систему, а значит, ответственны за действия котов, которых пасут.

И если в биндингах для раста будут проблемы, то какие проблемы возникнут у конкретно Кристофа?

Ты как будто никогда не участвовал в исправлении ошибок после того, как утвердил ошибочный PR.

Ошибок в тех системах, за которые я не отвечал — нет. Даже если я высказывал своё ценное мнение в PR'е (чего от меня, кстати, тоже не требовали, и чего не требуют от Кристофа).

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

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

Эта «косвенная ответственность» называется желанием быть царьком в своём загончике, опять же.

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

Это понимание освобождает, рекомендую.

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

А в чём принципиальная разница? Пасти котов одинаково (не) надо и там, и там. Починить и проверить код он одинаково (не) может и там, и там. В чём разница?

он с ними уже давно научился эффективно работать, соответственно плюсы большие, а минусы стали много меньше

С кем — с ними? С драйверами устройств, которых у него нет? А в чём там вообще работа может заключаться?

уже выпущенные устройства не эволюционируют со временем, только уходят с рынка

APIшки ядра эволюционируют (stable API is nonsense же), и в работе устройств выявляются баги.

Я в хаскеле спокойно пишу условный mapM_/forM_, который, вообще говоря, реализован рекурсией-свёрткой, да ещё и абстрактно поверх любого тайпкласса Foldable. И ничего, получаю производительность на уровне C++. Функциональные компиляторы натасканы на рекурсию так же, как императивные — на циклы.

Именно поэтому он и не хочет нести даже малейшую ответственность за это.

Я правильно понимаю, что в той подсистеме, которую он мейнтейнит, есть драйвера только для того, что есть лично у него?

плюсы и минусы несения ответственности за обвязки для Раста

Зачем вообще нести за неё ответственность, если ему прямо предлагалось, чтобы обвязки мейнтейнили сами растовики?

Совершенно верно.

Тогда какая им разница на стабильность этих инструментов?

Ответственность на них никто не вешает, опять же.

Чтобы не остаться с чем-то недоделанным перед релизом.

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

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

Достаточно очевидно, что после его смерти, это будут не его проблемы.

Но я-то не Кристоф, мне интересно и важно, что будет после его смерти!

Нормально, практически ничего.

Это уже другой вопрос по сравнению с «шансов, что множество непустое, практически нет». Теперь мы уже обсуждаем меру этого множества :]

Кристофу, как и Линусу, нравится не иметь ответственности перед драйверопейсателями, но чтобы их инструменты были стабильны.

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

паясничать перестаньте, лучше "полезно" проясните.

Да не, почему, я ж не спорю, ненужная на практике фигня. Точно так же, как и тесты — ненужная на практике фигня (с чем спорите уже вы).

чувак написал: "полезно" и выдал такую хрень, что без поллитры никто не разберёт, которая на экране не помещается!

Показал ради лулзов основания математики на расте, чем плохо? Это как судить об ООП по fizzbuzz enterprise edition (только, в отличие от ООП, математика интересна и полезна).

понятно почему вас на работу не нанимают.

Почему? Нанимают же. Я прям сразу говорю, что не пишу тесты, и мне сразу оффер дают на ×2 от верхней границы вилки.

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

При этом вы топите за тесты и ООП, хотя никто не видел никакого правильного ООП, и тесты нафиг не нужны ни энтерпрайзу, ни его пользователям. Плюс, все эти тесты тестируют 2+2 = 4, очень классно.

Вы таки будете смеяться, но в HEB, крупнейшем техасском (и одном из крупнейших американских) продуктовом ритейлере

As of 2022, the company had a total revenue of US$38.9 billion.[8] H-E-B ranked number 6 on Forbes' 2022 list of "America's Largest Private Companies".[9] The company also ranked number 3 on Forbes' 2024 list of "Customer Experience All-Stars."[10] H-E-B was named Retailer of the Year in 2010 by Progressive Grocer.[11] Supermarket News ranks H-E-B 13th on the list of "Top 75 North American Food Retailers" by sales.[12] Based on 2019 revenues, H-E-B is the 19th-largest retailer in the United States.

очень много бекенда на хаскеле.

Если про меня, я не жаловался на неясность trait'ов.

Неявность. НеяВность. Вы же рядом:

Rust, из-за наличия trait'ов и макросов может скрывать реализации алгоритмов, что для программистов на C не приемлемо.

И автомагию я не прелагал.

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

std::string s { "я не могу общаться с ретардами, но приходится" };
doSmth(foo);
return s[0];

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

Иными словами, если я удаляю эту перегрузку, то я хочу, чтобы компилятор меня ткнул носом в те места, где я на неё опирался, чтобы я подумал, что с этим делать (заменить на мув, переписать алгоритм, вернуть перегрузку). Если вы хотите, чтобы происходило что-нибудь, лишь бы происходило — пишите на джаваскрипте. Это ровно ваш [object Object], так что непонятно, зачем вы undefined is not a function.

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

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

При наличии только одной функции с аргументом типом универсальной ссылки, перемещение могло выполняться автоматически.

А если у вас

void foo(auto&&);

то надо копировать или перемещать?

А если у вас

void foo(string& s, string&& f);
void foo(string&& s, string& f);

то что вы здесь будете копировать или перемещать в вызове, где оба аргумента не rvalue?

А если я не хочу перемещать, в конце концов, то что мне делать? Сделаете std::dontmove?

Предложения «ну давайте мувать автоматически, и копировать тоже автоматически, и вообще» может выдавать только человек, который не писал ничего сложнее хелловорлдов, и с std::move знаком по постам в блогах OTUS.

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

Очень важная цель, мешающая на практике (нет).

Ура, наконец-то человек, с которым достоверно можно поговорить по существу!

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

Зачем этим выпасом заниматься? Они уже сами предложили свою помощь и кандидатуру.

У С есть одно неоспоримое приемущество перед Rust - этот язык, в целом, мёртв.

Что имеет некоторые последствия, к слову, по части привлечения новых разработчиков (Кристоф, к сожалению или к счастью, не вечен).

Шансов, что кто-то там что-то сделает deprecated, почти нет.

Ну как тебе сказать…

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

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

Я в очередной раз напомню, что девиз ядра для ядерных вещей — stable API is nonsense.

Вы проигнорировали некоторые мои вопросы, среди которых:

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

  2. Где написано, что у Кристофа есть помощники-мейнтейнеры?

  3. Какие гарантии по времени отзыва даёт Кристоф и другие мейнтейнеры?

  4. Является ли принятое решение в ядре высеченным в граните на века?

  5. На каком языке написаны блобы прошивок, и как это мешает разработке?

так что я теперь буду в начале комментария их повторять и пополнять этот список.

Это неудобно в конкретной кодовой базе.

Я на всякий случай отмечу, что причина не становится технической от количества повторений, а конкретные сценарии вы так и не указали.

Этого было достаточно для отказа. Не можете с этим смириться - это ваши личные проблемы.

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

Сложно ему или сложно в принципе?

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

Он указывал не лично себя.

Ваша же цитата:

Maintaining multi-language projects is a pain I have no interest in dealing with.

(курсив мой)

Если я сейчас напишу «maintaining C projects is a pain I have no interest in dealing with», то это станет непреложной истиной по одному факту того, что я так написал?

Кристоф дал разъяснения

«Мне сложна но помощь не нужна»

и альтернативы

«Копипастите везде»

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

Пользы в крупных проектах от Rust пока не видно, чтобы так громко заявлять.

— Польза от раста не показана.
— Результаты гугла по использованию раста в AOSP говорят об обратном.
— Nim и Zig тоже где-то используют, и что?
— Не в крупных проектах уровня AOSP или не в крупно-ответственных проектах уровня проксей клаудфлары.
— Польза раста в крупных проектах не показана.

Вы не уважаете собеседников, тролля их глупостью, поэтому я не буду уважать вас и спрошу прямо: вы идиот? Вы не можете поддерживать контекст больше, чем на 10 минут или две реплики? Или какая вообще может быть причина человеку высказывать нечётные реплики в диалоге выше?

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

V не обязан быть на стеке. В какой момент на стеке оказывается шаблонный аргумент здесь?

template<int V>
auto foo() { ... }

foo<42>();

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

Я не помню точную формулировку в стандарте, но это UB с типами вроде intов и не UB с class non-type template parameters'ами (что и является C++20-фичей, и что вообще оправдывает существование этой функции — лично мне такое было нужно ровно для class NTTP).

Например, этот код компилируется (что означает, что там нет UB), а если раскомментировать, то нет:

template<auto V>
constexpr const auto& make_static()
{
  return V;
}

struct S
{
    int val;
};

constexpr int foo()
{
    constexpr auto& v1 = make_static<S { 42 }>();
    //constexpr auto& v2 = make_static<42>();
    return v1.val;
}

static_assert(foo() >= 0);

Информация

В рейтинге
1 563-й
Зарегистрирован
Активность