LINUX.ORG.RU

defer в C быть!

 ,


0

9

Привет, ЛОР!

Как я писал три года назад, в стандарт языка Си было предложено добавить выражение defer, выполняющее функцию или блок кода по выходу из области видимости, где оно было объявлено.

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

При этом, defer почти наверняка не будет добавлен в C++, так как его использование будет конфликтовать с другими частями этого языка.

Ссылка на пост в блоге автора: https://thephd.dev/c2y-the-defer-technical-specification-its-time-go-go-go

Спецификация: https://thephd.dev/_vendor/future_cxx/technical%20specification/C%20-%20defer/C%20-%20defer%20Technical%20Specification.pdf

Ответ на: комментарий от gaylord

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

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

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

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

Што? НДС уходит в Москву, за исключение городов федерального значения.

gaylord
()

Давно уже думал о том, что нечто подобное в языке нужно.

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

именно гонять фуры или газели.

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

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

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

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

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

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

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

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

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

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

А как связаны фермеры и Ozon? Это же не продуктовая сеть. Я вот купил себе клевые штаны из Ебурга, и никогда в жизни бы их не купил если бы не Ozon.

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

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

но Озон ничем не отличается от «диаспор» и просто накручивает свои цены поверх цен поставщиков. вот и всё. и всё централизовано в нерезиновске и все финансы стекаются туда. а это плохо.

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

но Озон ничем не отличается от «диаспор» и просто накручивает свои цены поверх цен поставщиков. вот и всё. и всё централизовано в нерезиновске и все финансы стекаются туда. а это плохо.

Так НДС из регионов туда в любом случае стекается. Проблема в прОклятой налоговой системе и нет вообще никакой разницы, где магазин-то находится – налоги он платит в Москву, если мы не говорим про СПб или Севастополь.

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

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

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

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

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

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

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

У меня даже рюкзаки были локального производства, пока один не прожгли кто-то из соседей по партии.

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

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

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

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

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

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

Си не будет за тебя ничего делать. в этом и проблема нубов: они привыкли к тому, что за ними мама жопу подтирает, а тут никто не подтирает

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

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

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

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

у сишников нет проблем с Си

В ядре есть. Регулярные. Разработчики крупнейшего опенсурсного сишного проекта – не сишники? Кто тогда сишники? Покажи нам репозиторий,пожалуйста.

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

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

Или наоборот. Когда я использую стандартную функцию, а компилятор заменяет её вызов на конкретный код. Хотя второй случай можно назвать оптимизацией inline function.

Но это, конечно, проблема конкретных компиляторов, а не самого языка.

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

Разработчики крупнейшего опенсурсного сишного проекта – не сишники?

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

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

и да, ты опять съехал с темы и ушёл от вопроса про примеры. давай конкретику, а не пространные рассказы «а вот в ядре...».

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

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

Большинство программистов на C – люди, программирующие за деньги. Если мы уберем их из «трушных сишников», там останется с десятком опенсурсных проектов (где регулярные проблемы с памятью).

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

Так в этом и проблема C. Ты отвлекся и получил RCE. В этом основная суть претензий к языку – стоит забыть какую-то мелочь, как ты получаешь опасный и трудноуловимый баг. Где в этом благость-то?

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

такого в Си точно нет. ты попутал с чем-то. ничего лишнего компилятор (точнее, линкер, который он вызывает) не линкует. никогда. пока ты сам ему не укажешь, что именно линковать.

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

такого в Си точно нет. ты попутал с чем-то. ничего лишнего компилятор (точнее, линкер, который он вызывает) не линкует. никогда. пока ты сам ему не укажешь, что именно линковать.

Да нет, он прав, gcc так делает.

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

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

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

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

Вот тебе кусок из musl:

    # Check for options that may be needed to prevent the compiler from
    # generating self-referential versions of memcpy,, memmove, memcmp,
    # and memset. Really, we should add a check to determine if this
    # option is sufficient, and if not, add a macro to cripple these
    # functions with volatile...
    # tryflag CFLAGS_MEMOPS -fno-tree-loop-distribute-patterns

GCC заменяет куски кода похожие на memcpy() вызовом memcpy() из stdlib. Это известная шляпа, её чинили буквально везде, где нет libc. Как ты 30 лет программировала на C и про это не знаешь, лол.

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

ну давайте уже примеры. я за 30 лет ничего подобного не видела. хотя конкретно gcc юзаю последние лет 20, наверное, потому что пишу под Linux.

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

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

Вот тебе ссылка на багтрекер GCC, лол: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105311

However, the gcc still call memset with the code below:

#include <stdint.h>
struct Page_Table_Page
{
    uint64_t pts[511][512];
};

void init_ptp(struct Page_Table_Page*const ptp)
{
    *ptp=(struct Page_Table_Page){{{0}}};
}

Вот опции:

gcc-12 -O3 test.c -S -fno-tree-loop-distribute-patterns -fno-builtin-memset -fno-builtin -nodefaultlibs -nostdlib -ffreestanding

Ты точник сишник?

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

вопрос в том, что значит «похожие» и зачем тебе ручное копирование памяти, кроме memcpy?

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

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

вопрос в том, что значит «похожие» и зачем тебе ручное копирование памяти, кроме memcpy?

Нет, секундочку, ты только что сказала что компилятор такого не делает. Так делает или нет?

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

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

Вот тебе опции выше, там все отключено. И этот баг в GCC минимум с версии 4.

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

точно. и 12-й gcc я не собирала. мне он не нужен пока. я не стану всю систему пересобирать ради каждой новой версии.

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

точно. и 12-й gcc я не собирала. мне он не нужен пока. я не стану всю систему пересобирать ради каждой новой версии.

Этот баг есть в любом GCC.

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

10-й не делает. точно. если 12-й делает, то я это отключу. но пока я даже не смотрела его код.

и да, это не сишка что-то делает. это конкретный компилятор. более того, конкретная версия конкретного компилятора. проблема не в Си.

в 11-м (который я собирала ради эксперимента), я отключала лишние тупые выхлопы с «предположениями». мне не нужно, чтобы компилятор что-то «предполгагал». мне нужно только сообщение о файле и строке, на которых он споткнулся, если что-то не смог распарсить.

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

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

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

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

10-й не делает. точно. если 12-й делает, то я это отключу. но пока я даже не смотрела его код.

Судя по баг-репортам делает даже четвертый :))))

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

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

Ты буквально десять минут назад говорил что компилятор такого не делает:

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

Твои слова или нет?

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

причин писать «похожие на memcpy» куски кода нет.

Отсутствие libc? Реализация, собственного говоря, libc? Потому что все репорты идут в контексте «у нас нет libc, мы про это сказали, а GCC все равно генерит срань».

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

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

но это не тема про проблемы Си. это всё проблемы конкретного компилятора, причём какие-то очень специфические.

Iron_Bug ★★★★★
()

defer в C быть!

ту быть ор нот ту быть!

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

и, заметь, кернел компилится тем же gcc уже десятки лет и никто там не жаловался

Жаловались, баги заводили.

ты можешь отключить линковку стандартных библиотек, кстати.

Ты не смогла прочитать опции компилятора, что я привел выше? Давай попробуем ещё раз:

gcc-12 -O3 test.c -S -fno-tree-loop-distribute-patterns -fno-builtin-memset -fno-builtin -nodefaultlibs ***-nostdlib*** ***-ffreestanding***
gaylord
()
Последнее исправление: gaylord (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

но это не тема про проблемы Си. это всё проблемы конкретного компилятора, причём какие-то очень специфические.

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

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

и через их руки проходит почти вся наличность, что на руках населения.

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

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

это вообще никак не описывается в языке

Потому что язык описывает алгоритм, а не низкоуровневые аспекты его работы. И теоретикам, которые ничего кроме формального описания языка не знают, делать в Си нечего.

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

Потому что язык описывает алгоритм, а не низкоуровневые аспекты его работы. И теоретикам, которые ничего кроме формального описания языка не знают, делать в Си нечего.

Тут либо «нет неявного поведения» либо «свои выравнивания сами угадывайте, а то в панику упадет». Усидеть на двух стульях не выйдет.

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

То что -O3 сломанный и так известно. Хуже того, на моём коде он никогда не оказывался быстрее чем -O2.

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

То что -O3 сломанный и так известно. Хуже того, на моём коде он никогда не оказывался быстрее чем -O2.

Причем тут O3? Это и без O3 есть.

gaylord
()
Последнее исправление: gaylord (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)