В этом ИТТ мы можем объяснить базовые и продвинутые концепции языка, и программирования в целом, поможем вкатывающимся, подскажем что выбрать для веба, игр или, прости Абу, блокчейна.
Вот как скриптовый язык - вполне себе ничего, он разрабатывался вебмакакой, его уровень - заменить жс в среде сиси-трансов. Пусть себе играются, пишут скриптики какие-нибудь, JSON парсят. Может какой сервер прикольный напишут, который никто не будет использовать.
Но почему-то крашенные трансы хотят раст в ядро засунуть. К чему это всё? Вызывает вопросы серьёзные.
>>3125659 Никогда. В ядре ничего не написано на расте и не будет написано никогда, даже драйвера.
>>3125690 В смысле причем трансы? 70% людей кто работает над коре либой раста - трансы. У них там круговая ебля, они всех гетересексуалов двинули из разрабтки ядра. В компиляторе та же проблема, кста.
Анончики, подскажите пожалуйста. Вот был у меня код как на пикриле 1 и всё было хорошо, но захотелось переделать и сделал как на пикриле 2. Теперь раст говорит "cannot return value referencing temporary value" (пиркилы 3, 4). Я понимаю в чём проблема кода на пикриле 4, но ведь я в пикриле 2 возвращаю ссылку не на что-то что было создано внутри метода, а на часть структуры которая продолжит существовать и после того как метод вернёт значение? Я думал что может быть проблема в том что после того как метод вернёт ссылку кто-то сможет мутировать структуру, вызвав переаллокацию содержимого HashMap и таким образом возвращённая ссылка будет инвалидирована, но ведь борроу чекер не должен позволить мутировать структуру пока существует живая ссылка на её часть...
Я смотрю что ".read().await" возвращает " RwLockReadGuard<'{error}, HashMap<String, Room>>" и, видать, возвращаемая ссылка привязывается не к HashMap которая в структуре лежит, а привязвается к "RwLockReadGuard" и инввалидируется когда этот самый гуард дропается в конце метода. Но это получается что я могу использовать ссылку только пока живой гуард? А как тогда разбить код на два метода как у меня на пикриле 2?
>>3126032 Суть read() в RwLock в том, чтобы заблокировать вызывающий тред, до тех пор пока все писатели не закончат свою работу. После этого уже сколько угодно читателей могут работать с получившимся значением, пока RwLockReadGuard существует. Ты не можешь передать ссылку на его содержимое куда-то ещё, иначе как RwLock сможет выполнять свои гарантии? Т.е. представь что это было бы возможно, ты передал ссылку на внутреннее содержимое, RwLockReadGuard был дропнут и тут в другом треде вызывается write(). Во write() будет проверка, что никаких других читателей и писателей активных нет, поэтому он со смелой душой начнёт менять внутреннее значение. А в первом потоке у тебя ссылка, кровь, кишки, распидарасило.
Хз как лучше тебе сделать, у меня нет должного опыта. Попробуй Room ещё в один Arc обернуть что-ли, лол, и возвращать клон Arc'a.
>>3125702 А в других языках трансов нет? Опомнись. 2024 год на дворе, трансы захватели все айти-сообщества. > Доёбываешься к расту из-за трансов > В твоём любимом языке корлибу тоже пишут анальники, а натуралы сидят тихо, не отсвечивают, чтоб не заканселили.
Почему этот код компилируется? Ведь владение строкой передается в первый принтлн. Но он компилируется! Заранее спасибо
Алсо ответ чатгпт
В вашем примере переменная s1 владеет строковым объектом String::from("hello"). Когда s1 передается в функцию println!, она делает это по значению, а не по ссылке. Это означает, что происходит перемещение (move) владения с s1 внутрь функции println!. После этого первый вызов println! забирает владение строки, и переменная s1 больше не может быть использована после этого вызова. Поэтому попытка использовать s1 во втором вызове println! вызовет ошибку компиляции, так как она больше не владеет строкой.
Чтобы позволить s1 использоваться после передачи в println!, можно использовать клонирование строки
>>3126284 Это макрос, который использует built-in'ы компилятора, им насрать на правила языка. Считай, что в нём происходит неявная передача по ссылке, т.е. заимствование.
>>3126322 понял ответ в макросах, буду читать дальше - пойму спасибо!
Еще тогда вопрос: а чем собственно владение отличается от деструктора в C++? И там, и там при выходе вызывается магическая функция (дроп или деструктор) при выходе из скоупа. Пока что для себя ответил: компилятор раста не даст в двойное удаление одного значение, но это все или есть еще профити?
>>3126348 Ещё не даст двойную запись запись + чтение в том числе в однопоточном коде, например, когда ты итерируешь по вектору, то в этот вектор нельзя втавлять/изымать элементы.
>>3126348 На мой взгляд принципиальное отличие — это дефолтное действие с данными когда ты их "передаёшь" куда-то (например как аргумент в функцию или банально связываешь с новым именем). В плюсах исторически — это операция копирования. Она инстинктивно предполагается человеком и вполне удобна в большинстве случаев, однако как показала многолетняя практика является источником многих проблем. В современных плюсах появилась move-семантика, но во-первых всё остальное легаси языка никуда не делось, а вместе с ним и поле для ошибок, а во-вторых оно чуть-чуть менее эффективно чем в расте (имхо конечно, я на эту тему спорил пару тредов назад с каким-то растохейтером, если инетересно можешь полистать, там был небольшой разбор стандартной библиотеки плюсов вплоть на дизассемблирования насколько я помню). Сам концепт RAII одинаков, верно.
>>3126367 >двойную запись >запись + чтение можно подробнее? не очень понял
>>3126368 так вот что дает эта мув-семантика? Я так понимаю, что мув-семантика необходима для поддержания работы владения (2-ое правило гласит, что данными может владеть только одно значение, не больше). А какие преимущества дает владение перед деструкторами? Для себя выделил только предотвращение от ошибки двойного освобождения
>>3126377 >А какие преимущества дает владение перед деструкторами? А какое преимущество у тёплой одеждой перед оранжевой? Это некорректный вопрос. Деструкторы есть в расте, просто необходимо реализовать трейт Drop для своего типа. К схеме владения они не имеют отношения.
>>3126436 >Тогда так: зачем была введена концепция владения? Какую проблему она решает? Давай так, ты видимо ждёшь что я начну приводить какие-то конкретные примеры, но это означает пересказ всего растбука и растономикона тут. Схема владение влияет очень на многое в дизайне языка. Вот например, вопрос >>3126032. Там компилятор не даёт анону выстрелить себе в ногу.
В целом >>3126439 правильно сказал, но не упомянул одну важную деталь. Это способ проверить на этапе компиляции, что программа корректная. Возможно не единственный, возможно не самый оптимальный или удобный, но оно работает.
>>3126505 Это вопрос в контексте владения или в целом? Видимо в целом, потому что выходы за границы явно не имеют отношения к владению. Хз, мне кажется вторая мощная вещь в расте — это система типов и сопоставление образцов (pattern matching), которые полностью контролируются компиляторм. Ну и в целом отслеживаются какие-то вещи, которые обычно служат источником уязвимостей. Например, был вопрос про println!, в отличие от сишного printf, в нём невозможно организовать атаку некорректной форматной строкой, потому что а) форматная строка обязана быть строковым литералом б) проверка аргументов будет на этапе компиляции.
>>3126544 Ну да. Тебе как программисту не нужно контролировать время жизни руками либо полагаться на рантайм. Если получилось скомпилировать программу, то оно как-то само всё делается, причём максимально эффективным способом.
>>3126980 На куче не может быть zero cost памяти. И в расте всё тоже в рантайме работает. Разница со смарт поитерами только в наличии боров чекера - в крестах ты можешь взять ссылку на смарт-поинтер и проебать объект, по производительности разницы никакой нет.
>>3126986 >>3126987 Речь о том, что концепция владения относится не только к умным указателям.
Соре, но пожалуй я больше в этой специальной олимпиаде участвовать не буду. В прошлый раз мне доказывали, что владение и мув это одно и то же. В этот раз, что владение и умные указатели это одно и тоже. Сами вбрасываете, сами и доказывайте.
>>3126462 >но это означает пересказ всего растбука а можешь кратко для примера пару кейсов без расписывания? Мне просто понять направление и масштабность
Читаю растбук и там как бы вся книга - последствия введения концепции владения, а не профиты
>>3126995 Нет, классический пример с итерацией по контейнеру анон уже приводил >>3126367. Есть два места, где мы обращаемся к вектору как к структуре данных — проверка что итератор достиг конца вектора в конце шага цикла и изменение размера контейнера в теле цикла. Получается один читатель и один писатель существуют одновременно. К чему это приводит, сам видишь.
>>3126997 Про умные указатели. В плюсах это unique_ptr и shared_ptr + weak_ptr. Прямые аналоги в расте это Box и Rc. Почему-то чел выше считает, что они заменяют концепцию владения, я хз почему.
>>3126996 Концепцию владения нужно рассматривать вместе с другими основными механизмами управления памятью в расте — заимствования и времени жизни, потому что без них программы писать можно конечно, но грустно и не очень эффективно для языка, предназначенного для системного программирования в том числе. В целом, этим решаются базовые проблемы управления памятью, которые опять же >>3126367 обозначил: - нулевые или висящие ссылки - двойное удаление - пропущенное удаление - гонки
Тебе похоже непонятно что такое гонка, ну так вот пример с вектором >>3127194 это она и есть.
Это как бы прямые результаты. Но косвенно действительно очень много последствий. Чтобы далеко не ходить за примером посмотри на >>3126032. Я пытался объяснить поведение компилятора в >>3126097. Вкратце, компилятор не дал некорректно воспользоваться структурой данных и сделал это благодаря владению и заимствованию.
>>3127194 Откуда вот такие дебилы лезут? Какой код написал, так он и работает. >>3127227 > Тебе похоже непонятно что такое гонка Это ты не знаешь базовых понятий. Какая нахуй гонка в однопоточном выполнении.
>>3127209 > Почему-то чел выше считает > я хз почему Это латентный педик, который ИТТ "гоняет трансов". Вместо того, чтобы признаться себе в том, что ему нравятся хуйцы. В связи с таким сложным подавлением своих желаний, дурачок объявил войну "пидоrustу" и срёт здесь по КД уже который тред.
>>3127317 >К неумению писать код? >>3127323 >Откуда вот такие дебилы лезут? Какой код написал, так он и работает. Вот-вот, раст тем и хорош, что не нужно думать обо всех подводных камнях (и высокомерно называть это умением писать код либо переходить на оскорбления). Тебе просто не дают возможности сделать такую и другие подобные ошибки. Я лично люблю когда машина делает за меня рутинную работу.
>>3127323 >Это ты не знаешь базовых понятий. Какая нахуй гонка в однопоточном выполнении. >>3127328 Что шаблон порвался? Ну назовите это как-то по другому или дополните пример многопоточностью, где ваша фантазия? Писал так, чтобы было понятнее о чём речь. Я если честно принципиальной разницы не вижу. В одном потоке можно даже сдуру дедлок сделать. Суть проблемы не меняется от количества потоков, только сложность отладки.
>>3127395 >не нужно думать обо всех подводных камнях В пидорасте тоже полно неявной хуиты как в плюсах, смысл одно говно заметь другим аналогичным говном? >Ну назовите это как-то по другому Давай мы тебя не будет мужиком называть, а по-другому. >Я если честно принципиальной разницы не вижу Дак ясно всё с тобой, даунёнок.
>>3127403 >Дак ясно всё с тобой, даунёнок. Даунёнка ты в зеркале видишь, дегенерат. Пока ты только в лужу пердишь, бросаясь голословными утверждениями.
Кстати, в этой главе авторы не слова не упоминают про многопоточность, хотя это безусловно самая неприятная в отладке ситуация. Местным обитателям потоки видимо кажутся какими-то магическими сущностями наделёнными особыми свойствами. На деле это просто абстракция над CPU, которую обычно реализуют в ядре и оборачивают в виде удобных библиотек для прикладных программистов. Но ничего не мешает тебе самостоятельно сделать подобную абстракцию в своей программе и запускать её на одном ядре. Кроме твердолобости конечно, лол.
>>3127618 ну вот там я и читал и объяснение Data races еще больше запутало - эту тему можно было как-то больше разжевать, чтоб раскрыть что именно под этим понимается. Там есть намек на многопоточку (similar to a race condition), и это меня смутило (вроде намек есть, а прямых слов нет)
>>3127652 Ты создал строку и начал асинхронную запись в файл типа как здесь: https://learn.microsoft.com/en-us/windows/win32/fileio/synchronous-and-asynchronous-i-o И не подождав на ивенте решил эту строку затереть. А в это время контроллер твоего SSD читает твою память и записывает какой-то мусор. Вот и получается, что никаких потоков, по крайней мере явно, ты не создаёшь, а гонка есть.
Или ты подписался на какой-то коллбек и забыл отписаться вовремя. А потом этот коллбек триггерится и расхуяривает тебе всю кучу. Код полностью однопоточный и синхронный, но искать ты это будет весь день.
>>3127646 >>3127652 Слушай, ну если удобнее думать про многопоточность в этом контексте, то так и делай, ничего плохого в этом нет на самом деле. Я сам именно так себе это и представлял, когда читал растбук. Просто когда начинаешь самостоятельно что-то пробовать писать, то приходит осознание, что это относится не только для многопоточности.
Раскомментируешь 111 строку, получишь классический дедлок, вызванный неправильным неправильным порядком блокирования ресурсов (они всегда должны блокироваться в одном и томже порядке).
Я хоть и назвал тут всё терминами связанными с многопоточностью для облегчения понимания, но по сути тут в одном нативном потоке обрабатывается две очереди сообщений. При этом сообщения управляют блокировкой некоторых ресурсов. Только не спрашивай меня, зачем в одном нативном потоке обрабатывать две очереди, я с таким в жизни никогда не сталкивался, поэтому и написал "сдуру". Ну можно представить, что какие-то команды поступают с двух разных сокетов, данные с которых поток ожидает через select() если есть его аналог в расте. Наверное это больше на жизнь похоже.
>>3127688 Что, шаблон продолжает рваться и трещать, дебилушка? Я так-то под эмбед пишу на сях, работал с embOS, сейчас проект на FreeRTOS. Так вот, там нет ни потоков, ни процессов, сюрприз. Вместо них таски. Но почему-то есть параллелизм со всеми своими проблемами. На одноядерном процессоре, кстати.
>>3127672 >коллбек триггерится выполняется в отдельном потоке? Обычно же берется поток из пула. Ну то есть для работы в юзерспейсе обязательно нужен поток
>>3128027 Да есть конечно. Вот классное видео, если интересно по быстрому глянуть, в котором объясняется как поморгать диодом на голом железе: https://www.youtube.com/watch?v=jZT8APrzvc4 Есть куча проектов всяких RTOS, чтобы не писать всё в одном unsafe: https://arewertosyet.com Мне ещё попадались какие-то коммерческие разработки. Вообще был в своё время интересный стэнфордский курс CS140e, в котором авторы обучали расту на примере разработки своей ОС: https://cs140e.sergio.bz Видео, кстати похоже писал чувак, проходивший этот курс.
>>3127672 >И не подождав на ивенте решил эту строку затереть. А в это время контроллер твоего SSD читает твою память и записывает какой-то мусор. Это не так работает, упрощённо: 1) ты заполнил буфер в ядре своим юзерспейсовым говном, тебе вернули управление 2) ты (твой планировщик) опять сделал системный вызов со своим юзерспейсовым говном, тебе вернули ошибку EAGAIN, потому что буфер в ядре ещё занят предыдущим твоим говном 3) планировщик в ядре вызвал старт драйвера ссд и тот стартовал дма передачу 4) .. 5) тебе вернули управление .. 6) контроллер ссд дёрнул прерывание/дма часть выставила флаг о завершении передачи -> ядро перемещает указатель в буфере (высвобождает часть), на следующем системном вызове твоё говно скопируется в освобождённую часть и процесс повторится Это всё если ты не используешь какой-нибудь метод эвентов по типу селектов/полл/еполл, в случае с последними всё ещё проще, какая тут может быть гонка?
>>3128693 Во-первых, это никак не следует из доков. Кто мешает запинить память и сразу DMA-шить в буфер юзера? Во-вторых, пусть ты сделал два асинхронных вызова в один и тот же буфер и потом позвал WaitForMultipleObjects, и оба ивента завершились одновременно. 1. Что будет в буфере? 2. Куда скопируется результат, если буфер уже дропнут или переаллоцирован?
>>3128761 Да, и? Я сделал два неблокирующих чтения в один буфер и стал ждать на ивентах. Получаем гонку в формально однопоточной приложухе. Бинго? То же самое можно получить в какой-нибудь куде.
>>3125439 (OP) аноны, остановился в изучении на теме "модули" и возник вопрос: а есть ли в природе пример, где модуль приватный? То есть, если есть код в приватном дочернем модуле - он сам не вызовется, значит его надо вызывать из родительского модуля. Но чтобы его вызвать из родительского - надо этот дочерний сделать публичным. Итого: все модули должны быть публичными?
>>3129010 > а есть ли в природе пример, где модуль приватный? Да, есть пример в астрофизике: чёрная дыра, собсна. Полностью приватна от всей остальной Вселенной. А смысл?
>>3129016 так в том-то и вопрос: а зачем делать модули по умолчанию приватными? Зачем вообще вводить для модулей концепцию приватности/открытости? Чтоб перед каждым модулем писать pub?
>>3129021 как бы и читаю - вот >>3129010 >остановился в изучении на теме "модули" и возник вопрос либо в другой главе (что сомнительно), либо ты не понял мой вопрос
>>3129193 Ты интересуешься растом и мк - этого достаточно Расскажи в двух словах, если сможешь, что за RTOS такие, для чего они, как использовать. Я пока на интуиции могу сказать, что это такой код, который подключается как библиотека, используется как фреймворк, где ты вкрыпываешь свой код в точки расширения. Сам по себе предоставляет абстракции типа потока, семафороф разных. Компилится с твоим кодом в один бинарь и заливается на мк. Где прав/где фигню нагадал? Чем можешь дополнить? Еще интересует, но предположений нет: поддерживают ли эти оси сон? Ну то есть, если задачи нет - он уходит в сон, чтоб мк потреблял по минимуму или ему приходится все равно поддерживать работу rtos? Второй вопрос: я могу писать на расте для есп32 (лежит такая, как-то игрался)? Или раст поддерживают только определенные мк? Ну то есть там же разные процессоры, разные архитектуры, под какие архитектуры может компилить раст? Или обязательно еще должна быть инструментальная поддержка пот производителя? Алсо, когда игрался с есп, где-то видел какой-то конфиг с частотами там и все такое. Это как и куда задавать, если писать на расте? Буду рад, если сможешь ответить хоть на что-то
>>3129234 > ты не понял мой вопрос >>3129236 > ты тоже не понял мой вопрос >>3129019 > зачем делать модули по умолчанию приватными? Внутри одного файла вышестоящий модуль может обращаться к нижестоящему модулю, игнорируя параметры доступа, так что модуль приватен для всех, кроме модуля в том же файле. Не?
>>3129016 >>3129021 >>3129132 >>3129236 В общем, я нашел ответ на свой вопрос: смысл в приватных модулях есть, так как к нему имеют доступ братья (элементы одного модуля)
>>3129248 >Где прав/где фигню нагадал? Чем можешь дополнить? Да в в целом всё верно. Ещё могу сказать, что обычно вендор железки предоставляет Board Support Package (BSP). Это такой пакет из ОС и драйверов, с примерами. Берёшь какой-нибудь и начинаешь его под свою задачу адаптировать. Но конечно никто не мешает выбросить это всё и сделать руками, если конечно имеется вся необходимая документация.
>Еще интересует, но предположений нет: поддерживают ли эти оси сон? Ну то есть, если задачи нет - он уходит в сон, чтоб мк потреблял по минимуму или ему приходится все равно поддерживать работу rtos? Да есть конечно. Но ты сам явно указываешь когда уйти в состояние сна. При этом нужно не забыть самому усыпить всю периферию ну и сделать какие-то действия, которые требуются в твоей конкретной системе (таски там засаспендить например, или обнулить какой-нибудь контекст).
>я могу писать на расте для есп32 да >Ну то есть там же разные процессоры, разные архитектуры, под какие архитектуры может компилить раст? https://doc.rust-lang.org/rustc/platform-support.html >Алсо, когда игрался с есп, где-то видел какой-то конфиг с частотами там и все такое. Это как и куда задавать, если писать на расте? Хз что за конфиг ты имеешь в виду. Если не с нуля писать будешь, то думаю найдёшь аналоги. Если с нуля, то читать документацию по железу.
>>3129723 Спасибо, анон! Но еще пара вопросов осталась >Это такой пакет из ОС и драйверов Драйверов? А что за драйвера и что они делают? >указываешь когда уйти в состояние сна А что для этого надо? Дергать код, который в референс мануалах к платам или ос предоставляет какуют-то абстракцию? И да, что происходит после пробуждения? Типа рестарт и запуск по новой или пытается восстановить контекст и продолжить работу с места, который останвился? Если второе, то кто за это отвечает: мк, ос?
Как же я заебался. Я просто хочу передать референс на синглтон в ансихронный tokio::spawn блок. Но говнине это очевидно не нравится (unsafe не помогает), и похоже единственный вариант пофиксить это через Мьютекс. Но есть одно но, синглтон делает веб запросы и при любом локе застревает на секунду, а то и больше. Трейта Copy у объекта нет, async move посылает меня нахуй, я просто не знаю что мне делать
>>3129756 >Драйверов? А что за драйвера и что они делают? Мммм, драйвер — это код, управляющий каким-нибудь периферийным устройством. >А что для этого надо? Дергать код, который в референс мануалах к платам или ос предоставляет какуют-то абстракцию? Вручную — это когда ты пишешь всякие значения в разные управляющие регистры процессора и других подключенных устройств. Но обычно есть какой-то HAL (hardware abstraction layer), собственно набор тех самых драйверов, который идёт в составе того самого BSP и там уже всё это написано для тебя. ОС не предоставляют таких интерфейсов. Как ты говорил, это скорее фреймворк для построения прошивки. >И да, что происходит после пробуждения? Типа рестарт и запуск по новой или пытается восстановить контекст и продолжить работу с места, который останвился? Если второе, то кто за это отвечает: мк, ос? Да как сам напишешь, так и будет. Только выключение/включение с восстановлением контекста называется гибернацией, а сон — это перевод процессора и периферии в энергосберегающий режим, из которого они выходят по таймауту или по какому-нибудь сигналу. Работа прошивки в таком случае не прекращается, очевидно.
>>3131084 >Но есть одно но, синглтон делает веб запросы и при любом локе застревает на секунду, а то и больше. Не понял, а чего ты хочешь? Чтобы можно было из разных потоков его дёргать одновременно и играть в русскую рулетку, когда эта конструкция развалится?
>>3131084 Ну если тебе мутировать объект не нужно то мб RwLock вместо мутекса взять? Сколько угодно читателей можно будет иметь одновременно. Ну или ещё может как вариант во время когда ты держишь лок просто дать команду синглтону чето сделать (послать запрос) и дать ему колбек который дёрнуть когда будет ответ и сразу по фасту съебаться из критической секции и снять лок. Или ещё может не давтать колбек а давать команду синглтону сделать запрос и обновить своё внутренне состояние когда будет готово и после отдачи команды снимать лока и на вызывающей стороне изредка поллить синглтон на предмет готовности результата, ну либо может не поллить а сделать через кондвар какой-нить - типа вызывающий код блокируется на кондваре а синглтон обновляет кондвар когда ответ готов
>передать референс в ансихронный tokio::spawn блок Ясен хуй не нравится, это recipe for disaster потому что хуй знает будет ли твой референс валиден когда его величество асинхронный рантайм соизволит начать выполнять таску. В std::thread есть скоупед потоки для этого, а в токио хз. Как ты это ансейфом решать хотел? Делать сырой указатель из референса? Ну так проблема никуда не девается если ты не на 100% уверен что он будет валиден когда будешь его разименовывать его
>>3131084 Раз это синглтон, не проще мувнуть его в отдельный тред, а запросы через каналы mpsc буферизированные посылать? Где-то видел такие, которые и в синк и асинк могут одновременно.
>>3131095 >есть какой-то HAL Он для каждой борды свой? То есть не универсальный, а производитель создает свой со своим набором АПИ?
>>3131095 >Да как сам напишешь, так и будет А по умолчанию? Ну вот я ввел в сон, потом таймер стригернул - что дальше? Что делает мк? Какие инструкции, с какого месте?
>>3131095 >Работа прошивки в таком случае не прекращается А что ты под этим имеешь в виду? Что все контексты сохранены, что все выполняется? Просто я читал про разные виды сна когда-то по-диагонали, и там процессор чуть ли не выключался, в работе оставался таймер. То есть ты хочешь сказать, что при пробуждении по таймеру, например, автоматически платой в кэш загрузится все то, что было до сна, стэки тоже и процессор просто продолжит оттуда, откуда остановился? Не очень понимаю как это в коде выглядит... Он продолжит выполнять все то, что идем после вызова sleep()?
>>3131135 Если честно не знаю как это должно работать, потому что запрос у меня блокирует поток пока не резолвнется. Поэтому и раскидал параллельные запросы по потокам. Сделал через RwLock как тут советовали, в принципе нормально, спасибо анонам
>>3131138 >Он для каждой борды свой? То есть не универсальный, а производитель создает свой со своим набором АПИ? Да есть конечно попытки сделать что-то универсальное. Но лично я отношусь к этому как кроссплатформенной разработке десктопных приложений. Прекрасная утопия. Для несложных проектов наверное применимо, но как только что-то посложнее делаешь, то приходится жрать, что китайцы дают в проприетарном виде без доков... >А по умолчанию? Ну вот я ввел в сон, потом таймер стригернул - что дальше? Что делает мк? Какие инструкции, с какого месте? Ну вот следующую инструкцию и продолжит делать, после обработки прерывания, которое пробудило устройство. Но от железки зависит конечно в первую очередь, сложно говорить за все. Возможно может потребоваться нетривиальное восстановление контекста, которое слишком долго делать в обработчике прерывания. >Просто я читал про разные виды сна когда-то по-диагонали, и там процессор чуть ли не выключался, в работе оставался таймер. Это действительно так. В популярном кортексе например их парочка и вендоры ещё бывают свои добавляют. Чем экономичнее режим тем меньше он отличается от полного выключения. >То есть ты хочешь сказать, что при пробуждении по таймеру, например, автоматически платой в кэш загрузится все то, что было до сна, стэки тоже и процессор просто продолжит оттуда, откуда остановился? Как писал, зависит от режима и железа. Если говорить про тот же кортекс, то обычно ничего там никуда во сне не девается. Т.е. оперативка хранит содержимое, регистры тоже. Обработали прерывание и вперёд, дальше молотить.
Вообще, я если честно слабовато эту тему знаю. Сейчас порылся по коду проекта, над которым сейчас работаю, так там WFI (инструкция, которая переводит в режим сна) есть и в HALе и в ядре RTOS. Напиздел я получается, насчёт того что в ОС не бывает. Я правда глубоко не стал лезть, используется ли у нас где-то сон из FreeRTOS. Возможно там разница как раз в выборе режима, типа FreeRTOS переводит проц в обычный sleep при необходимости, например, когда все таски заблокированы. Deep sleep из HALа точно ручками дёргаем.
>>3125439 (OP) Аноны, сейчас очень сонный, возможно пишу бредовый вопрос, но изучая раст, тестил разный свой код, проверял идейки и нагенерил вот это: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=807d460d9c7a5d3d94f3bd43449927ed Объясните мне, плз: правильно ли я понимаю, что тут одной строкой владеют два объекта? Интуиция подсказывает, что такого быть не может, так как по правилам владения раста владеть объектом может кто-то один, но я тут вижу одну строку и ДВЕ переменные b, которые владеют одной строкой Помогите решить внутренний спор
>>3132418 Основной проект на С, но есть небольшие сопровождающие разработки на расте (не под микроконтроллеры). Сам раст ковыряю для общего развития пока, очень интересный и кайфовый язык.
>>3132421 >>3132426 Вкину свои 5 копеек, вдруг кому-то другому будет интересно. В расте есть механизм pattern matching, который тут применяется. Довольно мощная штука, которая используется не только в ветках match, а по сути при любом объявлении переменной. Она позволяет деструктуризацию образца. При этом владение данными передаётся по общим правилам раста, для чего используются ключевые слова ref и mut, например:
if let Foo(bar) = foo {... // <- передача владением if let Foo(ref bar) = foo {... // <- заимствование по неизменяемой ссылке if let Foo(ref mut bar) = foo {... // <- заимствование по изменяемой ссылке
Таким образом в первом match у тебя a связывается по ссылке, как и b и таких алиасов может быть в данном случае сколько угодно. А во втором match уже происходит передача владения значением сначала в a, а потом в b.
> The vulnerability, which carries a perfect 10-out-of-10 CVSS severity score, is tracked as CVE-2024-24576. It affects the Rust standard library, which was found to be improperly escaping arguments when invoking batch files on Windows using the library's Command API – specifically, std::process::Command. Сперма.
>>3134297 > критический баг в std Никогда такого не было и вот опять. Прям чувствую безопасность. > improperly escaping arguments Там вообще ебучий цирк с конями в std под виндой, как будто студенты писали. Например тот же принт, конвертирующий два раза строку из utf-8 в utf-16, вместо вызова SetConsoleCP. Это сразу было понятно, что снизив уровень входа с помощью "безопасности", пришедшие питонисты начнут писать такое забагованное говно, что нейросети позавидуют.
>>3134687 > В API винды поддержка utf8 появилась примерно вчера XP вчера появился? Ну ладно. CP65001 в консольке как минимум с Висты работает, в XP он тоже был, но я не возьмусь утверждать что cmd.exe корректно шрифты рендерил. > работает через жопу Если речь про вывод в консольку, то он работает как часы, никаких проблем нет. Проблемы могут быть только если ты при включенном CP65001 станешь выводить UTF-16 туда. Претензия к реализации раста в том что у него всё к UTF-8 прибито гвоздями. То что он в рантайме каждую строку конвертит - это пиздец костыли. Я ещё понял бы если он поддерживал UTF-16 строки и можно было бы без конверсии их использовать, но ведь нет.
Чтобы винда правильно поняла твою кодировку, нужно указать параметр в какой-то ебать её в сраку эксемельке. То есть, если приложение линкуешь не ты, а просто передаёшь свою либу, то может оказаться, что там настроен какой-нибудь EBCDIC, а твой текст выглядит как даэдрические письмена. И даже не весь WinAPI умеет с этим работать, и иногда всё-равно придется мудиться с этим преобразованием.
>>3134819 И куда ты её деть сможешь? Даже принт не примет её. И она всё так же в рантайме работает, конвертируя строки в UTF-8. >>3134835 > указать параметр в какой-то ебать её в сраку эксемельке Чел, у тебя документация от WindowsApps, очнись. Это никакого отношения к WinAPI не имеет. Ты бы ещё UWP притащил сюда. > То есть То есть ты бредишь, одним вызовом функции консолька переводится в нужную кодировку. Вот правильное место в документации: https://learn.microsoft.com/en-us/windows/win32/intl/unicode > И даже не весь WinAPI умеет с этим работать Ему строго поебать как и чем строка закодирована. Передашь UTF-8 - он будет с UTF-8 работать. Для WinAPI строка это просто указатель на чар. > придется мудиться с этим преобразованием Только если в UTF-16 строка. Чем собственно в расте и занимаются, когда можно было не делать этого.
>>3134849 >Чел, у тебя документация от WindowsApps, очнись. Это никакого отношения к WinAPI не имеет. Ты бы ещё UWP притащил сюда.
У WindowsApps какое-то отдельное WinAPI?
>То есть ты бредишь, одним вызовом функции консолька переводится в нужную кодировку
А когда вызывать эту функцию? Ты закинул DLL'ку в папку и она каждый раз, когда хочет что-то высрать, твою консоль перенастраивает?
>Для WinAPI строка это просто указатель на чар. Ну здрасьте приехали. И зачем тогда каждый вызов дублируется с суффиксом A и W, зачем нужны локали, чем Windows-1251 отличается от CP-866?
>>3134966 > У WindowsApps какое-то отдельное WinAPI? Это вообще совершенно разные вещи. WindowsApps - это свежее крестовое API из 11 винды. > И зачем тогда каждый вызов дублируется с суффиксом A и W Затем что в винде есть UTF-16 и всё остальное, сделано для совместимости с однобайтным легаси времён начала нулевых. Всё остальное под А, работает в заданной кодировке, если кодировка указана как UTF-8, то оно и будет.
>>3134969 >Это вообще совершенно разные вещи. WindowsApps - это свежее крестовое API из 11 винды.
И зачем в описании для 11 винды упоминается какой-то левый апдейт для 10? Может потому что это на самом деле обертка над winapi?
>Всё остальное под А, работает в заданной кодировке, если кодировка указана как UTF-8, то оно и будет.
Иными словами, UTF16 - всё также остаётся основной кодировкой, а UTF8 - это бедный родственник, который зависит от глобального состояния или манифестов, которые хер знает кто выставляет и может поменять в любой момент. Я прямо уверен, что винда делает такую же конвертацию, что std Раста.
>>3135030 > Может потому что это на самом деле обертка над winapi? Нет. Это уже то, на чём встроенный виндовый софт пишется в 11 винде, там WinAPI не используется вообще, это легаси. > Иными словами Иными словами ты нихуя не понял. > UTF8 - это бедный родственник, который зависит от глобального состояния или манифестов Глобальное окружение и манифесты - это каким будет дефолт. Контроль за кодировками у софта. > Я прямо уверен, что винда делает такую же конвертацию Чел, я тебе даже кидал ссылку из документации WinAPI, там нативная поддержка UTF-8. Алсо, виндовый терминал который в 11 винде по умолчанию в WSL окружении переключает вывод в UTF-8 и оставляет линуксовый выхлоп как есть, а не занимается хуитой как растаны с конверсией в UTF-16.
У меня вопрос, если всех заебал сишный УБ, хочется писать действительно надёжный софт, хули вы побежали на дырявый раст для пидоров, а не выбрали мужскую Аду? Трансовики, оправдывайтесь.
>Это говно уже окаменело. >Один абзац текста и 5 абзацев предупреждений. Я такое говно только в консультант+ видел Какие же пидорасты долбоёбы пиздец. Бегом писать прошивки для баттплаг.ио.
>>3135046 > Нет. Это уже то, на чём встроенный виндовый софт пишется в 11 винде, там WinAPI не используется вообще, это легаси. Зуб даёшь? Я ведь сейчас в репу залезу и проверю как они винапи не юзают.
>>3135301 Ну давай. Пикрилейтед в самом SDK, WinAPI там используют только для разработки - в юнит-тестах и при логировании, на случай когда что-то отъебнёт. В сорсах естественно оригинальное WinAPI не трогают, частично оно переписано на крестах для обратной совместимости. Ну и там белым по чёрному написано - первым делом удаляйте все хедеры и либы WinAPI и заменяйте на WindowsApps.
>>3135051 Навернул я этого говна, спасибо. Помимо того, что дока бедная, а от иде там только название, эта самая Ада нечеловечески неудобна. Похоже, что при её создании применялась та же парадигма, что и в жабе: "искуственно переусложнено - значит безопасно". И ты ж, сука, зацени иронию: ☑ вызвать функцию игнорируя возврат - ошибка ◻ харкнуть иксепшон в любом месте и забить на перехват - пожалуйста ◻ нормального Result - нет ◻ хочешь, чтобы твоя память освобождалась сама? - изволь использовать Finalization
У меня была идея использовать аду в алготрейдинге громко звучит только из-за её интервальных типов, которые там то, что доктор прописал. Но без нормального Result - хз, скорее всего забью. Единственный Result, который там можно сделать - тупо контейнер без map и прочего сахара, так как с дженериками там всё очень хуёво, анонимных функций тоже нет.
>>3136051 >вызвать функцию игнорируя возврат - ошибка Это заебись, так и надо делать, вспомни ещё в Си базовый флаг флаг -Werror. >харкнуть иксепшон в любом месте и забить на перехват - пожалуйста Ты просто не понимаешь сути эксепшенов. >хочешь, чтобы твоя память освобождалась сама? - изволь использовать Finalization Обычный базовый язык, в спарке вообще куч нет (хотя в новом вроде завезли).
>>3136106 >Ты просто не понимаешь сути эксепшенов. В Аде смузихлёбский подход а-ля котлин, в той же джаве с ними и то построже. Один хрен, я бы продпочёл Result, но его нет.
>>3136088 >Что за IDE? gnat studio Говнецо ещё то, но базовые вещи делает. Написано на самой аде + дохрена питона. Чсх, у них есть коммерческая версия под раст. В поставке appimage постоянно чего-то не хватает, вот, например, оно пытается позвать внешнюю утилиту и не может.
В каком редакторе можно писать код на расте? Пробовал вс код - не понравилось. Официальный плагин написан через жопу, постоянно отваливается, глючит. Видимо не случайно там сделана кнопка "перезапустить". Ни для одного языка не видел более убогого плагина.
>>3137199 Оптимизации включать пробовал? В крестах такого говна нет. Даже в винде если захотеть весь vcruntime статически прилинковать например чтоб на XP запускать, то будет всего 130 кб весить бинарник. По умолчанию там 10 кб бинарники, вц-рантайм в системе всегда уже есть, если 10+ винда. В расте же 350+ кб всегда.
> Disclaimer: This post is a very long collection of thoughts and problems I've had over the years, and also addresses some of the arguments I've been repeatedly told. This post expresses my opinion the has been formed over using Rust for gamedev for many thousands of hours over many years, and multiple finished games. This isn't meant to brag or indicate success, but rather just show there has been more than enough effort put into Rust, to dispel the the commonly said "once you gain enough experience it'll all make sense" argument. https://loglog.games/blog/leaving-rust-gamedev/
Про манёвры с оптимизацией я промолчу, раст тоже можно до усрачки оптимизировать. Моё сообщение было о другом. Для тех кто не понял — напишу более подробно: LTO нигде по умолчанию не включён и все символы всегда попадают в бинарник. Это так-то нефига не тривиальная задача, исключить ненужные.
>>3137224 > Это ложь. А теперь попробуй сделать это же под виндой. Раст же вроде безопасный, но по факту он либо выдаст ошибку компиляции, либо скомпилит нерабочий бинарник. И то что у тебя где-то в системе лежит динамическая либа делает ещё хуже, ведь твой собранный файл не портабельный. > LTO нигде по умолчанию не включён Зато он почти везде включен при оптимизациях. Но в расте хоть включай, хоть выключай - всё равно насрёт в бинарник или надо таскать с собой либы. > Это так-то нефига не тривиальная задача, исключить ненужные. Даже в дотнете с этим справились, кода пилили AOT-компиляцию в нативный код. А ведь там даже есть рантайм-рефлексия.
>>3137237 >Зато он почти везде включен при оптимизациях. Ложь. >Но в расте хоть включай, хоть выключай - всё равно насрёт в бинарник или надо таскать с собой либы. Чем насрёт-то?
Остальной оффтопик в виде дотнета, винды и прочих майкрософтовых поделок обсуждать не могу — не пользуюсь их продуктами уже лет 15, кроме гитхаба (увы). Наверное, там действительно всё плохо хотя казалось бы куда ещё...
>>3137242 Я не ГОвнарь, может там как-то по другому это реализовано. Но вон в конце прошлого года Андрюха выкатил костыль в виде автоформатирования с чисткой от неиспользуемых переменных. Челы всё правильно пишут про жопную боль когда хуяк-хуяк делаешь, а автоформат не ослабляет жопную боль, только создаёт потенциальные баги. Вот ты условно в поисках багов жонглируешь переменными, некоторые из которых неиспользуемые, а где гарантия что используемая в данный момент - это то что должно быть по задумке? Автоформат стёр их и всё, код допустим не твой, там может что-то сломано и никто не узнает об этом до появления проблем. В любом нормальном ЯП тебе будут идти варнинги и ты всегда будешь знать что вот там какой-то пердолинг происходил и с ним надо будет разобраться руками. Отдельно проиграл с пердоли, предлагающего искать в сорсах подчёркивания регулярками.
>>3137199 Ты не старался понять мысль. Это ответ на утверждение, что якобы символы не линкуются если они не нужны. Ты можешь и с динамической линковкой собрать, там не так впечатляюще будет "насрато" конечно, но всё равно будет куча "лишних" символов почему-то.
>>3137287 >Так тебе вроде сказали, что с -O3 там не будет этого мусора. А то в одном месте без оптимизаций, а в другом --release с какими-то ключами. Анус ставишь? То что мне сказали свидетельствует только о непонимании говорящих о том что такое -O3, --release, LTO, динамическая и статическая линковка. Да вы вообще не понимаете как линкер работает, лол. Зато радостно цепляетесь за различия в дефолтных настройках компилятора.
>>3137296 > Да вы вообще не понимаете как линкер работает, лол. Это ты не понимаешь, ведь unused_fn у тебя используется. > Зато радостно цепляетесь за различия в дефолтных настройках компилятора. Так ты покажи что будет по дефолту в расте, не стесняйся. А то сначала про дефолт речь шла, а как до раста дошли так сборка с ключами.
>>3137296 Чел, в сишке нет модулей и все глобальные функции экспортируются. Ты можешь их динамически импортировать в другом бинарнике, как будто это либа, а не исполняемый файл. Поэтому у тебя нет неиспользуемых функций. А вот если бы ты на крестах с модулями написал, то там без явного указания необходимости экспортировать компилятор удалил бы всё это. Учи базу.
>>3137298 >Это ты не понимаешь, ведь unused_fn у тебя используется. Как она используется и почему без неё всё работает?
>Так ты покажи что будет по дефолту в расте, не стесняйся. А то сначала про дефолт речь шла, а как до раста дошли так сборка с ключами. Будет как и в любом другом языке при использовании статической линковки. Не помню, чтобы речь шла про дефолты. Первое упоминание этого слова в треде в контексте компиляторов — в моём посте.
>>3137308 Ты так и не показал что будет в расте, только виляешь жопой и никак не можешь объяснить почему у раста такие жирные бинарники. С динамической линковки вдруг перескакиваешь на LTO и обратно. Ответь на простые вопросы уже: почему LTO в расте не вырезает мусор и зачем ты отделив мусор динамической линковкой притворяешься что его теперь нет?
>>3137316 Я смотрю мы уже прекратили обсуждать попадание "лишних" символов в бинарник и перешли к обсуждению жирности последних? Ну так я и не виляю жопой. Я только не согласился с утверждением >>3137214, что растовые бинарники весят больше 350Кб безотносительно способа сборки. И привёл наглядный пример. Выводы за меня ты уже сам начал делать, кек. Ладно, чао, эта тема мне уже не интересна, её обсосали 100 раз до этого.
>>3137308 > при использовании статической линковки А как в расте статически прилинковать всё, чтоб понимать сколько говна он носит с собой? Я вот сейчас собрал под виндой, а там динамически прилинкован рантайм сишки и крестов, на полтора мб, лол. В линуксе наверняка libc линкуется, поверх сотен кб самого раста. >>3137325 > перешли к обсуждению жирности последних Вроде про это и был разговор? Это ты зачем-то от него уйти пытаешься. То что у тебя там от чего-то очко порвалось не имеет к сути вопроса никакого отношения. > эта тема мне уже не интересна Норм ты слился, так и не сказав ничего по сути вопроса.
>>3137332 >А как в расте статически прилинковать всё, чтоб понимать сколько говна он носит с собой? Он по дефолту так делает, поэтому просто cargo build. Добавление --release этого не меняет, если что. >Вроде про это и был разговор? Нет, я это не обсуждал, хотя меня почему-то постоянно пытались вывести на это. Более того, я изначально в >>3137199 и раст-то не упоминал, лол. Повторю, мне эта специальная олимпиада не интересна. Другие темы готов пообсуждать.
>>3137337 > Он по дефолту так делает Нет. Вот тут ты пиздишь в наглую. Запусти и посмотри в рантайме что он налинковал динамически. В крестах под виндой если собрать с /MT, то он реально статический билд сделает, вообще без динамической линковки, аж на 130 кб. Но в расте там две dll висят.
>>3137346 >В линуксе наверняка libc линкуется, поверх сотен кб самого раста. Кстати, да, это интересный вопрос оказался. У меня такой результат. Получается примерно 700 кб libc и ещё 700кб между растовой библиотекой и libgcc_s (сложно сказать в какой пропорции). Остальное думаю пренебрежимо мало. Хотя и libgcc_s думаю тоже крошечная, доводилось в её исходники лазить.
>>3137370 Теперь бы ещё узнать что будет если таких либ не найдено. Или libc какой-то очень не той версии, что была при сборке. У ГОвна вроде реально портативные бинарники под линуксом, хоть и жирные в несколько мб.
>>3137370 Под виндой на первом скрине msvc тулчейн, на втором gnu. gnu генерит бинарник аж на 1.1 мб. И нахуя ему сокет я не понял, это хеллоу ворлд, зонды линукса какие-то.
>>3137374 Я кстати, соглы. Особенно, если учесть, что одинаковые страницы памяти всё равно будут общими. Страдает только место на диске, но они всё равно безразмерные нынче.
>>3137377 Что-то не очень понял, что ты имеешь в виду. Либ тут никаких не требуется. А если ты запускаешь приложение слинкованное с версией библиотеки, которая не совместима с ядром, то будет упавшее приложение. На винде попроще с этим, там над обратной совместимостью трясутся.
>>3137717 Мы пользуемся растом не из-за размера бинарника, а как раз из-за боровчекера. Нам нравится, когда создаваемые программой данные освобождаются автоматически и zero-cost-ово.
>>3137237 >Даже в дотнете с этим справились, кода пилили AOT-компиляцию в нативный код. А ведь там даже есть рантайм-рефлексия Она не работает, там надо вручную прописывать элементы, которые ты через рефлексию трогаешь, чтоб linker лишнего не порезал и прилага не упала в рантайме. Те же грабли с разными ioc-контейнерами, json-парсерами и всякой лабудой, которая работает на рефлексии или уже, подозреваю, на кодогенерации рослином. Да и как ты себе представляешь, то linker не порежет тебе класс, например, который ты в рантайме определяешь?
>>3137997 >пук-среньк, обратите внимание уже на эту ссылку Челик, просто иди нахуй. Мало у кого есть желание читать чей-то километровый провокационный высер на неродном языке. Хочешь обсуждения — напиши вкратце про что там или хотя бы что тебе больше всего понравилось.
>>3138039 Так прочитай хотя бы второй параграф. Ты делаешь вывод о целом языке исходя из очень специфического опыта конкретных людей. Там автор сам пишет, что его опыт нельзя экстраполировать. Повторю, там много всего понаписано, возможно по делу, но лично у меня нет никакого желания в это вникать. Тем более, чтобы беседу с тобой вести, сам-то ты этого не делал.
>>3138050 >Повторю, там много всего понаписано, возможно по делу, но лично у меня нет никакого желания в это вникать. Вся суть пuдopaшки. Если кто не понял, годная статья, стоит вообще всем читать.
>>3138502 Завтра ищешь в интернете книжку Introduction to the theory of computation. Пофиг если ничего не поймешь. Затем идешь на www.agner.org и изучаешь микроархитектуру процессоров от корки до корки. Потом зубришь, именно, сука, вызубриваешь нотацию гомотопной теории типов, чтобы от зубов отскакивало. Когда напишешь свой первый однопроходный компилятор, по пути изучив ассемблер, скачиваешь и изучаешь изучаешь любой фреймворк для кроссплатформенной кодогенерации, рекомендую LLVM или C--. Как переделаешь компилятор, чтобы имел по крайней мере вывод типов по Хиндли-Милнеру, можешь идти дальше - тебя ждет увлекательный мир оптимизаций. Многопоточность, сверхбыстрая векторизация, ленивые итераторы. Отсос хиккующих выблѣдков / просто неудачников типа Тима Пайка или сисярп/джава-удососов, которые сосут уд по жизни не заставит себя ждать и уже через пол года твой фаундейшен ты будешь получать такие суммы, что любая трансдевочка будет течь при одном упоминании твоих контрибьюторов.
>>3138703 > От чего зависи семантика. 1. Любой блок возвращает что-то. Даже пустой блок возвращает (). 2. Лишний ; меняет тип взвращаемого значения всегда, компилятор почти сразу находит несоотвествие типов и сообщает об этом разрабу. Твоя проблема надумана.
>>3138740 Но return нельзя использовать, т.к. он сам по себе возвращает ! или never (https://doc.rust-lang.org/std/primitive.never.html). Ну и в замыкании его семантика будет неясна. А в чём принципиальная разница между отсутствием ; и закорючкой в конце?
>>3138001 Чтобы использовать ? у тебя в сигнатуре должен быть явно задан тип, для которого этот ? разрешено использовать. То есть, какую попало ошибку ты при помощи ? не пробросишь. Если возможных ошибок несколько и все охота пробросить, то можно привести через enum к общему типу ошибки и пробрасывать уже его или проще через специальные сторонние макросы.
>>3138001 >в аде Скоро типы-диапазоны завезут и ада станет совсем не нужна. Ну или я даже не знаю, какие у неё ещё есть киллер-фичи, которых нет в расте.
>>3139472 Но ведь числа Фибоначчи - это математическая последовательность, а не компьютерный массив данных, поэтому логично считать её начиная с 1, а не с 0.
>>3139476 Последовательность, да, которая определяется так: fib(0) = 0 fib(1) = 1 fib(n) = fib(n - 1) + fib(n - 2)
Логично, когда ты пишешь функция вычисления числа Фибоначчи, что её аргументом является не порядковый номер числа, а некоторому числу. Которое, даже может быть отрицательным.
Сори, неправильно выразился, когда писал про подсчёт чисел. Не проснулся ещё.
>>3143896 Тестовое дали, потом недели 3 или месяц проверяли, детально придирались, чуть ли не к каждому слову, что я память лишнюю высвободил, по растовским меркам если ты сделал временную переменную и скопировал значение туда, то это нохайр автоматом.
>>3145710 Конечно. Я талантливее, способнее и самостоятельнее большинства кодерков. А проблемы с лишними байтиками это чисто рабочий момент который разрешается на уровнях кодревью/дрочева дев окружения/репортов с прода.
>>3145924 Напиши туда инструкцию, чтобы она написала тебе код программы, которая висит значком в трее и контекстным меню показывает опции > Следующая картинка > Показать окно > Выход Окно пикрелейтед. Посмотрим, как твой цопелот справится.
>>3145933 Ну оно не умнее меня. А я не знаю какие либы надо для этого взять сходу. Оно код пишет, winapi знает, но импортит странное, какая-то ебля с либами нужна. На крестах с инклюдами ебля, он тоже сам не может справиться, надо в симейке дрочить что-то. А вот на питоне сходу написало рабочий код на qt. Можно дальше просить хотелки, тут я просто попросил иконку в трее с меню сделать. Ты не думай что оно тебе рабочий софт на тысячи строк может написать с нуля, только отдельные куски по реквестам, хоть какой-то контекст нужен нейронке.
Сегодняшний дейлик на литкоде удивил меня тем, что в расте нет сортировки чисел с плавающей точкой. Пришлось изгаляться новым типом. Заодно попробовал оптимизировать с помощью unsafe-кода, но выигрыша это почти никакого не дало. Ну и самое смешное, что предыдущее рабоче-крестьянское решение, с коллекционирование и сортировкой долей заметно быстрее, хотя и жрёт в 10 раз больше памяти.
>>3150880 Так я его и использовал, посмотри на скрин. Его можно применить в сортировке, но не для того чтобы помещать числа с плавающей точкой в кучу (BinaryHeap).
>>3151672 К счастью, в Индии английский — второй официальный язык. Поэтому индус смог прочитать условие задачи и понять, что там нужно делить одно простое число на другое.
>>3151738 Прекрасное понимание школьной математики, только это никак не упрощает решение этой задачи. Всё равно придётся писать обёртку имплементирующую Ord, только не для f32, а для пары чисел.
Для простой сортировки можно использовать вместо total_cmp. Я правда не уверен, что это будет эффективнее на процессорах с FPU.
>>3151759 > не упрощает решение этой задачи. Я тебе не просто ускорил хиндукод, а спас от ошибок. Ты ведь и не знаешь, что некоторые i32 равны после преобразования в f32.
>>3151794 К данной задаче это никак не относится. Пиздец, просто невозможно предугадать к чему могут доебаться на дваче после твоего поста. Слишком много специалистов по всему.
>>3152134 С этим как раз понятно как работать, начиная от использования overflowing_mul, и заканчивая переходом в 64/128 бит.
А умение работать c проёбом точности обычно идёт с курсом по численным методам, где от тебя сразу спрашивают с какой точностью ты хочешь решить задачу.
Продолжаю сортировать числа с плавающей точкой. Вчерашний литкодовский дейлик был довольно сложный, решил его только сегодня. Ради интереса попробовал сделать сортировку пар целых чисел, вместо результата деления, как настоятельно "советовал" токсичный анонас выше. Было подозрение, что это может оказаться даже чуть медленнее из-за того, что на каждой итерации сортировки потребуются дополнительные вычисления, как и для вычисления итогового результата, но нет, в пределах погрешности результаты идентичны. Правда растовский total_cmp оказался нетривиальным (для меня) и тоже сравнивает целые числа, поэтому попробовал напрямую сравнивать f64, вот это точно вышло медленнее.
>>3154731 Да хз, мне так глубоко лезть желания нет. Да и профайлер это больше про поиск медленной функции, а тут скорее надо сравнивать дизассемблер для разных вариантов.
>>3160144 Так это очередная веб-параша на вебвью. С таким же успехом можешь взять любой веб-гуй, хоть электрон. На расте уже есть несколько подобных высеров, каждый год новый появляется. Сейчас хеллоу-ворлд собрал, так же как и таури запускается с задержкой в секунду - идёт ебучая инициализация вебвью. Смешно видеть высеры про перфоманс, когда их говно запускается медленнее электрона.
>>3152503 Шиз не освоил miro и решил захуярить схемку ascii графикой
По теме треда - реквестирую, что с Rust произошло хорошего в контексте промышленного применения за последние 4 года?
Где уже можно пользоваться, где сырое шо пиздец. Вчера на хабре наткнулся на нытье, что раст в gamedev - сырое недоразумение. Это так? А что в других сферах?
>>3161680 Для дебилов стаковерфловнутых раст будет сырым недоразумением даже когда на нём космические корабли будут летать. Для нормальных людей всё уже давно хорошо и можно юзать деінде.
>>3160167 Калькулятор и список подлинкованных либ. Получается, без этого зоопарка и не собрать. Но, блин, удобно же. Для мобилок его попробовать, штоле.
>>3163468 Разница есть. Cell::get() возвращает копию значения, RefCell::borrow() и borrow_mut() ссылки. Первое подходит для примитивных типов, которые и так обычно копируются, второе для всего остального. Если попробовать объяснить другими словами, то Cell используется, когда необходимо поменять "неизменяемое" значение примитивного типа (т.е. типа, реализующего трейт Copy), а RefCell, когда необходимо сделать проверки заимствования в рантайме, чтобы поменять "неизменяемое" содержимое какого-то значения. Обрати внимание, что есть разница между значением и содержимым.
>>3165182 Лол clion для свободных бесплатных православных сей и плюсов платный, а rustrover для корпоративного богомерзкого раста бесплатный. То-то жопа у местного дурачка-антикорпораста подгорит.
>>3165331 Выглядит скорее как хуйня. На нормальных фреймворках гуя хоть на том же дотнете, на имгуи всё ещё примитивнее всё это сильно проще реализуется, без всяких костылей в строках и лапши.
>>3165182 Я пробовал этот кал пару недель назад и удалил. Даже вспомнить не могу почему снёс нахуй. Вреде бомбанул от уёбищной подсветки синтаксиса, хуже чем в вскоде.
>>3165424 Да лан? Ну покажи. Вкратце задача - по клику по кнопке в некой группе переопределять надписи и значения всех кнопок из группы, в идеале как у меня в примере - перетрясыванием набора исходных значений (у меня это shuffle).
Собсно у меня есть задача, где надо будет реализовать нечто подобное. Изначально хотел cursive, но там пиздец, потом egui, но там немногим легче. А тут прям самое то.
>>3168049 В расте всё очень плохо с этим, оно в зачаточной стадии находится. Странно ожидать от веб-параши производительности в итеративных вычислениях.
Cап, сейчас кожу на питоне, думаю перекатиться в раст как более перспективный язык на рынке труда Поясните нормальное решение? Стоит также дрочить алгоритмы на расте или у вас другие паттерны? В целом раст сильно сложнее? Не обзывайте пожалуйста
>>3168154 Вот и хорошо, вот и замечательно. Думаю, на egui похожим образом можно сделать. Зато тут стили, кроссплатформенность и, что для меня важно, реактивность через их этот Signal, который можно шарить между тредами.
>>3168555 >как более перспективный язык на рынке труда Смотря что кодишь. Если машоб/нейронки, то как бы mojo не оказался более перспективным. Если бэк, то goвно явно перспективнее. Самый перспективный способ получить деньги за работу на расте сейчас - это самому внедрить его на текущей работке. Типа, есть какая-то задача, которая реализована бажно и тормознуто на пыхе/петухоне, ты за выходные переписываешь её на раст и презентуешь барину. Барин ссыт кипятком от такой скорости и стабильности, повышает тебе ЗП, ты докидываешь абзац в резюме - который тоже не факт, что пригодится.
>>3168557 > Зато тут стили, кроссплатформенность Да и на imgui всё это есть. У egui ещё производительность такая себе, я недавно чекал его в очередной раз и довольно грустно для десктопного гуя. У imgui хотя бы на уровне qt производительность. Можешь посмотреть какие ебанутые комбайны можно на нём делать: https://github.com/WerWolv/ImHex
>>3168586 Да лан, мне и на диоксусе збс. Поясню, почему: в моей задаче гуй не самое важное, лишь бы было удобно работать с условным бэком - диоксус это могёт. Параллельно хотелось бы а. Оставаться в экосистеме раста (хотя бы затем, чтобы прям из ide смотреть код сторонней функции) б. Изучить что-то новое, потенциально годное для портфолио - реактивные гуи на DOM+CSS я ещё не делал, теперь вот поделаю.
>>3169269 Я даже не знаю, смеяться или плакать над тем, что слабоумный консерватор не в курсе того, что вместо твиттера теперь Х -- прибежище наиболее слабоумных консерваторов.
>>3169269 Отвечает прям как типичный пидорастер. Наверное язык/система программирования соответствует мышлению определенной категории людей.
Проще говоря язык от либерах для либерах. С ценрализованной инфраструктурой, надзором от большого брата и с изменчивой семантикой чтоб никакое пропитое быдло грязными мазутными руками не могло разобраться в замысловатом творческом коде господина пидорастера.
>>3169449 >С ценрализованной инфраструктурой то ли дело, есть 3-4 слабо совместимых между сбой компилятора, а нужные либы надо гуглить. И потом ебаться долгими вечерами, прилаживаю одно к другому, ммм...
>>3169464 >то ли дело, есть 3-4 слабо совместимых между сбой компилятора, а нужные либы надо гуглить В карге лежат "либы" уровня tinyxml2 это влучшем случае, а в типичном уровня leftpad. То есть то что в нормальном мире либами и не считается, считается модулями.субмодулями.
Либы это libsdl libtorrent libopenssl libgtk3
Что касается несовместимости то это надо спрашивать у ллвм/шланг почему он изобрел велосипед с квадратными колесами, а не взял уже готовый Gimple на котором написаны фронтенды для гцц. Хотя я знаю ответ - авторы хотели и рыбку съесть и на хуй присесть запилить компилятор который и как HOT и как JIT работает, со вторым в итоге пососали хуев и теперь мы имеем странный компилятор который переводит языки в байткод (LLVM IR) который прожевывает аки виртуальная машина и выпукивает машинный код.
>>3169603 В карге всё есть, не пизди. >Либы это >libsdl wgpu/winit >libtorrent тут +- . при желании можно состряпать rust-only клиент на том, что есть, но пусть будет минус, хуй с тобой >libopenssl rustls заменяет openssl почти во всех крейтах, где нужно шифрование >libgtk3 Прямо сейчас полно замен, если не требуется писать именно gtk/qt Из последнего https://github.com/lapce/floem и https://github.com/audulus/rui - стильно, модно, реактивно.
>>3169776 В плюсах например есть библиотека lodepng это примерно такая же small+fast библиотека-модуль которая легко подключается к проекту и собирается с ним, но это не замена всяким libpng, libjpeg-turbo итд. она не умеет в разность бит на цвет и не умеет в полный стандарт, не имеет симд и опенмп для обработки больших данных.
А ты предлагаешь трехколесные велосипеды в качестве альтернативы квадроциклу, вот поэтому раст и сосет.
>>3169960 Используй биндинги, ноу проблем. Вообще, конкретно эта предъява к расту очень легко применима к любому другому языку не из мира C/C++ , причём в гораздо большей степени. Если взять и посравнивать, то окажется, что по количеству либ, написанных на нём самом, раст всасывает разве что жабе/шарпу. А из компилируемых языков он вообще первый - это я говорю про вне С/С++ тусовочки, напомню.
Тогда уже говно-языки hare/zig/ocaml/fortran/nim/crystal/elixir/jai/mojo/.. - на них ведь тоже без биндингов к сям далеко не уедешь.
>>3170008 >Используй биндинги, ноу проблем. Ну да, когда растобляди переписали свою альтернативу, то дыряшка сразу не нужна, но когда чего-то не хватает, то обертки из швятого растокода над сишной либой - это не зашквар.
>Тогда уже говно-языки >zig Лол, что? Некоторые уже сишный код собирают через zic cc, да и в целом нет ни одного языка, где существовала бы такая легкая интеграция с кодовой базой на Си(ну кроме самого си).
>>3170053 >когда растобляди переписали свою альтернативу, то дыряшка сразу не нужна >когда чего-то не хватает, то обертки из швятого растокода над сишной либой - это не зашквар Не вижу тут противоречия, но вижу скулёж брошенки.
>Некоторые уже сишный код собирают через zic cc От этого сишный код не становится зиганутым кодом, зато появляется мешанина, написанная хуй пойми на чём. Вообще, этого говна, совместимого с обычной сишкой, было уже немало и ничем оно принципиально не выделялось, разве что добавляло немного сахарку. Те же обж-си, ди, ним.
>>3170128 Я и сам не прочь перекатиться, но на что-то типа mojo, когда его допилят. Сейчас там даже тулинг развернуть - уже изрядно поебаться и не на всяком линухе работает при этом. А zig в своей нише низкоуровневого байтоёбства пускай и ошивается, я не против.
>>3170109 >Не вижу тут противоречия, но вижу скулёж брошенки. А оно есть, и заключается в двойных стандартах шлюх.
>От этого сишный код не становится зиганутым кодом, зато появляется мешанина, написанная хуй пойми на чём Сам придумал, сам оспорил? Никто и не говорил, что Си код превращается к код на зиге(хотя и такая функция есть), а говорилось лишь то, что зиг работает с кодовой базой на Си почти бесшовно, что увеличивает комфорт системной разработки в разы.
>>3170116 >он ни одной проблемы не решает. Решает, и это видно по сообществу языка, куда приходят байтоебы, ибо видят в нем настоящую замену Си, а не веб макаки/питонобляди, которые в очередной раз пишут свою парашу. Удивительно, что язык, имеющий версию 0.12.0, подходит для системной разработки больше, чем "убийца си", который не один десяток лет пилится.
>>3170141 >Я и сам не прочь перекатиться, но на что-то типа mojo, когда его допилят. Вот вся суть шлюх, т.е. беготня за current thing ради бытия в ТУСОВОЧКЕ. ИРЛ их нормальные люди обоссывают, поэтому приходится свою социальную жизнь и самовыражение в профессиональную область выносить. >>А zig в своей нише низкоуровневого байтоёбства пускай и ошивается, я не против Ну да, ведь раст же не для этого создавался.
>>3170128 zig - это апофеоз линуксоидов-пердоль. Там есть сомнительные фичи, добеленные просто потому что так Андрюха решил. А есть куча фич, которые забракованы по надуманным причинам. Всё что не free по мнению гну-пидорасов - там под запретом, баги не фиксятся и откладываются на несколько релизов вперёд т.е. на годы как некритичные. Разрабы по большей части заняты не непосредственно языком/компилятором и улучшением юзерэкспириенса, а какой-то хуитой типа написания никому ненужных либ под MIPS и переписыванием сишного кода. Сборка чего-то сложнее хеллоу ворлда - кал собаки, надо литералли на любой пук писать "скрипты" сборки на самом зиге. Чего только стоит их "более удобный компилятор крестов", где вместо трёх строчек симейка надо написать портянку на зиге. При том что он ещё даже до хоть какого-то рабочего состояния не дошёл, а уже есть куча легаси либ, в том числе легаси документации и инфы из гугла, которая иногда только путает, т.к. сейчас уже поменяли некоторые места. Либ нет, а биндинги на сишные либы пишут руками и они везде неполные. Производительность сосёт, и у крестов, и у раста. У них написано "Call any function at compile-time", но это пиздёж и все компайл-тайм вычисления даже у крестового constexpr отсасывают по итоговой оптимизации. Можно бесконечно перечислять всё говно зига, по факту даже D на текущий момент более пригоден для кодинга, чем зиг.
>>3170169 >видно по сообществу языка, куда приходят байтоебы, >Ну да, ведь раст же не для этого создавался. прикинь, не для этого. С ранних версий он развивался с прицелом на разработку браузерного движка servo, а там больше логики, чем непосредственно байтоёбства.
>беготня за current thing ради бытия в ТУСОВОЧКЕ ну не совсем. То, что я перейду именно на mojo, это громко сказано, сперва пощупаю. Но и на раст я перешёл с питона, когда устал от его тормозов, gil и отсутствия типов. mojo пытается быть чуть более дружелюбным растом с питонячьим синтаксисом - сама идея мне норм.
>>3170183 При этом какие ошибки в движке лисы были такие и остались. Например джаваскрипт запущеный на странице из контекста расширения не производит никаких сообщений в консоль.
В хромом все это работает, но хромой сразу создавался с песочницей и многопотоком, а лиса обрастала им постепенно и там код из костылей, от которых они не хотят избавляться но хотят переписать их на что то более внятное что бы проще было поддерживать, но вот справляется с этой задачей раст это большой вопрос, где то читал жалобы какого то дяди из мозилы что в коде стало еще тяжелее разбираться, плюс сам фаирфокс из браузера который легко собирается на чем угодно, превратился в браузер который работает только на тех которые поддерживаются ллвм+растом (то есть китайские мипсы и эльбрус в пролете).
>>3171206 Да нет, просто мозилой руководят лгбт пидорасы подсаженые гуглом. Мобильный браузер изговняли и фактически уничтожели, на слабом интернете он просто не открывает страницы, а свое собственное расширение я никак не могу поставить потому что оно не рекомендовано пидерастами-проверяющими. Сижу на старом где пока еще можно на аддоны зайти и поставить тот же AudioOnly for YT
На десктопе тоже работа кипит, надо сделать так что бы у лисы не осталось никаких преимуществ перед хромокалом, вот ребята и стараются. Скоро платформонезависимый интерпритатор на плюсах выкинут чтоб нельзя было без портирования jit обойтись, а на хромом запилят.
>>3171374 Дружеское напоминание: за 99% закрученных в мире гаек ответственны традиционалисты-натуралы. Готов спорить на деньги что мозилой руководят правопопулистские бумеры-натурасты.
>>3171434 >Дружеское напоминание: за 99% закрученных в мире гаек ответственны Во первых политики свою личную жизнь обычно не афишируют и какие они на самом деле ты не можешь знать. Католические попы в свое время тоже рьяно за целомудрие и нравственность боролись и надевали мальчикам железные клетки на хуи.
>>3172991 Как мне жить с этой хуйнёй, если дома нет инторнета? Можно как-то, как в линупсе с сишечкой собрать либы и подпихнуть бинари для конпелятора?
>>3173288 Вот да, это пиздец. Обоссаное консольное приложение 4гб исходников+объектных файлов.
В целом язык очень нишевый, точно не десктопный ибо не нужон ваш ffmpeg/wxWidgets скоро на расте велосипед подъедет, а скрипты и luajit вообще выкиньте, пишите на расте и радуйтесь звучит как аргумент из дурки. Может быть серверные веб приложения вот это все где сейчас джава доминирует, нода как раз не шмагла по перфомансным причинам.
>>3173457 > что то связанное с символами экранирования. Майкрософту пора принять решение и отказаться шиндоус путей просто перейти на юникс/позикс-гибрид как мак и все. Давно бы уже могли это сделатьб я уверен они сами уже наелись говна с этими спецсимволами и кодировками.
>>3173467 Раст, это язык от программистов для программистов. А программисту нужно что? Контроль. А для контроля нам надо, чтобы всё од рукой. Вот о дефолту там и идёт куча дебажных символов и проч. Релизную сборку делаешь по инструкции https://github.com/johnthagen/min-sized-rust и будет тебе щастье
>>3173842 >это язык от программистов для программистов. А программисту нужно что? Контроль. Тут не поспоришь, однако обычно когда один "программизд" пишет что-то для другого, то в итоге появляется форк. Так как первый понимает "контроль" когда на тебя надевают ошейник и ведут на полосу барьеров и препятствий которые можно проходить только единственно правильным способом, тогда как второй свой собственный контроль над программой а не вот это вот все.
Обычно языки создают люди с академическим образованием и мышлением, основывая их на законах и постулатах-парадигмах, поэтому обычно в них таких проблем нет.
>>3173842 > будет тебе щастье Под виндой чтоб опуститься ниже 100 кб только no_std врубать. Хоть обосрись, но голый main даже без использования std сожрёт 100+ кб, lto делает ровно нихуя. Алсо, с контролем в расте как раз всё очень плохо. Иногда ощущается что ограничений больше чем в питоныче.
>>3174075 > Обычно языки создают люди с академическим образованием и мышлением, основывая их на законах и постулатах-парадигмах Ну вот макаки придумали ООП, там явно мышление не участвовало в процессе созидания. Мартин SOLID придумал, но за 20 лет никто так и не смог чётко сформулировать что это такое, все по разному объясняют значение этих пяти букв. Хотя там уже первая буква - целый мем, определяющий всё легаси-говно.
>>3174245 Объясни как рубисту, неужели нет преимущества у написания инфраструктурной хренотени на гошечке или расте? В вебе мне понятно, ты упрешься в пропускную способность намного раньше процессорного времени, а тут во что?
>>3174259 Так сами сервисы могут быть на чем угодно, в том числе и на расте и на говоланге. Но зачем скедулер для этих сервисов на голанге? Особенно если ты не клауд провайдер.
>>3174257 >нет преимущества у написания инфраструктурной хренотени на гошечке или расте? Чувак, ты про вообще? Вся инфраструктурная хренотень написана на go. Docker написан на go. ArgoCD написан на go. Kubernetes написан на go. Istio написан на go. Helm написан на go. Prometheus написан на go. Ну и так далее.
>>3174360 Я знаю, что оно на го всё написано. Я пришёл в чат растеров, узнать, подходит ли их язык для такого, просто в рамках своего личного исследования его применимости, которое я провожу перед тем, как решить, стоит ли ковыряться в расте или возвращаться к котлину, который мне поможет по работе, но к которому душа не лежит. Или вот всё бросить и дрочить го. Я вообще из веба/руби/питона, для меня это всё чужое и непонятное, а тут вон чувак говорит, что инфраструктурные штуки, которые мне нравятся, проще на питоне писать. Я и спрашиваю, какого хуя.
>>3173321 Ну так пишите на джавахуйне тогда хули вы лезете блядь. >>3173842 >А программисту нужно что? Контроль Ну так на си пишите хули. >>3174263 Криптопараша на расте. >>3174455 Раст тебе нахуй не нужон на самом деле, если ты приходишь в чат с вопросом для чего раст.
>>3174360 Эластик написан на джаве, Логстэш написан на джаве, ДинамоДБ - джава, Кафка - джава, Рэббит - она же, Дженкинс - тоже Ява теперь неебаться крутой язык для инфраструктуры оказывается
>>3173288 К слову, так было пару лет, когда я на растопараше писал, сейчас похоже всё не так, карга пакеты вроде в .cargo складывает и появилась какая-то хрень - локальная registry. Алсо, если учитывать, что раньше всё собиралось из исходников, потому что АБИ был нестабильным, то выходит они до сих пор аби не стабилизировали?
>>3174227 ООП дало возможность пачке макак работать над одним проектом не мешая друг другу.
Старая шутка про - один программист может написать программу за месяц, а двое туже программу за два месяца - была актуально именно над процедурными языками. Контракты и инкапсуляция, позволяет не наступать друг другу на пятки, а IoC дало еще возможность это тестировать.
>>3177665 Проблема в том что этих макак эволюция обошла стороной. ООП хоть и задумывался как помощь братьям нашим меньшим, но так и остался инструкцией для умственно отсталых.
>>3178461 >Нужно именно кодировать обратно. Ну так и поищи по слову encode в документации. Там же сразу по этому слову найходитя write_to() и write_with_encoder().
>>3177665 >Контракты >инкапсуляция >IoC В итоге додики сували это всюду и везде, получилось больше во вред. >>3178686 Один язык для написания библиотек и криптопараши, второй для бэка/всякой сетевой 🌶нюшки, какое тут "или"?
>>3178522 >>3178642 Спасибо, тогда вопрос такой. >let mut arr = [0u8; 400000]; >let buffer = BufWriter::new(arr.as_mut()); >image.write_with_encoder(PngEncoder::new(buffer)).expect("TODO: panic message");
Нужен фиксированный размер arr. Если указать маленький, то выдаст failed to write the buffered data. Если поставить заведомо больше, то failed to write whole buffer. Вычислить необходимый размер arr не получается. Можно ли как-нибудь сделать BufWriter динамического размера.
В валидности конструкции не уверен, подглядел на stackoverflow.
>>3179024 Сделай буфер вектором, а не массивом, оберни его в BufWriter и передавай так в DynamicImage. Ты же сам по русски написал что тебе надо, остаётся просто перевести это в термины раста.
таймкод лень искать патлатый даун (книжки пишет и преподает в какой-то параше) там говорит, что студентик нынче туповатый пошел и такую вещь как указатель впринципе понять не способен из-за физических ограничений мозга
>>3179326 >студентик нынче туповатый пошел и такую вещь как указатель впринципе понять не способен из-за физических ограничений мозга Как будто раньше студентик понимал, и поэтому вызывал маллок по поводу и без. Наверное потому что ему вот такие бородатые клованы рассказывали про поинтеры, но не рассказали про то как работают комплюктеры.
>>3179391 >>3179326 Я хз как можно не понять концепцию указателей. Сейчас речь идет не о сложных кейсах, когда происходит каша из указателей на массив указателей на указатели на функцию и т.д, а о самых примитивных случаях, которые преподают в ВУЗике. Если студент не в состоянии осилить такую простейшую абстракцию, то о чем речь? Он и остальные абстракции не поймет.
>>3179326 Ой да ладно, очередное раньше было лучше, раньше были умнее. Это в 90е С++ был основой для всего, а сейчас область си настолько сузилась, что это ваше системное программирование нафиг не мотивирует никого, вот люди с трудом жуют.
Запомните, ошибка в обучение лежит на преподавателе, его способности мотивировать и обучать. Вот и представьте компетентность этих людей.
>>3179469 Ну к Столярову я бы с опасением относился, учитывая какие пассажи он прогоняет и тот факт, что он нихрена не работал в индустрии. Самые полезными и толковыми преподами в универе были чуваки с многолетним опытом в индустрии(писатели телекоммуникационных систем, например), а не академические крысы.
>>3179410 >в 90е С++ был основой для всего Зумерок, спок. >а сейчас область си настолько сузилась, У зумерка с++ = си >Запомните Ещё и учит кого-то, 🍑ц.
>>3179210 В свое время дропнул паскаль из за этого. Не язык, а какой-то надзиратель хватающий тебя за загривок и окунающий в бочку с водой, потом вытаскивающий и орущий в ухо: "ДЕЛАЙ КАК Я СКАЗАЛ, САЛАГА! ДУХ! ЧЕРВЬ!", снова окунающий, снова орущий и так постоянно. Какое же мерзкое душнилово, и это при том, что паскаль позволяет свободно в указатели и даже ассемблер. А тут 30 лет спустя изобрели такую же залупу "руст", только в десятки раз хуже, и еще находятся особо одаренные это нахваливающие. Я бы к такому выродку не подошел на пушечный выстрел, это уже за пределами любой деградации, литеральные черви, не люди.
>>3179410 >Я хз как можно не понять концепцию указателей. Если ты понимаешь концепцию указателей значит ты не понимаешь что такое указатели вообще. Это полу-ассемблерная семантика, а концепция языка Си это абстрактный от архитектур визуальный ассемблер. Понимать "указатели" не понимая как работает железо, это засовывать себе в анус очки, как мартышка из басни, полагая что от этого улучшается зрение.
Сам по себе указатель это просто метка для подстановки комманд лоад/стор, самая важная часть в указателе это размер данных к которым ты по нему обращаешься (то есть тип). Если супер-программизт нахуевертил гигаструктуру не особо заботясь о размерах сегментов и расположении данных, то хули толку понимать поинтеры.
Еще хуже обстоит дело с executable поинтерами, еще на заре взлета Си будущие бородатые деды с терминалами понимали что это хуевая затея и ей не место в языках высокого уровня, поэтому изобрели ООП у которого в памяти создается объект с которым ассоциированы функции через метоинформацию. Не нужны больше статики и функшн поинтеры казалось бы, но пришла асинхронщина с лямбдой в калбеке и сказала объектам подвинутся.
>>3179664 >но пришла асинхронщина с лямбдой Это уже не си, а высокоуровневый абстрактный кал который вон чел в видео выше называет "не-фоннеймановским" программированием, наравне с лиспом и прочими хаскелами/растами, короче соевые выебоны. Да, соя была издавна, тот же лисп, но тогда она была малоизвестной нишей.
>>3179664 >концепция языка Си это абстрактный от архитектур визуальный ассемблер Называть си ассемблером я бы не стал. Компилятор может переставлять и выкидывать строки как ему вздумается. Ради интереса открыл сейчас ISO/IEC 9899:2018, там 10 страниц (408-418) с перечислением Undefined Behavior. Все UB — это картбланш компилятору на любую оптимизацию.
>>3180055 Ну так-то он прав, в x86 инструкции могут не в порядке машинного кода выполняться и даже одновременно в одном такте, если соблюдаются условия для этого.
>>3179991 >Все UB — это картбланш компилятору на любую оптимизацию. Не совсем. Компилятор всегда оптимизирует с позиции что UB недостижим. Т.е. если у тебя есть if (foo) bar() else UB, компилятор это cоптимизирует до bar().
Оптимизации работают с позиции что разработчик проверил что все возможные входные значения не приводят к UB, а значит возможные значения которые триггерят UB можно не учитывать при оптимизациях.
>>3179808 Вообще я говорил про вот такое: myStruct->callback = &my_function; хmyStruct->callback(); То есть указатель не просто с адресом функции которую надо вызвать, а прыжок в конкретное место на стеке со статик локалами.
А vtable это просто vtable[][] = { {"funct_name", virtual_call1}, ... } И нужны они только для виртуальных методов, для которых заранее неизвестно какой вариант надо вызывать.
>>3179886 Он шизик и гик, не слушай его. Большинство кода на Си работают как раз не на фоннемоновских архитектурах, потому что все остальные языки предполагают что у нас безграничная куча памяти, как дедушка фоннейман завещал. И возможно как раз тот самый вызов подпрограммы по указателю на нефоннемоновских архитектурах выглядит не так уж 🍑цово, микроконтроллеры не запускают программ извне и память у них набортная без всяких mmu.
>>3179991 >Компилятор может переставлять и выкидывать строки как ему вздумается. Не совсем понял как это относится к разговору, yj да в компиляторе есть агрессивные оптимизации которые могут сломать программу, обычно в документации указано какие именно, например проигнорировать NaN INF и прочую математическую хуету или сосчитать результат заранее и вместо вызова подставить результат. А вот есть ли оптимизации заставляющие выкинуть обращения по указателю, которые расставил по коду нерадивый программист я не уверен.
>>3180273 > А вот есть ли оптимизации заставляющие выкинуть обращения по указателю, которые расставил по коду нерадивый программист я не уверен. Компилятор делает много оптимизаций на вычислении границ возможных значений. Если он увидит что в какой-то указатель на функцию запись делается всего в одном месте и одной функции, он может сделать везде прямой вызов этой функции.
>>3180290 Компилятор не делает никаких оптимизаций, пока ты их не включишь. Тем более агрессивные с выкидыванием оригинального и подстановкой оптимального.
И в абсолютно любом случае он очень ограничен в ситуациях когда неизвестно на какую область памяти будет смотреть тот или иной указатель, ведь на этапе компиляции ее просто нет. Поэтому и нужны всякие метки вроде restrict
>>3180413 > неизвестно на какую область памяти будет смотреть тот или иной указатель Самое смешное что именно компиляторописатели придумали dangling pointer, про который ни слова не писали в стандарте и только в недавних версиях добавили. Авторы стандартов не предполагали что UB для компиляторов станет форточкой, через которую будут протаскивать пианино, в попытках оптимизировать всё на грани поломки кода. И старая сишка не была такой опасной, отстреливающей жопу при неверном движении с О2.
>>3180396 Я тут ковырнул одну мелкоигру на анриале4 и просто охуел с того сколько оно все весит (400мб) и как медленно работает на моем древнекомпе.
Там реально внутри какой то скриптовый язык походу с интерпритатором обмазаный плюсовыми библиотеками для работы с графикой и вот этим всем. Наверняка на лету из строки клепает шейдеры и компилирует.
А потом всякие клованы нихуя не понимающие заявляют что надо с юнити на анриал тарков или WOT с плюсового дагора переписать и будет заебись.
Другое дело, что не всё так страшно на самом деле и компиляторписатели не делают всё возможно ради оптимизаций. Вот пример. Я конечно может в нём ошибаюсь, но по-моему компилятор мог смело выкинуть в нём строку, печатающую 'Hello', потому что условие приводящую к её выполнению является UB.
>>3180604 > никто не использует Я помню в нулевых, когда gcc пытался косплеить ядерный полигон, а LLVM ещё не превратился в юзабельный продукт он и сейчас с трудом юзабельный, на пердоликсе некоторый софт можно было собирать только в О1, в О2 тебе отрывало жопу.
>>3180604 > компилятор мог смело выкинуть в нём строку, печатающую 'Hello' Нет, у тебя там нет никакого UB в выводе строки. То что ты стек захуячил - это не UB и вообще к строке не имеет отношения.
>>3180980 В самом выводе строки нет. Но я писал >условие приводящую к её выполнению является UB
Читаем стандарт и видим, что x не может быть 5 и более, иначе в строке #5 будет UB. Поэтому компилятор мог бы с чистой совестью выкинуть условие в строке #6, потому что оно принципиально должно быть недостижимо.
An array subscript is out of range, even if an object is apparently accessible with the given subscript (as in the lvalue expression a[1][7] given the declaration int a[4][5]) (6.5.6).
>>3181195 > мог бы Не мог, массив это сахар над указателем. Пикрилейтед абсолютно валидный код без UB. array subscript - это обращение по индексу. Индекс может быть любым.
>>3181265 Ты сам видишь что там написано? Результат обращения UB, всё. UB значит что там может быть что угодно, стандарт не определяет что, но это не значит что туда нельзя обращаться. Компилятор никак не следит куда ты обратился, и уж тем более не оптимизирует как ты мечтаешь.
>>3181293 >но это не значит что туда нельзя обращаться Но это и не значит, что туда можно обращаться. Компилятор вправе сделать вывод, что программист заранее всё продумал и таких обращений не будет. После чего выкинуть соответствующие инструкции. И самое интересное, что именно так он и поступает.
Признаю, что привёл не очень удачный пример, потому что ничего плохого из-за данного UB в нём не происходит. Просто мне казалось так было проще проиллюстрировать мою мысль о том, что нельзя считать си ассемблером, потому что компилятор в довольно широких пределах может изменять программу.
Давай посмотрим на другой UB, который компилятор действительно эксплуатирует. Как видно результаты выполнения программы для -O1 и -O2 кардинально различаются. Вроде все значения помещаются в нужные типы. Почему так получается? Мой вариант объяснения происходящего:
При умножении x и y происходит неявное преобразование их к int (знаковое целое). Переполнение при умножении знаковых целых это UB. Именно это и происходит когда x = y = 0xFFFF. Но компилятор посчитал, что программист не будет передавать в функцию такие значения, которые приводят к переполнению. Поэтому при более высоком уровне оптимизации он использовал инструкцию jle (сравнение знаковых целых) вместо jbe (сравнение беззнаковых). Хотя казалось бы сравнивал он беззнаковую переменную и константу.
Честно признаюсь не очень понимаю, почему в этом случае применяется такая агрессивная оптимизация, которая ломает выполнение программы, ведь явного выигрыша она не даёт. При этом догадываюсь, почему нет агрессивной оптимизации в случае выхода за границы массива (сломается весь типичный сетевой код нахрен, в котором это используется намеренно, когда объявляется массив длинной 1 в конце структуры, описывающий пакет). Одно знаю точно — в си слишком дохера неявностей, которые приводят к неожиданным результатам. В этом плане раст к ассемблеру ближе будет, лол.
Кстати, смеха ради переписал тот же пример на расте. Как видно, при -O3 результат всё ещё странный, зато при -O0 мы ловим панику. За что раст мне и нравится.
Что-то отвлёкся с этими UB в си от темы треда. >>3181002 Кейсы в match должны быть известны на этапе компиляции. foo.contains и шаблоны под это ограничение не подходят, зато if-guards как в твоём примере, позволяют обойти это ограничение. Может поменяют в будущем, т.е. сделают сахарок над if-guard'ами.
>>3180604 Ну во первых test у тебя публичная функция и просторов для оптимизации в ней нет, оптимизации надо смотреть там где ее вызывают, то есть в main, где по идее можно все заранее сосчитать и выкинуть нахуй вызов функции.
Что касается UB, то это уже выходит за рамки возможностей компилятора, компилятор не разбирается в твоем кгновнокоде, Хотя для отлова таких простых ошибок как у тебя в компиляторы добавили опцию -Wall, в рантаймных случаях только валгринд или эльбрус в режиме -mptr128. И это не UB это ошибка
>>3181329 >В этом плане раст к ассемблеру ближе будет Ну прост надо Си хорошо знать и не будет проблем, поэтому он и сложный. >>3181402 Мне кажется, ему взять вездесущую либу ахо karasique для этого, если там есть прегенерация. >>3181476 >Хотя для отлова таких простых ошибок Дядь, там уб-санитайзеры в гцц уже завезли лет 10 назад.
>>3181329 > вправе сделать вывод Нет. Неконстантные бранчи никогда не будут удалены, это стандарт запрещает. > на другой UB И нахуй ты это притащил? До этого вообще другая ситуация была, ты 🍑л что бранч будет оптимизирован из-за левого UB. > jle (сравнение знаковых целых) вместо jbe GGC всегда был кривым говном в О2. В шланге и msvc всегда будет корректно считать. Если как ты сделать, то он с оптимизациями вообще при компиляции посчитает, если через аргументы, то всё равно не будет переполнения. Без оптимизаций тоже нет переполнения. >>3181351 > выдал неправильный результат > За что раст мне и нравится. Лол.
>>3181250 Ну вот это UB однозначно, ты вылазишь в стек процедуры x86й машины >это сахар над указателем. Это барьер от долбоебов с ружьем направленным себе в ноги.
>>3181502 >Дядь, там уб-санитайзеры в гцц уже завезли лет 10 назад. Куда именно "в гцц" ? Ну и адрес санитайзер это уже совсем про зоонаблюдения за указателями.
>>3181476 >оптимизации надо смотреть там где ее вызывают, то есть в main Оптимизации заканчиваются на границе функций. >Что касается UB, то это уже выходит за рамки возможностей компилятора, компилятор не разбирается в твоем кгновнокоде Разбирается, я что зря этот пример показал? >Хотя для отлова таких простых ошибок как у тебя в компиляторы добавили опцию -Wall, в рантаймных случаях только валгринд или эльбрус в режиме -mptr128. В данном "простом" случае ничего из этого не поможет. ну ладно, проверял только -Wall. >И это не UB это ошибка Это UB, пример которого буквально приведён в определении UB.
>>3181505 >И нахуй ты это притащил? Чтобы показать, как компилятор из-за UB и оптимизаций ломает программу.
>Нет. Неконстантные бранчи никогда не будут удалены, это стандарт запрещает. > В шланге и msvc всегда будет корректно считать. Правда?
О, это я ещё опечатку допустил, кекв, 0 пропустил при сравнении, gcc тоже одну ветку нахер выкидывает и ассемблерный код ещё проще оказывается, безо всяких сравнений.
msvc кстати тоже выкидывает, но код генерирует хуже.
>>3181556 >>3181569 Возьми реальный компилятор, а не онлайн-парашу. Я тебе уже кинул скрины, оно при всём желании не ломается, а при включенных оптимизациях он оптимизирует нахуй вообще весь код кроме принта. > msvc кстати тоже выкидывает, но код генерирует хуже Хотя бы потому что у него нет аргумента -О2. Хватит уже траллить тупостью.
>>3181556 >В данном "простом" случае ничего из этого не поможет. ну ладно, проверял только -Wall. Потому что в Wall и Wextra не все флаги, но да, подобное не ловится через линтер -Wconversion, но через -Warith-conversion есть (но он слишком шумный).
>Я тебе уже кинул скрины Я вообще не понял, что за скрины ты мне кинул. Скрины отладчика, в котором запущен код без оптимизаций? Ну так я весь день и пишу, что одна и та же программа в зависимости от оптимизаций может работать совершенно по разному.
>Хотя бы потому что у него нет аргумента -О2 Похоже в винде (или в msvc) /O2 и -O2 это одно и то же. Проверить сам не могу, верю годболту. Если ввести откровенную чушь, msvc даёт варнинг.
>>3181556 > Оптимизации заканчиваются на границе функций. >Разбирается, я что зря этот пример показал? Сперва ты мне показался грамотным, а теперь кажшься тролем >Это UB, пример которого буквально приведён в определении UB. Там написано про какой то array object int arr[] ={ 1, 2, 3} - это не array object, запись куда-то запределы кучи это по большому счету сегфолт.
>>3181657 >Сперва ты мне показался грамотным, а теперь кажшься тролем Не очень понял. Почему? >int arr[] ={ 1, 2, 3} - это не array object, запись куда-то запределы кучи это по большому счету сегфолт. Ну здрасьте, учимся объявлять массивы на дваче. Это то же самое, что int arr[3] = { 1, 2, 3];
>>3181685 array это куча, а не массив куча это просто данные лежащие на стеке (либо в памяти) линейно.
Разница в том что кучу нельзя воспринимать как нечто целостное, да и работать с ней тоже не получится ее нельзя записать целиком в фаил или передать копию другой функции. Это неструктурированные данные у которых нет начала и конца, есть только адрес позиции. Что бы создать "массив" в Си надо делать вот так: struct { int d[4]; } arr_t;
>>3181502 >>3181524 Вот кстати, здравомыслящий человек. Я совсем забыл про это дело, оно реально отлавливает проблему. Жаль в эмбеде проблематично применить, я бы юзал. Но раст всё ещё лучше с этим справляется, щитаю!
>>3181770 гцц выдает ворнинг без всяких санитайзеров А вообще почему он пишет signed int и почему переполнение беззнакового числа? Может из за того что ты знаковый литерал подставил? Сделай >= 0x80000000u
>>3181874 Не, там проблема в том, что си неявно приводит x и y к int'у (int promotion rules). Это делается для всех типов меньших по размеру чем int, просто потому что процессор не может в арифметические операции для таких типов. Раст в такой ситуации кстати просто отказывается компилировать и заставляет тебя явно все приведения провести и ты либо напишешь правильно (приведёшь x и y к u32), либо сделаешь багу, из-за которой программа будет падать в панику (см. >>3181351).
А скинь выхлоп как ты компилируешь с gcc, только добавь флаг -v? У меня не получается никаких варнингов, чтобы я ни делал.
>>3182038 Ты что-то не договариваешь оно у тебя ругается на то что 65k*65k не может дать положительный знак в случае int недвусмысленно намекая что надо бы перейти на long. Но у тебя везде беззнаковые стоят и никакого переполнения в случае беззноковых чисел не должно возникать.
Ты троллишь что ли я не понимаю? Ебучая двач-тематика, даже в pr жирные сидят и кормят говном.
>>3182038 >А скинь выхлоп как ты компилируешь с gcc, только добавь флаг -v? У меня не получается никаких варнингов, чтобы я ни делал.
Пикрелейтед, происходит такое потому, что процессору для перемножения надо положить числа на регистры и поскольку не указано что это беззнаковая константа, компилятор по логике должен сделать следующее действие: положить число на регистр, вызвать команду расширения знаком команды после чего умножить то есть (short)-1 х (short)-1 => (int)-1 х (int)-1 или 0xffff х 0xffff => 0xffffffff х 0xffffffff то есть почему происходит переполнение думаю теперь понятно.
Почему у тебя вылазит ошибка: наверное потому что ты компилируешь с -O3 и компилятор инлайнит функцию тест и в результате имеем что то подобное. Либо это ошибка во фронтендах шланга u16 u16 не должно превращаться в int int, беззнаковый тип для того и введен что бы компилятор знал что никаких преобразований над числом делать не нужно.
>>3181770 >Но раст всё ещё лучше с этим справляется, щитаю! 1) санитайзеры только для тестов 2) с гцц/шлангом для си можно добиться абсолютно такого же поведения при signed overflow как и в пидорасте Проблема си в том, что нужно хорошо знать все подводные и инструмент, поэтому си - это для профессионалов, а раст для новечков.
>>3182387 справа литералы точно так же перемножились после инлайна функции, никаких предупреждений нет, потому что аргументы определены как unsigned short и их умножение выглядит как 0x0000FFFF x 0x0000FFFF => 0xFFFE0001 никакого переполнения быть не должно.
>>3182384 В целом согласен, вот только вывод мне кажется не вполне однозначный должен быть. С одной стороны в раст вкатиться заметно труднее чем в си, но при этом это инструмент, который будет работать хорошо и корректно и обладает всеми современными удобствами. С другой стороны в си миллион подводных камней, про которые нужно просто знать™, но зато разработка проще и интуитивнее. Все жалуются про неуклюжесть и неудобства раста в серьёзной и крупной разработке, но и отлаживание вот таких багов на си может занять уйму времени и нервов. Хз, что лучше на самом деле.
Могу однозначно одно сказать изучить раст стоит хотя бы просто для себя как специалиста. Я вот уже почти год решаю задачи на литкоде с применением раста, читаю статьи, смотрю конференции и лекции на ютубе, даже парочку PR отправил в опен-сорсные проекты. В общем, немножко поднабрался опыта в этой области. И хоть я не применял его непосредственно в работе (хотя парочка маленьких сайд-проектов на расте у нас имеется, но их ведёт один человек и ему моя помощь не была нужна), но могу с уверенностью сказать, что всё это поменяло моё восприятие и си и плюсов.
>>3182448 >А кто просил знаковый int? int просит твой процессор, он с шортами работать не умеет. В знаковые инты их по умолчанию переводит твой компилятор, потому что значение беззнаковых шортов влазит в знаковый инт. Такие дела.
>>3182463 >Могу однозначно одно сказать изучить раст стоит хотя бы просто для себя как специалиста Если ты зумерок-пидорок, то да стоит учить %язык_нейм%, чтобы думать, что это там чёто помогает тебе, но если базированный профессионал, то ты просто изучаешь технологию, потому что она используется на проекте. Учить пидораст, как и любую другую хуйню, не стоит, если в этом нет практического смысла.
>>3182450 у какого в 🍑 rvalue? как ты для себя объясняешь что код скомпилированый без "оптимизаций", как написано - положить, умножить, сравнить итд, приходит к правильному результату, а если включить оптимизации то в выхлопе результат неправильный?
Мало понимать отдельные строчки в ассемблере, надо понимать код целиком. Вот результат с -O1 и что мы видим? Он тупо убрал половину кода и подставляет в принт заранее заготовленное значение внезависимости от результата.
Впрочем я сталкивался не один раз уже с историей когда компилятор в ассемблерный выхлоп выдает не совсем тоже что и в итоговой программе и доверять тому что в нем написано особо не стоит. Надо короче компилировать на хосте и делать обжект дамп бинарника или как там оно называется.
>>3182481 No offense, но у тебя логика типичного вкатуна. Базированный профессионал потому и профессионал, что любит учиться и вылезать за рамки обязанностей и потребностей. Вот этот подход — "учить только то что нужно" как раз и отличает новичков, которые в индустрии по причине денег. К ним ещё добавляется зумерская лень — "работать только по расписанию", которую они называют work-life balance, получается унылое говно на выходе.
>>3182483 А теперь пораскинь мозгами и подумай почему оно в стандарте появилось. Думаешь, чтобы специально запутать двачеров?
>>3182509 >Базированный профессионал потому и профессионал Потому что не долбоёб. >А теперь пораскинь мозгами и подумай почему оно в стандарте появилось Умунитарий, спокнись уже.
>>3179410 >Я хз как можно не понять концепцию указателей. Я вот совершенно не понимаю концепцию ссылок в C++. Несколько раз читал разные учебники, и все равно ни хрена не понял. А в указателях хз, что сложного, это просто адрес в памяти. Обычная переменная расположена по фиксированному адресу, а у указателя его можно двигать туда-сюда. И выделять/освобождать динамически.