Это копия, сохраненная 1 сентября в 04:11.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Rust — невероятно быстрый язык для системного программирования без segfault'ов и с гарантиями потокобезопасности.
Ссылка на официальный сайт: https://www.rust-lang.org/
В этом ИТТ мы можем объяснить базовые и продвинутые концепции языка, и программирования в целом, поможем вкатывающимся, подскажем что выбрать для веба, игр или, прости Абу, блокчейна.
IDE для Rust: https://areweideyet.com/
GUI для Rust: http://www.areweguiyet.com/
Web для Rust: https://www.arewewebyet.org/
GayDev для Rust: https://arewegameyet.rs/
Что еще есть для Rust?
- Посмотри сам: https://wiki.mozilla.org/Areweyet
Основная литература:
Rust Book(версия на русском языке): https://doc.rust-lang.ru/book/
Rust Book: https://doc.rust-lang.org/book/
Rustlings (упражнения чтобы привыкнуть к расту): https://github.com/rust-lang/rustlings
Rust by Example: https://doc.rust-lang.org/rust-by-example/
The Rustonomicon(для продвинутых анонов): https://doc.rust-lang.org/nomicon/
Programming Rust: https://www.oreilly.com/library/view/programming-rust/9781491927274/
Ресурсы на русском:
https://rust-lang.ru/
Отдельное спасибо автору этого гитхаба(старому ОПу). Здесь вы сможете найти много полезной информации: https://gist.github.com/TatriX/183c816f1346d418f969c4576c2b9b41
Предыдущий >>3060192 (OP)
В /пр/ бамплимит 1000, ты запомни на будущее. Сам на этом обжигался.
Угу, а что предыдущий тонет тогда?
Но раст правда опасен.
Вот как скриптовый язык - вполне себе ничего, он разрабатывался вебмакакой, его уровень - заменить жс в среде сиси-трансов. Пусть себе играются, пишут скриптики какие-нибудь, JSON парсят. Может какой сервер прикольный напишут, который никто не будет использовать.
Но почему-то крашенные трансы хотят раст в ядро засунуть. К чему это всё? Вызывает вопросы серьёзные.
>>25659
Никогда. В ядре ничего не написано на расте и не будет написано никогда, даже драйвера.
В смысле причем трансы? 70% людей кто работает над коре либой раста - трансы. У них там круговая ебля, они всех гетересексуалов двинули из разрабтки ядра. В компиляторе та же проблема, кста.
>Никогда. В ядре ничего не написано на расте и не будет написано никогда, даже драйвера.
Так уже написано
https://github.com/search?q=repo%3Atorvalds%2Flinux path%3A*.rs&type=code
Драйвер пока только один, но лиха беда начало, как говорится:
https://github.com/torvalds/linux/blob/master/drivers/net/phy/ax88796b_rust.rs
> эксельки шлепать
https://github.com/pola-rs/polars
> графики рисовать
https://github.com/plotters-rs/plotters
Я смотрю что ".read().await" возвращает " RwLockReadGuard<'{error}, HashMap<String, Room>>" и, видать, возвращаемая ссылка привязывается не к HashMap которая в структуре лежит, а привязвается к "RwLockReadGuard" и инввалидируется когда этот самый гуард дропается в конце метода. Но это получается что я могу использовать ссылку только пока живой гуард? А как тогда разбить код на два метода как у меня на пикриле 2?
Так и будешь в грязных ходить получается?
Суть read() в RwLock в том, чтобы заблокировать вызывающий тред, до тех пор пока все писатели не закончат свою работу. После этого уже сколько угодно читателей могут работать с получившимся значением, пока RwLockReadGuard существует. Ты не можешь передать ссылку на его содержимое куда-то ещё, иначе как RwLock сможет выполнять свои гарантии? Т.е. представь что это было бы возможно, ты передал ссылку на внутреннее содержимое, RwLockReadGuard был дропнут и тут в другом треде вызывается write(). Во write() будет проверка, что никаких других читателей и писателей активных нет, поэтому он со смелой душой начнёт менять внутреннее значение. А в первом потоке у тебя ссылка, кровь, кишки, распидарасило.
Хз как лучше тебе сделать, у меня нет должного опыта. Попробуй Room ещё в один Arc обернуть что-ли, лол, и возвращать клон Arc'a.
А в других языках трансов нет? Опомнись. 2024 год на дворе, трансы захватели все айти-сообщества.
> Доёбываешься к расту из-за трансов
> В твоём любимом языке корлибу тоже пишут анальники, а натуралы сидят тихо, не отсвечивают, чтоб не заканселили.
Растокуны, сап
Начинаю изучать раст и запнулся на владении
let s1 = String::from("hello");
println!("{}, world!", s1);
println!("{}, world!", s1);
Почему этот код компилируется? Ведь владение строкой передается в первый принтлн. Но он компилируется! Заранее спасибо
Алсо ответ чатгпт
В вашем примере переменная s1 владеет строковым объектом String::from("hello"). Когда s1 передается в функцию println!, она делает это по значению, а не по ссылке. Это означает, что происходит перемещение (move) владения с s1 внутрь функции println!. После этого первый вызов println! забирает владение строки, и переменная s1 больше не может быть использована после этого вызова. Поэтому попытка использовать s1 во втором вызове println! вызовет ошибку компиляции, так как она больше не владеет строкой.
Чтобы позволить s1 использоваться после передачи в println!, можно использовать клонирование строки
Это макрос, который использует built-in'ы компилятора, им насрать на правила языка. Считай, что в нём происходит неявная передача по ссылке, т.е. заимствование.
понял
ответ в макросах, буду читать дальше - пойму
спасибо!
Еще тогда вопрос: а чем собственно владение отличается от деструктора в C++? И там, и там при выходе вызывается магическая функция (дроп или деструктор) при выходе из скоупа. Пока что для себя ответил: компилятор раста не даст в двойное удаление одного значение, но это все или есть еще профити?
Ещё не даст
двойную запись
запись + чтение
в том числе в однопоточном коде, например, когда ты итерируешь по вектору, то в этот вектор нельзя втавлять/изымать элементы.
На мой взгляд принципиальное отличие — это дефолтное действие с данными когда ты их "передаёшь" куда-то (например как аргумент в функцию или банально связываешь с новым именем). В плюсах исторически — это операция копирования. Она инстинктивно предполагается человеком и вполне удобна в большинстве случаев, однако как показала многолетняя практика является источником многих проблем. В современных плюсах появилась move-семантика, но во-первых всё остальное легаси языка никуда не делось, а вместе с ним и поле для ошибок, а во-вторых оно чуть-чуть менее эффективно чем в расте (имхо конечно, я на эту тему спорил пару тредов назад с каким-то растохейтером, если инетересно можешь полистать, там был небольшой разбор стандартной библиотеки плюсов вплоть на дизассемблирования насколько я помню). Сам концепт RAII одинаков, верно.
>двойную запись
>запись + чтение
можно подробнее? не очень понял
>>26368
так вот что дает эта мув-семантика? Я так понимаю, что мув-семантика необходима для поддержания работы владения (2-ое правило гласит, что данными может владеть только одно значение, не больше). А какие преимущества дает владение перед деструкторами? Для себя выделил только предотвращение от ошибки двойного освобождения
>Драйвер пока только один
Это буквально 1в1 на С, но почему то сишная версия выглядит проще и понятнее.
>А какие преимущества дает владение перед деструкторами?
А какое преимущество у тёплой одеждой перед оранжевой? Это некорректный вопрос. Деструкторы есть в расте, просто необходимо реализовать трейт Drop для своего типа. К схеме владения они не имеют отношения.
Оке, понял ошибку
Тогда так: зачем была введена концепция владения? Какую проблему она решает?
>Тогда так: зачем была введена концепция владения? Какую проблему она решает?
Давай так, ты видимо ждёшь что я начну приводить какие-то конкретные примеры, но это означает пересказ всего растбука и растономикона тут. Схема владение влияет очень на многое в дизайне языка. Вот например, вопрос >>26032. Там компилятор не даёт анону выстрелить себе в ногу.
В целом >>26439 правильно сказал, но не упомянул одну важную деталь. Это способ проверить на этапе компиляции, что программа корректная. Возможно не единственный, возможно не самый оптимальный или удобный, но оно работает.
В ядре-то нет.
А чё там решается, в итоге, корректность время жизни и всё? Выходы за границы это чисто рантайм проверочки в стандартных типах типо слайсов?
Это вопрос в контексте владения или в целом? Видимо в целом, потому что выходы за границы явно не имеют отношения к владению. Хз, мне кажется вторая мощная вещь в расте — это система типов и сопоставление образцов (pattern matching), которые полностью контролируются компиляторм. Ну и в целом отслеживаются какие-то вещи, которые обычно служат источником уязвимостей. Например, был вопрос про println!, в отличие от сишного printf, в нём невозможно организовать атаку некорректной форматной строкой, потому что а) форматная строка обязана быть строковым литералом б) проверка аргументов будет на этапе компиляции.
Конкретно про владение, с помощью этого же решается только задача об определении времени жизни объектов?
Ну да. Тебе как программисту не нужно контролировать время жизни руками либо полагаться на рантайм. Если получилось скомпилировать программу, то оно как-то само всё делается, причём максимально эффективным способом.
> зачем была введена концепция владения? Какую проблему она решает?
Zero cost garbage collector.
Ящитаю.
Наверное это потому, что они работают в рантайме, не думал? Впрочем, в расте этого добра тоже навалом да ещё и в нескольких вариациях.
На куче не может быть zero cost памяти. И в расте всё тоже в рантайме работает. Разница со смарт поитерами только в наличии боров чекера - в крестах ты можешь взять ссылку на смарт-поинтер и проебать объект, по производительности разницы никакой нет.
>>26987
Речь о том, что концепция владения относится не только к умным указателям.
Соре, но пожалуй я больше в этой специальной олимпиаде участвовать не буду. В прошлый раз мне доказывали, что владение и мув это одно и то же. В этот раз, что владение и умные указатели это одно и тоже. Сами вбрасываете, сами и доказывайте.
>но это означает пересказ всего растбука
а можешь кратко для примера пару кейсов без расписывания? Мне просто понять направление и масштабность
Читаю растбук и там как бы вся книга - последствия введения концепции владения, а не профиты
Нет, классический пример с итерацией по контейнеру анон уже приводил >>26367. Есть два места, где мы обращаемся к вектору как к структуре данных — проверка что итератор достиг конца вектора в конце шага цикла и изменение размера контейнера в теле цикла. Получается один читатель и один писатель существуют одновременно. К чему это приводит, сам видишь.
https://ideone.com/zUXA5R
Про умные указатели. В плюсах это unique_ptr и shared_ptr + weak_ptr. Прямые аналоги в расте это Box и Rc. Почему-то чел выше считает, что они заменяют концепцию владения, я хз почему.
Концепцию владения нужно рассматривать вместе с другими основными механизмами управления памятью в расте — заимствования и времени жизни, потому что без них программы писать можно конечно, но грустно и не очень эффективно для языка, предназначенного для системного программирования в том числе.
В целом, этим решаются базовые проблемы управления памятью, которые опять же >>26367 обозначил:
- нулевые или висящие ссылки
- двойное удаление
- пропущенное удаление
- гонки
Тебе похоже непонятно что такое гонка, ну так вот пример с вектором >>27194 это она и есть.
Это как бы прямые результаты. Но косвенно действительно очень много последствий. Чтобы далеко не ходить за примером посмотри на >>26032. Я пытался объяснить поведение компилятора в >>26097. Вкратце, компилятор не дал некорректно воспользоваться структурой данных и сделал это благодаря владению и заимствованию.
>пикрил
Всегда проигрываю с этих выкрутасов с классиками, нахуя было создавать такой язык? Чтобы не скушно было что ли лол?
Мимо-сишный-байтослесарь
> Почему-то чел выше считает
> я хз почему
Это латентный педик, который ИТТ "гоняет трансов". Вместо того, чтобы признаться себе в том, что ему нравятся хуйцы. В связи с таким сложным подавлением своих желаний, дурачок объявил войну "пидоrustу" и срёт здесь по КД уже который тред.
Ситуация в общем-то энциклопедичная.
>К неумению писать код?
>>27323
>Откуда вот такие дебилы лезут? Какой код написал, так он и работает.
Вот-вот, раст тем и хорош, что не нужно думать обо всех подводных камнях (и высокомерно называть это умением писать код либо переходить на оскорбления). Тебе просто не дают возможности сделать такую и другие подобные ошибки. Я лично люблю когда машина делает за меня рутинную работу.
>>27323
>Это ты не знаешь базовых понятий. Какая нахуй гонка в однопоточном выполнении.
>>27328
Что шаблон порвался? Ну назовите это как-то по другому или дополните пример многопоточностью, где ваша фантазия? Писал так, чтобы было понятнее о чём речь. Я если честно принципиальной разницы не вижу. В одном потоке можно даже сдуру дедлок сделать. Суть проблемы не меняется от количества потоков, только сложность отладки.
>не нужно думать обо всех подводных камнях
В пидорасте тоже полно неявной хуиты как в плюсах, смысл одно говно заметь другим аналогичным говном?
>Ну назовите это как-то по другому
Давай мы тебя не будет мужиком называть, а по-другому.
>Я если честно принципиальной разницы не вижу
Дак ясно всё с тобой, даунёнок.
>полно неявной хуиты как в плюсах
Вся хуита в расте вылазит на этапе конпеляции, в отличие от.
>Дак ясно всё с тобой, даунёнок.
Даунёнка ты в зеркале видишь, дегенерат. Пока ты только в лужу пердишь, бросаясь голословными утверждениями.
>-Вся хуита в расте вылазит на этапе конпеляции, в отличие от.
>-Анус ставишь?
>-РЯЯЯЯ УИИИ
Безопасен снаружи и опасен внутри лол
> Я лично люблю когда машина делает за меня рутинную работу.
Питонист, ты точно в нужный тред зашёл?
И да, спасибо за объяснение, анон!
Ну я имел в виду именно это, да.
https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
Кстати, в этой главе авторы не слова не упоминают про многопоточность, хотя это безусловно самая неприятная в отладке ситуация. Местным обитателям потоки видимо кажутся какими-то магическими сущностями наделёнными особыми свойствами. На деле это просто абстракция над CPU, которую обычно реализуют в ядре и оборачивают в виде удобных библиотек для прикладных программистов. Но ничего не мешает тебе самостоятельно сделать подобную абстракцию в своей программе и запускать её на одном ядре. Кроме твердолобости конечно, лол.
ну вот там я и читал и объяснение Data races еще больше запутало - эту тему можно было как-то больше разжевать, чтоб раскрыть что именно под этим понимается. Там есть намек на многопоточку (similar to a race condition), и это меня смутило (вроде намек есть, а прямых слов нет)
Ты создал строку и начал асинхронную запись в файл типа как здесь: https://learn.microsoft.com/en-us/windows/win32/fileio/synchronous-and-asynchronous-i-o
И не подождав на ивенте решил эту строку затереть. А в это время контроллер твоего SSD читает твою память и записывает какой-то мусор. Вот и получается, что никаких потоков, по крайней мере явно, ты не создаёшь, а гонка есть.
Или ты подписался на какой-то коллбек и забыл отписаться вовремя. А потом этот коллбек триггерится и расхуяривает тебе всю кучу. Код полностью однопоточный и синхронный, но искать ты это будет весь день.
> потоки
> абстракция над CPU
Угомоните уже этого дегенерата. С каждым разом всё кринжовее и кринжовее выдаёт перлы.
>>27652
Слушай, ну если удобнее думать про многопоточность в этом контексте, то так и делай, ничего плохого в этом нет на самом деле. Я сам именно так себе это и представлял, когда читал растбук. Просто когда начинаешь самостоятельно что-то пробовать писать, то приходит осознание, что это относится не только для многопоточности.
>>27607
Ну вот держи, набросал на скорую руку:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=fc1251d48c7448d92ca1e0b4a0e6d0bd
Раскомментируешь 111 строку, получишь классический дедлок, вызванный неправильным неправильным порядком блокирования ресурсов (они всегда должны блокироваться в одном и томже порядке).
Я хоть и назвал тут всё терминами связанными с многопоточностью для облегчения понимания, но по сути тут в одном нативном потоке обрабатывается две очереди сообщений. При этом сообщения управляют блокировкой некоторых ресурсов. Только не спрашивай меня, зачем в одном нативном потоке обрабатывать две очереди, я с таким в жизни никогда не сталкивался, поэтому и написал "сдуру". Ну можно представить, что какие-то команды поступают с двух разных сокетов, данные с которых поток ожидает через select() если есть его аналог в расте. Наверное это больше на жизнь похоже.
Что, шаблон продолжает рваться и трещать, дебилушка? Я так-то под эмбед пишу на сях, работал с embOS, сейчас проект на FreeRTOS. Так вот, там нет ни потоков, ни процессов, сюрприз. Вместо них таски. Но почему-то есть параллелизм со всеми своими проблемами. На одноядерном процессоре, кстати.
Что ты там абстрагируешь на ЦП, клован. Аппаратные ядра ЦП не имеют вообще никакого отношения к системным потокам.
> Аппаратные ядра ЦП не имеют вообще никакого отношения к системным потокам.
Ну хоть в чём-то ты со мной согласен.
>коллбек триггерится
выполняется в отдельном потоке? Обычно же берется поток из пула. Ну то есть для работы в юзерспейсе обязательно нужен поток
>выполняется в отдельном потоке?
Необязательно. Это может быть ивент луп за двумя слоями абстракций.
так операционка предоставляет выполнение только в потоке
да и ивент луп оперирует пулом потоков
Да есть конечно. Вот классное видео, если интересно по быстрому глянуть, в котором объясняется как поморгать диодом на голом железе: https://www.youtube.com/watch?v=jZT8APrzvc4
Есть куча проектов всяких RTOS, чтобы не писать всё в одном unsafe: https://arewertosyet.com Мне ещё попадались какие-то коммерческие разработки.
Вообще был в своё время интересный стэнфордский курс CS140e, в котором авторы обучали расту на примере разработки своей ОС: https://cs140e.sergio.bz Видео, кстати похоже писал чувак, проходивший этот курс.
я в мк не очень разбираюсь, но хочу поучить раст, в том числе в будущем и для этого. А ты разбираешься в мк, можно задать пару вопросов?
>И не подождав на ивенте решил эту строку затереть. А в это время контроллер твоего SSD читает твою память и записывает какой-то мусор.
Это не так работает, упрощённо:
1) ты заполнил буфер в ядре своим юзерспейсовым говном, тебе вернули управление
2) ты (твой планировщик) опять сделал системный вызов со своим юзерспейсовым говном, тебе вернули ошибку EAGAIN, потому что буфер в ядре ещё занят предыдущим твоим говном
3) планировщик в ядре вызвал старт драйвера ссд и тот стартовал дма передачу
4) ..
5) тебе вернули управление ..
6) контроллер ссд дёрнул прерывание/дма часть выставила флаг о завершении передачи -> ядро перемещает указатель в буфере (высвобождает часть), на следующем системном вызове твоё говно скопируется в освобождённую часть и процесс повторится
Это всё если ты не используешь какой-нибудь метод эвентов по типу селектов/полл/еполл, в случае с последними всё ещё проще, какая тут может быть гонка?
Во-первых, это никак не следует из доков. Кто мешает запинить память и сразу DMA-шить в буфер юзера? Во-вторых, пусть ты сделал два асинхронных вызова в один и тот же буфер и потом позвал WaitForMultipleObjects, и оба ивента завершились одновременно. 1. Что будет в буфере? 2. Куда скопируется результат, если буфер уже дропнут или переаллоцирован?
Да, и? Я сделал два неблокирующих чтения в один буфер и стал ждать на ивентах. Получаем гонку в формально однопоточной приложухе. Бинго? То же самое можно получить в какой-нибудь куде.
аноны, остановился в изучении на теме "модули" и возник вопрос: а есть ли в природе пример, где модуль приватный? То есть, если есть код в приватном дочернем модуле - он сам не вызовется, значит его надо вызывать из родительского модуля. Но чтобы его вызвать из родительского - надо этот дочерний сделать публичным. Итого: все модули должны быть публичными?
> а есть ли в природе пример, где модуль приватный?
Да, есть пример в астрофизике: чёрная дыра, собсна. Полностью приватна от всей остальной Вселенной. А смысл?
так в том-то и вопрос: а зачем делать модули по умолчанию приватными? Зачем вообще вводить для модулей концепцию приватности/открытости? Чтоб перед каждым модулем писать pub?
В растбуке это поясняется. Я уже не помню, а открывать лень. Давай ты сам откроешь.
Для того чтобы твои юзеры не могли сломать логику твоего крейта, вызывая не те функции не в том порядке.
В свете современных реалий долбиться в жёпу или нет далеко не всегда зависит от твоих планов. Так что, однозначно учить.
А я не очень разбираюсь в программировании на расте под MCU. Вопросы задавать тебе никто не может запретить.
Ты интересуешься растом и мк - этого достаточно
Расскажи в двух словах, если сможешь, что за RTOS такие, для чего они, как использовать. Я пока на интуиции могу сказать, что это такой код, который подключается как библиотека, используется как фреймворк, где ты вкрыпываешь свой код в точки расширения. Сам по себе предоставляет абстракции типа потока, семафороф разных. Компилится с твоим кодом в один бинарь и заливается на мк. Где прав/где фигню нагадал? Чем можешь дополнить? Еще интересует, но предположений нет: поддерживают ли эти оси сон? Ну то есть, если задачи нет - он уходит в сон, чтоб мк потреблял по минимуму или ему приходится все равно поддерживать работу rtos?
Второй вопрос: я могу писать на расте для есп32 (лежит такая, как-то игрался)? Или раст поддерживают только определенные мк? Ну то есть там же разные процессоры, разные архитектуры, под какие архитектуры может компилить раст? Или обязательно еще должна быть инструментальная поддержка пот производителя? Алсо, когда игрался с есп, где-то видел какой-то конфиг с частотами там и все такое. Это как и куда задавать, если писать на расте?
Буду рад, если сможешь ответить хоть на что-то
>Внутри одного файла вышестоящий модуль может обращаться к нижестоящему модулю
нет же
и файлы вообще не при чем, тут роляет дерево модулей
>>29021
>>29132
>>29236
В общем, я нашел ответ на свой вопрос: смысл в приватных модулях есть, так как к нему имеют доступ братья (элементы одного модуля)
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=967c510e9d42b551950c17e102dc7356
даже внутренний модуль закрыт, но доступ получить можно
Ебать дебил.
>Но все скрипты придётся писать самому
Поджавоскриптованный соевый зумерок-пидорок не палится.
https://cmake.org/cmake/help/latest/command/enable_language.html
Можешь поискать в этом списке Rust.
Я тебя понял, соя.
>Где прав/где фигню нагадал? Чем можешь дополнить?
Да в в целом всё верно. Ещё могу сказать, что обычно вендор железки предоставляет Board Support Package (BSP). Это такой пакет из ОС и драйверов, с примерами. Берёшь какой-нибудь и начинаешь его под свою задачу адаптировать. Но конечно никто не мешает выбросить это всё и сделать руками, если конечно имеется вся необходимая документация.
>Еще интересует, но предположений нет: поддерживают ли эти оси сон? Ну то есть, если задачи нет - он уходит в сон, чтоб мк потреблял по минимуму или ему приходится все равно поддерживать работу rtos?
Да есть конечно. Но ты сам явно указываешь когда уйти в состояние сна. При этом нужно не забыть самому усыпить всю периферию ну и сделать какие-то действия, которые требуются в твоей конкретной системе (таски там засаспендить например, или обнулить какой-нибудь контекст).
>я могу писать на расте для есп32
да
>Ну то есть там же разные процессоры, разные архитектуры, под какие архитектуры может компилить раст?
https://doc.rust-lang.org/rustc/platform-support.html
>Алсо, когда игрался с есп, где-то видел какой-то конфиг с частотами там и все такое. Это как и куда задавать, если писать на расте?
Хз что за конфиг ты имеешь в виду. Если не с нуля писать будешь, то думаю найдёшь аналоги. Если с нуля, то читать документацию по железу.
Спасибо, анон!
Но еще пара вопросов осталась
>Это такой пакет из ОС и драйверов
Драйверов? А что за драйвера и что они делают?
>указываешь когда уйти в состояние сна
А что для этого надо? Дергать код, который в референс мануалах к платам или ос предоставляет какуют-то абстракцию? И да, что происходит после пробуждения? Типа рестарт и запуск по новой или пытается восстановить контекст и продолжить работу с места, который останвился? Если второе, то кто за это отвечает: мк, ос?
ох ты ж огромное тебе спасибо - тут надо курить, но есть откуда копать!
Один только совет, не стоит на расте писать фирмвари, раст не для этого всё-таки.
>не стоит на расте писать
Слова не мальчика, но мужа.
Алсо, на линкедине сейчас микрософт безуспешно ищет челов со знанием раста и опытом в гипервизорах. Все успели податься?
Почему? Разве это не системный язык?
>не стоит на расте писать фирмвари
>системный язык
ну вот все и встало на свои места, очередная джава/сисярп
>Драйверов? А что за драйвера и что они делают?
Мммм, драйвер — это код, управляющий каким-нибудь периферийным устройством.
>А что для этого надо? Дергать код, который в референс мануалах к платам или ос предоставляет какуют-то абстракцию?
Вручную — это когда ты пишешь всякие значения в разные управляющие регистры процессора и других подключенных устройств. Но обычно есть какой-то HAL (hardware abstraction layer), собственно набор тех самых драйверов, который идёт в составе того самого BSP и там уже всё это написано для тебя. ОС не предоставляют таких интерфейсов. Как ты говорил, это скорее фреймворк для построения прошивки.
>И да, что происходит после пробуждения? Типа рестарт и запуск по новой или пытается восстановить контекст и продолжить работу с места, который останвился? Если второе, то кто за это отвечает: мк, ос?
Да как сам напишешь, так и будет. Только выключение/включение с восстановлением контекста называется гибернацией, а сон — это перевод процессора и периферии в энергосберегающий режим, из которого они выходят по таймауту или по какому-нибудь сигналу. Работа прошивки в таком случае не прекращается, очевидно.
>Но есть одно но, синглтон делает веб запросы и при любом локе застревает на секунду, а то и больше.
Не понял, а чего ты хочешь? Чтобы можно было из разных потоков его дёргать одновременно и играть в русскую рулетку, когда эта конструкция развалится?
RwLock юзай вместо мудикса.
Ну если тебе мутировать объект не нужно то мб RwLock вместо мутекса взять? Сколько угодно читателей можно будет иметь одновременно. Ну или ещё может как вариант во время когда ты держишь лок просто дать команду синглтону чето сделать (послать запрос) и дать ему колбек который дёрнуть когда будет ответ и сразу по фасту съебаться из критической секции и снять лок. Или ещё может не давтать колбек а давать команду синглтону сделать запрос и обновить своё внутренне состояние когда будет готово и после отдачи команды снимать лока и на вызывающей стороне изредка поллить синглтон на предмет готовности результата, ну либо может не поллить а сделать через кондвар какой-нить - типа вызывающий код блокируется на кондваре а синглтон обновляет кондвар когда ответ готов
Вдогонку
>передать референс в ансихронный tokio::spawn блок
Ясен хуй не нравится, это recipe for disaster потому что хуй знает будет ли твой референс валиден когда его величество асинхронный рантайм соизволит начать выполнять таску. В std::thread есть скоупед потоки для этого, а в токио хз. Как ты это ансейфом решать хотел? Делать сырой указатель из референса? Ну так проблема никуда не девается если ты не на 100% уверен что он будет валиден когда будешь его разименовывать его
Раз это синглтон, не проще мувнуть его в отдельный тред, а запросы через каналы mpsc буферизированные посылать? Где-то видел такие, которые и в синк и асинк могут одновременно.
>есть какой-то HAL
Он для каждой борды свой? То есть не универсальный, а производитель создает свой со своим набором АПИ?
>>31095
>Да как сам напишешь, так и будет
А по умолчанию? Ну вот я ввел в сон, потом таймер стригернул - что дальше? Что делает мк? Какие инструкции, с какого месте?
>>31095
>Работа прошивки в таком случае не прекращается
А что ты под этим имеешь в виду? Что все контексты сохранены, что все выполняется? Просто я читал про разные виды сна когда-то по-диагонали, и там процессор чуть ли не выключался, в работе оставался таймер. То есть ты хочешь сказать, что при пробуждении по таймеру, например, автоматически платой в кэш загрузится все то, что было до сна, стэки тоже и процессор просто продолжит оттуда, откуда остановился? Не очень понимаю как это в коде выглядит... Он продолжит выполнять все то, что идем после вызова sleep()?
Если честно не знаю как это должно работать, потому что запрос у меня блокирует поток пока не резолвнется. Поэтому и раскидал параллельные запросы по потокам. Сделал через RwLock как тут советовали, в принципе нормально, спасибо анонам
Пост писал трансфоб
Бери токио и не еби мозги
У меня в целом похоже, но вместо Box у меня Arc::new(RwLock::new(worker))
>Он для каждой борды свой? То есть не универсальный, а производитель создает свой со своим набором АПИ?
Да есть конечно попытки сделать что-то универсальное. Но лично я отношусь к этому как кроссплатформенной разработке десктопных приложений. Прекрасная утопия. Для несложных проектов наверное применимо, но как только что-то посложнее делаешь, то приходится жрать, что китайцы дают в проприетарном виде без доков...
>А по умолчанию? Ну вот я ввел в сон, потом таймер стригернул - что дальше? Что делает мк? Какие инструкции, с какого месте?
Ну вот следующую инструкцию и продолжит делать, после обработки прерывания, которое пробудило устройство. Но от железки зависит конечно в первую очередь, сложно говорить за все. Возможно может потребоваться нетривиальное восстановление контекста, которое слишком долго делать в обработчике прерывания.
>Просто я читал про разные виды сна когда-то по-диагонали, и там процессор чуть ли не выключался, в работе оставался таймер.
Это действительно так. В популярном кортексе например их парочка и вендоры ещё бывают свои добавляют. Чем экономичнее режим тем меньше он отличается от полного выключения.
>То есть ты хочешь сказать, что при пробуждении по таймеру, например, автоматически платой в кэш загрузится все то, что было до сна, стэки тоже и процессор просто продолжит оттуда, откуда остановился?
Как писал, зависит от режима и железа. Если говорить про тот же кортекс, то обычно ничего там никуда во сне не девается. Т.е. оперативка хранит содержимое, регистры тоже. Обработали прерывание и вперёд, дальше молотить.
Вообще, я если честно слабовато эту тему знаю. Сейчас порылся по коду проекта, над которым сейчас работаю, так там WFI (инструкция, которая переводит в режим сна) есть и в HALе и в ядре RTOS. Напиздел я получается, насчёт того что в ОС не бывает. Я правда глубоко не стал лезть, используется ли у нас где-то сон из FreeRTOS. Возможно там разница как раз в выборе режима, типа FreeRTOS переводит проц в обычный sleep при необходимости, например, когда все таски заблокированы. Deep sleep из HALа точно ручками дёргаем.
>Он для каждой борды свой? То есть не универсальный, а производитель создает свой со своим набором АПИ?
Да есть конечно попытки сделать что-то универсальное. Но лично я отношусь к этому как кроссплатформенной разработке десктопных приложений. Прекрасная утопия. Для несложных проектов наверное применимо, но как только что-то посложнее делаешь, то приходится жрать, что китайцы дают в проприетарном виде без доков...
>А по умолчанию? Ну вот я ввел в сон, потом таймер стригернул - что дальше? Что делает мк? Какие инструкции, с какого месте?
Ну вот следующую инструкцию и продолжит делать, после обработки прерывания, которое пробудило устройство. Но от железки зависит конечно в первую очередь, сложно говорить за все. Возможно может потребоваться нетривиальное восстановление контекста, которое слишком долго делать в обработчике прерывания.
>Просто я читал про разные виды сна когда-то по-диагонали, и там процессор чуть ли не выключался, в работе оставался таймер.
Это действительно так. В популярном кортексе например их парочка и вендоры ещё бывают свои добавляют. Чем экономичнее режим тем меньше он отличается от полного выключения.
>То есть ты хочешь сказать, что при пробуждении по таймеру, например, автоматически платой в кэш загрузится все то, что было до сна, стэки тоже и процессор просто продолжит оттуда, откуда остановился?
Как писал, зависит от режима и железа. Если говорить про тот же кортекс, то обычно ничего там никуда во сне не девается. Т.е. оперативка хранит содержимое, регистры тоже. Обработали прерывание и вперёд, дальше молотить.
Вообще, я если честно слабовато эту тему знаю. Сейчас порылся по коду проекта, над которым сейчас работаю, так там WFI (инструкция, которая переводит в режим сна) есть и в HALе и в ядре RTOS. Напиздел я получается, насчёт того что в ОС не бывает. Я правда глубоко не стал лезть, используется ли у нас где-то сон из FreeRTOS. Возможно там разница как раз в выборе режима, типа FreeRTOS переводит проц в обычный sleep при необходимости, например, когда все таски заблокированы. Deep sleep из HALа точно ручками дёргаем.
Аноны, сейчас очень сонный, возможно пишу бредовый вопрос, но изучая раст, тестил разный свой код, проверял идейки и нагенерил вот это: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=807d460d9c7a5d3d94f3bd43449927ed
Объясните мне, плз: правильно ли я понимаю, что тут одной строкой владеют два объекта? Интуиция подсказывает, что такого быть не может, так как по правилам владения раста владеть объектом может кто-то один, но я тут вижу одну строку и ДВЕ переменные b, которые владеют одной строкой
Помогите решить внутренний спор
Основной проект на С, но есть небольшие сопровождающие разработки на расте (не под микроконтроллеры). Сам раст ковыряю для общего развития пока, очень интересный и кайфовый язык.
>>32421
>>32426
Вкину свои 5 копеек, вдруг кому-то другому будет интересно. В расте есть механизм pattern matching, который тут применяется. Довольно мощная штука, которая используется не только в ветках match, а по сути при любом объявлении переменной. Она позволяет деструктуризацию образца. При этом владение данными передаётся по общим правилам раста, для чего используются ключевые слова ref и mut, например:
if let Foo(bar) = foo {... // <- передача владением
if let Foo(ref bar) = foo {... // <- заимствование по неизменяемой ссылке
if let Foo(ref mut bar) = foo {... // <- заимствование по изменяемой ссылке
Для удобства, если образец, который ты сопоставляешь, сам является ссылкой, то и связывание происходит по ссылке:
https://doc.rust-lang.org/reference/patterns.html#binding-modes
Таким образом в первом 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.
Сперма.
> критический баг в std
Никогда такого не было и вот опять. Прям чувствую безопасность.
> improperly escaping arguments
Там вообще ебучий цирк с конями в std под виндой, как будто студенты писали. Например тот же принт, конвертирующий два раза строку из utf-8 в utf-16, вместо вызова SetConsoleCP. Это сразу было понятно, что снизив уровень входа с помощью "безопасности", пришедшие питонисты начнут писать такое забагованное говно, что нейросети позавидуют.
>Например тот же принт, конвертирующий два раза строку из utf-8 в utf-16, вместо вызова SetConsoleCP
В API винды поддержка utf8 появилась примерно вчера, и работает через жопу.
> В API винды поддержка utf8 появилась примерно вчера
XP вчера появился? Ну ладно. CP65001 в консольке как минимум с Висты работает, в XP он тоже был, но я не возьмусь утверждать что cmd.exe корректно шрифты рендерил.
> работает через жопу
Если речь про вывод в консольку, то он работает как часы, никаких проблем нет. Проблемы могут быть только если ты при включенном CP65001 станешь выводить UTF-16 туда.
Претензия к реализации раста в том что у него всё к UTF-8 прибито гвоздями. То что он в рантайме каждую строку конвертит - это пиздец костыли. Я ещё понял бы если он поддерживал UTF-16 строки и можно было бы без конверсии их использовать, но ведь нет.
https://learn.microsoft.com/ru-ru/windows/apps/design/globalizing/use-utf8-code-page
Чтобы винда правильно поняла твою кодировку, нужно указать параметр в какой-то ебать её в сраку эксемельке. То есть, если приложение линкуешь не ты, а просто передаёшь свою либу, то может оказаться, что там настроен какой-нибудь EBCDIC, а твой текст выглядит как даэдрические письмена. И даже не весь WinAPI умеет с этим работать, и иногда всё-равно придется мудиться с этим преобразованием.
И куда ты её деть сможешь? Даже принт не примет её. И она всё так же в рантайме работает, конвертируя строки в UTF-8.
>>34835
> указать параметр в какой-то ебать её в сраку эксемельке
Чел, у тебя документация от WindowsApps, очнись. Это никакого отношения к WinAPI не имеет. Ты бы ещё UWP притащил сюда.
> То есть
То есть ты бредишь, одним вызовом функции консолька переводится в нужную кодировку. Вот правильное место в документации:
https://learn.microsoft.com/en-us/windows/win32/intl/unicode
> И даже не весь WinAPI умеет с этим работать
Ему строго поебать как и чем строка закодирована. Передашь UTF-8 - он будет с UTF-8 работать. Для WinAPI строка это просто указатель на чар.
> придется мудиться с этим преобразованием
Только если в UTF-16 строка. Чем собственно в расте и занимаются, когда можно было не делать этого.
Пиши на языке, который ближе к железу.
>Чел, у тебя документация от WindowsApps, очнись. Это никакого отношения к WinAPI не имеет. Ты бы ещё UWP притащил сюда.
У WindowsApps какое-то отдельное WinAPI?
>То есть ты бредишь, одним вызовом функции консолька переводится в нужную кодировку
А когда вызывать эту функцию? Ты закинул DLL'ку в папку и она каждый раз, когда хочет что-то высрать, твою консоль перенастраивает?
>Для WinAPI строка это просто указатель на чар.
Ну здрасьте приехали. И зачем тогда каждый вызов дублируется с суффиксом A и W, зачем нужны локали, чем Windows-1251 отличается от CP-866?
> У WindowsApps какое-то отдельное WinAPI?
Это вообще совершенно разные вещи. WindowsApps - это свежее крестовое API из 11 винды.
> И зачем тогда каждый вызов дублируется с суффиксом A и W
Затем что в винде есть UTF-16 и всё остальное, сделано для совместимости с однобайтным легаси времён начала нулевых. Всё остальное под А, работает в заданной кодировке, если кодировка указана как UTF-8, то оно и будет.
>Это вообще совершенно разные вещи. WindowsApps - это свежее крестовое API из 11 винды.
И зачем в описании для 11 винды упоминается какой-то левый апдейт для 10? Может потому что это на самом деле обертка над winapi?
>Всё остальное под А, работает в заданной кодировке, если кодировка указана как UTF-8, то оно и будет.
Иными словами, UTF16 - всё также остаётся основной кодировкой, а UTF8 - это бедный родственник, который зависит от глобального состояния или манифестов, которые хер знает кто выставляет и может поменять в любой момент. Я прямо уверен, что винда делает такую же конвертацию, что std Раста.
> Может потому что это на самом деле обертка над winapi?
Нет. Это уже то, на чём встроенный виндовый софт пишется в 11 винде, там WinAPI не используется вообще, это легаси.
> Иными словами
Иными словами ты нихуя не понял.
> UTF8 - это бедный родственник, который зависит от глобального состояния или манифестов
Глобальное окружение и манифесты - это каким будет дефолт. Контроль за кодировками у софта.
> Я прямо уверен, что винда делает такую же конвертацию
Чел, я тебе даже кидал ссылку из документации WinAPI, там нативная поддержка UTF-8. Алсо, виндовый терминал который в 11 винде по умолчанию в WSL окружении переключает вывод в UTF-8 и оставляет линуксовый выхлоп как есть, а не занимается хуитой как растаны с конверсией в UTF-16.
Один абзац текста и 5 абзацев предупреждений. Я такое говно только в консультант+ видел: параграф ХХХ утратил силу.
>Это говно уже окаменело.
>Один абзац текста и 5 абзацев предупреждений. Я такое говно только в консультант+ видел
Какие же пидорасты долбоёбы пиздец. Бегом писать прошивки для баттплаг.ио.
Причина баха?
> Нет. Это уже то, на чём встроенный виндовый софт пишется в 11 винде, там WinAPI не используется вообще, это легаси.
Зуб даёшь? Я ведь сейчас в репу залезу и проверю как они винапи не юзают.
Ну давай. Пикрилейтед в самом SDK, WinAPI там используют только для разработки - в юнит-тестах и при логировании, на случай когда что-то отъебнёт. В сорсах естественно оригинальное WinAPI не трогают, частично оно переписано на крестах для обратной совместимости. Ну и там белым по чёрному написано - первым делом удаляйте все хедеры и либы WinAPI и заменяйте на WindowsApps.
Навернул я этого говна, спасибо. Помимо того, что дока бедная, а от иде там только название, эта самая Ада нечеловечески неудобна. Похоже, что при её создании применялась та же парадигма, что и в жабе: "искуственно переусложнено - значит безопасно". И ты ж, сука, зацени иронию:
☑ вызвать функцию игнорируя возврат - ошибка
◻ харкнуть иксепшон в любом месте и забить на перехват - пожалуйста
◻ нормального Result - нет
◻ хочешь, чтобы твоя память освобождалась сама? - изволь использовать Finalization
У меня была идея использовать аду в алготрейдинге громко звучит только из-за её интервальных типов, которые там то, что доктор прописал. Но без нормального Result - хз, скорее всего забью. Единственный Result, который там можно сделать - тупо контейнер без map и прочего сахара, так как с дженериками там всё очень хуёво, анонимных функций тоже нет.
>вызвать функцию игнорируя возврат - ошибка
Это заебись, так и надо делать, вспомни ещё в Си базовый флаг флаг -Werror.
>харкнуть иксепшон в любом месте и забить на перехват - пожалуйста
Ты просто не понимаешь сути эксепшенов.
>хочешь, чтобы твоя память освобождалась сама? - изволь использовать Finalization
Обычный базовый язык, в спарке вообще куч нет (хотя в новом вроде завезли).
>Ты просто не понимаешь сути эксепшенов.
В Аде смузихлёбский подход а-ля котлин, в той же джаве с ними и то построже. Один хрен, я бы продпочёл Result, но его нет.
>>36088
>Что за IDE?
gnat studio
Говнецо ещё то, но базовые вещи делает. Написано на самой аде + дохрена питона. Чсх, у них есть коммерческая версия под раст. В поставке appimage постоянно чего-то не хватает, вот, например, оно пытается позвать внешнюю утилиту и не может.
Твоего мнения никто не спрашивал. Линкуют потому что могут. И хули ты сделаешь им?
Не буду молчать.
Это поведение по умолчанию наверное для какого угодно компилятора.
Оптимизации включать пробовал? В крестах такого говна нет. Даже в винде если захотеть весь 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/
>В расте же 350+ кб всегда.
Это ложь.
Про манёвры с оптимизацией я промолчу, раст тоже можно до усрачки оптимизировать. Моё сообщение было о другом. Для тех кто не понял — напишу более подробно: LTO нигде по умолчанию не включён и все символы всегда попадают в бинарник. Это так-то нефига не тривиальная задача, исключить ненужные.
Вот с этого я реально ахуел. Андрюхе там уже совсем нехуй делать, уже в открытую издевается над людьми.
> Это ложь.
А теперь попробуй сделать это же под виндой. Раст же вроде безопасный, но по факту он либо выдаст ошибку компиляции, либо скомпилит нерабочий бинарник. И то что у тебя где-то в системе лежит динамическая либа делает ещё хуже, ведь твой собранный файл не портабельный.
> LTO нигде по умолчанию не включён
Зато он почти везде включен при оптимизациях. Но в расте хоть включай, хоть выключай - всё равно насрёт в бинарник или надо таскать с собой либы.
> Это так-то нефига не тривиальная задача, исключить ненужные.
Даже в дотнете с этим справились, кода пилили AOT-компиляцию в нативный код. А ведь там даже есть рантайм-рефлексия.
>does what it's supposed to while keeping its codebase readable, the last point being quite rare in the Rust ecosystem
))
>Зато он почти везде включен при оптимизациях.
Ложь.
>Но в расте хоть включай, хоть выключай - всё равно насрёт в бинарник или надо таскать с собой либы.
Чем насрёт-то?
Остальной оффтопик в виде дотнета, винды и прочих майкрософтовых поделок обсуждать не могу — не пользуюсь их продуктами уже лет 15, кроме гитхаба (увы). Наверное, там действительно всё плохо хотя казалось бы куда ещё...
Я не ГОвнарь, может там как-то по другому это реализовано. Но вон в конце прошлого года Андрюха выкатил костыль в виде автоформатирования с чисткой от неиспользуемых переменных. Челы всё правильно пишут про жопную боль когда хуяк-хуяк делаешь, а автоформат не ослабляет жопную боль, только создаёт потенциальные баги. Вот ты условно в поисках багов жонглируешь переменными, некоторые из которых неиспользуемые, а где гарантия что используемая в данный момент - это то что должно быть по задумке? Автоформат стёр их и всё, код допустим не твой, там может что-то сломано и никто не узнает об этом до появления проблем. В любом нормальном ЯП тебе будут идти варнинги и ты всегда будешь знать что вот там какой-то пердолинг происходил и с ним надо будет разобраться руками.
Отдельно проиграл с пердоли, предлагающего искать в сорсах подчёркивания регулярками.
Ты не старался понять мысль. Это ответ на утверждение, что якобы символы не линкуются если они не нужны. Ты можешь и с динамической линковкой собрать, там не так впечатляюще будет "насрато" конечно, но всё равно будет куча "лишних" символов почему-то.
Рад, что ты со мной согласен.
Так тебе вроде сказали, что с -O3 там не будет этого мусора. А то в одном месте без оптимизаций, а в другом --release с какими-то ключами.
>Так тебе вроде сказали, что с -O3 там не будет этого мусора. А то в одном месте без оптимизаций, а в другом --release с какими-то ключами.
Анус ставишь? То что мне сказали свидетельствует только о непонимании говорящих о том что такое -O3, --release, LTO, динамическая и статическая линковка. Да вы вообще не понимаете как линкер работает, лол. Зато радостно цепляетесь за различия в дефолтных настройках компилятора.
> Да вы вообще не понимаете как линкер работает, лол.
Это ты не понимаешь, ведь unused_fn у тебя используется.
> Зато радостно цепляетесь за различия в дефолтных настройках компилятора.
Так ты покажи что будет по дефолту в расте, не стесняйся. А то сначала про дефолт речь шла, а как до раста дошли так сборка с ключами.
Чел, в сишке нет модулей и все глобальные функции экспортируются. Ты можешь их динамически импортировать в другом бинарнике, как будто это либа, а не исполняемый файл. Поэтому у тебя нет неиспользуемых функций. А вот если бы ты на крестах с модулями написал, то там без явного указания необходимости экспортировать компилятор удалил бы всё это. Учи базу.
>Это ты не понимаешь, ведь unused_fn у тебя используется.
Как она используется и почему без неё всё работает?
>Так ты покажи что будет по дефолту в расте, не стесняйся. А то сначала про дефолт речь шла, а как до раста дошли так сборка с ключами.
Будет как и в любом другом языке при использовании статической линковки. Не помню, чтобы речь шла про дефолты. Первое упоминание этого слова в треде в контексте компиляторов — в моём посте.
Ты так и не показал что будет в расте, только виляешь жопой и никак не можешь объяснить почему у раста такие жирные бинарники. С динамической линковки вдруг перескакиваешь на LTO и обратно.
Ответь на простые вопросы уже: почему LTO в расте не вырезает мусор и зачем ты отделив мусор динамической линковкой притворяешься что его теперь нет?
Автор видоса хоть понимает смысл колясочника в линуксах?
Я смотрю мы уже прекратили обсуждать попадание "лишних" символов в бинарник и перешли к обсуждению жирности последних? Ну так я и не виляю жопой. Я только не согласился с утверждением >>37214, что растовые бинарники весят больше 350Кб безотносительно способа сборки. И привёл наглядный пример. Выводы за меня ты уже сам начал делать, кек. Ладно, чао, эта тема мне уже не интересна, её обсосали 100 раз до этого.
> при использовании статической линковки
А как в расте статически прилинковать всё, чтоб понимать сколько говна он носит с собой? Я вот сейчас собрал под виндой, а там динамически прилинкован рантайм сишки и крестов, на полтора мб, лол. В линуксе наверняка libc линкуется, поверх сотен кб самого раста.
>>37325
> перешли к обсуждению жирности последних
Вроде про это и был разговор? Это ты зачем-то от него уйти пытаешься. То что у тебя там от чего-то очко порвалось не имеет к сути вопроса никакого отношения.
> эта тема мне уже не интересна
Норм ты слился, так и не сказав ничего по сути вопроса.
>А как в расте статически прилинковать всё, чтоб понимать сколько говна он носит с собой?
Он по дефолту так делает, поэтому просто cargo build. Добавление --release этого не меняет, если что.
>Вроде про это и был разговор?
Нет, я это не обсуждал, хотя меня почему-то постоянно пытались вывести на это. Более того, я изначально в >>37199 и раст-то не упоминал, лол. Повторю, мне эта специальная олимпиада не интересна. Другие темы готов пообсуждать.
> Он по дефолту так делает
Нет. Вот тут ты пиздишь в наглую. Запусти и посмотри в рантайме что он налинковал динамически. В крестах под виндой если собрать с /MT, то он реально статический билд сделает, вообще без динамической линковки, аж на 130 кб. Но в расте там две dll висят.
>В линуксе наверняка libc линкуется, поверх сотен кб самого раста.
Кстати, да, это интересный вопрос оказался. У меня такой результат. Получается примерно 700 кб libc и ещё 700кб между растовой библиотекой и libgcc_s (сложно сказать в какой пропорции). Остальное думаю пренебрежимо мало. Хотя и libgcc_s думаю тоже крошечная, доводилось в её исходники лазить.
Почитать про волшебные флаги если интересно: https://doc.rust-lang.org/reference/linkage.html#static-and-dynamic-c-runtimes
Теперь бы ещё узнать что будет если таких либ не найдено. Или libc какой-то очень не той версии, что была при сборке. У ГОвна вроде реально портативные бинарники под линуксом, хоть и жирные в несколько мб.
https://packages.msys2.org/package/mingw-w64-x86_64-binutils
я вообще мингв шелл на постоянной основе в винде использую вместо смд/павершелла, охуенная тема
Под виндой на первом скрине msvc тулчейн, на втором gnu. gnu генерит бинарник аж на 1.1 мб. И нахуя ему сокет я не понял, это хеллоу ворлд, зонды линукса какие-то.
Я кстати, соглы. Особенно, если учесть, что одинаковые страницы памяти всё равно будут общими. Страдает только место на диске, но они всё равно безразмерные нынче.
>>37377
Что-то не очень понял, что ты имеешь в виду. Либ тут никаких не требуется. А если ты запускаешь приложение слинкованное с версией библиотеки, которая не совместима с ядром, то будет упавшее приложение. На винде попроще с этим, там над обратной совместимостью трясутся.
Для малварей важно. Как малвари писать на расте с таким?
Лол, эффективный язык. Может сразу на джаве тогда писать и проблем с боров-чекером не иметь? Ну раз +-100 МБ погрешность
Мы пользуемся растом не из-за размера бинарника, а как раз из-за боровчекера. Нам нравится, когда создаваемые программой данные освобождаются автоматически и zero-cost-ово.
Так в джаве они тоже освобождаются автоматически
>zero-cost-ово
Просто мантры https://verdagon.dev/blog/myth-zero-overhead-memory-safety , такие же как раньше были про маленькие артефакты компиляции
inb4 аррряяя, тебе чего пару мс жалко чтоли, не еби мозг!
Чё тебе пару милисек жалко штоле? Не еби мозг!
>gnu генерит бинарник аж на 1.1 мб.
Он по умолчанию символы не стирает. Надо с -s собирать или strip --strip-unneeded сделать.
https://loglog.games/blog/leaving-rust-gamedev/
В комментах заливают копиум бочками:
https://news.ycombinator.com/item?id=40172033
Я вообще пытался вкатываться в геймдев на Go.
RustRover?
>Даже в дотнете с этим справились, кода пилили AOT-компиляцию в нативный код. А ведь там даже есть рантайм-рефлексия
Она не работает, там надо вручную прописывать элементы, которые ты через рефлексию трогаешь, чтоб linker лишнего не порезал и прилага не упала в рантайме. Те же грабли с разными ioc-контейнерами, json-парсерами и всякой лабудой, которая работает на рефлексии или уже, подозреваю, на кодогенерации рослином. Да и как ты себе представляешь, то linker не порежет тебе класс, например, который ты в рантайме определяешь?
мимохочусбежатьнарастсдотнета,провожуразведку
> Особенно, если учесть, что одинаковые страницы памяти всё равно будут общими
так разные файлы будут лежать в разных страницах, не?
Итак, выяснили что раст не для системного программирования, теперь выяснили, что раст не подходит для гейдева. Как так, пидорасты?
>-Один хрен, я бы продпочёл Result, но его нет.
>-Ну на вот тебе Result
>...
>func().unwrap()
>func1().unwrap()
>func2().unwrap()
Ты выше почитай, челик разрабатывал реальные игры на пидорасте в течении 3-х лет, его мнение чего-то да стоит, а твоё - тупо мусор.
Там выше челик жаловался, что в аде можно не обрабатывать исключение, мол, не правильно это, а ты тут с затычкой в виде ? прибегаешь лол.
>пук-среньк, обратите внимание уже на эту ссылку
Челик, просто иди нахуй. Мало у кого есть желание читать чей-то километровый провокационный высер на неродном языке. Хочешь обсуждения — напиши вкратце про что там или хотя бы что тебе больше всего понравилось.
Так это и есть обработка, не так разве? Минимально придётся типы ошибок приводить.
Так прочитай хотя бы второй параграф. Ты делаешь вывод о целом языке исходя из очень специфического опыта конкретных людей. Там автор сам пишет, что его опыт нельзя экстраполировать. Повторю, там много всего понаписано, возможно по делу, но лично у меня нет никакого желания в это вникать. Тем более, чтобы беседу с тобой вести, сам-то ты этого не делал.
>Повторю, там много всего понаписано, возможно по делу, но лично у меня нет никакого желания в это вникать.
Вся суть пuдopaшки. Если кто не понял, годная статья, стоит вообще всем читать.
Ого, не знал. А как это работает? Ядро не устанет память сверять кусок за куском? Вряд ли для этого хэш-мапу заводили
Хэшировать страницы дешевле, чем грузить-выгружать.
Да устаёт, конечно. Хешмапой это и реализовано, насколько я знаю. Но я слукавил, на самом деле это нигде не включено по умолчанию.
Ага, насрал дезу тебе за щеку.
let x = {
let y = 1;
y + 1
}
А в чём проблема?
Ты заблудился? Вали нахуй с треда.
Завтра ищешь в интернете книжку Introduction to the theory of computation. Пофиг если ничего не поймешь. Затем идешь на www.agner.org и изучаешь микроархитектуру процессоров от корки до корки. Потом зубришь, именно, сука, вызубриваешь нотацию гомотопной теории типов, чтобы от зубов отскакивало.
Когда напишешь свой первый однопроходный компилятор, по пути изучив ассемблер, скачиваешь и изучаешь изучаешь любой фреймворк для кроссплатформенной кодогенерации, рекомендую LLVM или C--. Как переделаешь компилятор, чтобы имел по крайней мере вывод типов по Хиндли-Милнеру, можешь идти дальше - тебя ждет увлекательный мир оптимизаций. Многопоточность, сверхбыстрая векторизация, ленивые итераторы. Отсос хиккующих выблѣдков / просто неудачников типа Тима Пайка или сисярп/джава-удососов, которые сосут уд по жизни не заставит себя ждать и уже через пол года твой фаундейшен ты будешь получать такие суммы, что любая трансдевочка будет течь при одном упоминании твоих контрибьюторов.
Я уже писал компиляторы без всей этой лабуды по книге дракона (Ахо, Ульям).
Речь про то, что программисту надо следить за этой точкой с запятой в конце, от чего зависит семантика. Это настолько тупое решение, что не передать.
В кокаиновом
Зато односложные лямбды выглядят заебок.
let double = |x| x * 2;
Чем людям мешают эти точки с запятой? Нанюхаются своего питона, понимаешь.
> От чего зависи семантика.
1. Любой блок возвращает что-то. Даже пустой блок возвращает ().
2. Лишний ; меняет тип взвращаемого значения всегда, компилятор почти сразу находит несоотвествие типов и сообщает об этом разрабу.
Твоя проблема надумана.
Но return нельзя использовать, т.к. он сам по себе возвращает ! или never (https://doc.rust-lang.org/std/primitive.never.html). Ну и в замыкании его семантика будет неясна. А в чём принципиальная разница между отсутствием ; и закорючкой в конце?
Чтобы использовать ? у тебя в сигнатуре должен быть явно задан тип, для которого этот ? разрешено использовать. То есть, какую попало ошибку ты при помощи ? не пробросишь.
Если возможных ошибок несколько и все охота пробросить, то можно привести через enum к общему типу ошибки и пробрасывать уже его или проще через специальные сторонние макросы.
>в аде
Скоро типы-диапазоны завезут и ада станет совсем не нужна. Ну или я даже не знаю, какие у неё ещё есть киллер-фичи, которых нет в расте.
https://github.com/rust-lang/rust/pull/107606
https://rust-lang.zulipchat.com/#narrow/stream/144729-t-types/topic/Implementing.20Enum.20Variant.20Types/near/322878006
https://github.com/disiamylborane/ranged_integers
Опыт работы на с/с++ от 6 лет, высшее образование, знание линукса, сетевых протоколов, алгоритмов и структур данных
Под Виндоуз. Опыт администрирования БД приветствуется. Знание Python будет большим плюсом.
Обычно числа с 0 считают, а не с 1. Дополнительную переменную в расте не обязательно заводить, можно написать что-то вроде:
(fib2, fib1) = (fib1 + fib2, fib2). Вместо цикла можно использовать свёртку: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f2e2094c70a2e1cc21dca59b2b12f8ea , если эстет дохуя.
Но ведь числа Фибоначчи - это математическая последовательность, а не компьютерный массив данных, поэтому логично считать её начиная с 1, а не с 0.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=8832f228da0cc71237ad7910421d6914
Последовательность, да, которая определяется так:
fib(0) = 0
fib(1) = 1
fib(n) = fib(n - 1) + fib(n - 2)
Логично, когда ты пишешь функция вычисления числа Фибоначчи, что её аргументом является не порядковый номер числа, а некоторому числу. Которое, даже может быть отрицательным.
Сори, неправильно выразился, когда писал про подсчёт чисел. Не проснулся ещё.
Тестовое дали, потом недели 3 или месяц проверяли, детально придирались, чуть ли не к каждому слову, что я память лишнюю высвободил, по растовским меркам если ты сделал временную переменную и скопировал значение туда, то это нохайр автоматом.
Ты думаешь у тебя прям другой случай и всё будет НИ ТАК? И не будет миллипридирок к лишнему освобожденному байтику? Лул.
Конечно. Я талантливее, способнее и самостоятельнее большинства кодерков. А проблемы с лишними байтиками это чисто рабочий момент который разрешается на уровнях кодревью/дрочева дев окружения/репортов с прода.
2738x1708, 0:14
Нахуй в браузер заходить. В 2k24 код вот так пишут. Хорошая IDE умеет за тебя писать код.
Напиши туда инструкцию, чтобы она написала тебе код программы, которая висит значком в трее и контекстным меню показывает опции
> Следующая картинка
> Показать окно
> Выход
Окно пикрелейтед.
Посмотрим, как твой цопелот справится.
Ну оно не умнее меня. А я не знаю какие либы надо для этого взять сходу. Оно код пишет, winapi знает, но импортит странное, какая-то ебля с либами нужна. На крестах с инклюдами ебля, он тоже сам не может справиться, надо в симейке дрочить что-то. А вот на питоне сходу написало рабочий код на qt. Можно дальше просить хотелки, тут я просто попросил иконку в трее с меню сделать. Ты не думай что оно тебе рабочий софт на тысячи строк может написать с нуля, только отдельные куски по реквестам, хоть какой-то контекст нужен нейронке.
Я его убрал и третий час пытаюсь найти галочку
Да. Rc не позволяет менять внутренние данные, а твой код требует изменяемой ссылки. Именно для этих случаев и существуют разные Cell'ы.
Ннно ведь боровчекер лучше тяночьки!!!
Да
Нет
Так я его и использовал, посмотри на скрин. Его можно применить в сортировке, но не для того чтобы помещать числа с плавающей точкой в кучу (BinaryHeap).
К счастью, в Индии английский — второй официальный язык. Поэтому индус смог прочитать условие задачи и понять, что там нужно делить одно простое число на другое.
Прекрасное понимание школьной математики, только это никак не упрощает решение этой задачи. Всё равно придётся писать обёртку имплементирующую Ord, только не для f32, а для пары чисел.
Для простой сортировки можно использовать вместо total_cmp. Я правда не уверен, что это будет эффективнее на процессорах с FPU.
> алгоритмические задачи
> делить
Ты ёбнулся? Никогда не используй плавающую точку если её нет в исходных данных.
> не упрощает решение этой задачи.
Я тебе не просто ускорил хиндукод, а спас от ошибок. Ты ведь и не знаешь, что некоторые i32 равны после преобразования в f32.
К данной задаче это никак не относится. Пиздец, просто невозможно предугадать к чему могут доебаться на дваче после твоего поста. Слишком много специалистов по всему.
С этим как раз понятно как работать, начиная от использования overflowing_mul, и заканчивая переходом в 64/128 бит.
А умение работать c проёбом точности обычно идёт с курсом по численным методам, где от тебя сразу спрашивают с какой точностью ты хочешь решить задачу.
Хз, какое слово в спамлисте, пишу ответ скрином, спасибо абу, пошёл нахуй.
Ссылка на плейграунд: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a30f9a25242197bc48ccf4e19cd07c1a
Возьми и оберни.
Если вдруг появился тип Rc<RefCell<HashMap<&'a str, Matrix<f64, 4, 4>>>>>, то проще сделать алиас.
Выводится будет алиас или вот эта лапша? В тех же крестах можно полностью скрыть тип, но тут наверняка будет всё так же эта срань.
Лапша. Хотя может есть какая-то опция в раст-аналайзере. Просто не делай синтаксических ошибок, лмао.
емакс что-ли? мощно
Свой window manager?
Да хз, мне так глубоко лезть желания нет. Да и профайлер это больше про поиск медленной функции, а тут скорее надо сравнивать дизассемблер для разных вариантов.
То ли дело питон.
Пробовал эту штуку кто-нибудь? Вот прям можно для мобилок хоть счас норм аппликуху собрать?
самому некогда, иду по горам лазить
Так это очередная веб-параша на вебвью. С таким же успехом можешь взять любой веб-гуй, хоть электрон. На расте уже есть несколько подобных высеров, каждый год новый появляется. Сейчас хеллоу-ворлд собрал, так же как и таури запускается с задержкой в секунду - идёт ебучая инициализация вебвью. Смешно видеть высеры про перфоманс, когда их говно запускается медленнее электрона.
База
Бамп
Шиз не освоил miro и решил захуярить схемку ascii графикой
По теме треда - реквестирую, что с Rust произошло хорошего в контексте промышленного применения за последние 4 года?
Где уже можно пользоваться, где сырое шо пиздец. Вчера на хабре наткнулся на нытье, что раст в gamedev - сырое недоразумение. Это так? А что в других сферах?
Для дебилов стаковерфловнутых раст будет сырым недоразумением даже когда на нём космические корабли будут летать. Для нормальных людей всё уже давно хорошо и можно юзать деінде.
а текстом скниешь?
В вебе ещё как-то терпимо, всё остальное пиздец, да. Причём автобинды на сишные/крестовые либы - это лучшее что есть в расте.
>Шиз не освоил miro
Нормальные люди юзают канвасы в обсидиане вместо этого поделия для вебмакак
Калькулятор и список подлинкованных либ. Получается, без этого зоопарка и не собрать. Но, блин, удобно же. Для мобилок его попробовать, штоле.
Объясните разницу между Cell и RefCell. Я же правильно понимаю что когда они обёрнуты в Rc/Arc разницы по сути нет?
>libxslt
Разве этой мразью еще пользуются? Пятнадцать лет назад ее пытались вкорячить в бэкенд, не вкорячилось.
Содержимое Cell можно забрать только по значению, зато его не надо лочить. C Rc никак не связан.
Это зависимость вебвьюхи гтк-шной.
Разница есть. Cell::get() возвращает копию значения, RefCell::borrow() и borrow_mut() ссылки. Первое подходит для примитивных типов, которые и так обычно копируются, второе для всего остального. Если попробовать объяснить другими словами, то Cell используется, когда необходимо поменять "неизменяемое" значение примитивного типа (т.е. типа, реализующего трейт Copy), а RefCell, когда необходимо сделать проверки заимствования в рантайме, чтобы поменять "неизменяемое" содержимое какого-то значения. Обрати внимание, что есть разница между значением и содержимым.
Лол clion для свободных бесплатных православных сей и плюсов платный, а rustrover для корпоративного богомерзкого раста бесплатный.
То-то жопа у местного дурачка-антикорпораста подгорит.
Зацените, аноны, как можно. Пиздец, конечно, они заморочились, но выглядит прям многообещающе.
Забыл добавить - это дефолтный пример калькулятора, где все изменения я показал на скринах.
Выглядит скорее как хуйня. На нормальных фреймворках гуя хоть на том же дотнете, на имгуи всё ещё примитивнее всё это сильно проще реализуется, без всяких костылей в строках и лапши.
>> Загринтекстил чот
>> Загринтекстил чот не связанное
> Сделал тупонький манявывод
Хейтерки такие хейтерки
Я пробовал этот кал пару недель назад и удалил. Даже вспомнить не могу почему снёс нахуй. Вреде бомбанул от уёбищной подсветки синтаксиса, хуже чем в вскоде.
Да лан? Ну покажи. Вкратце задача - по клику по кнопке в некой группе переопределять надписи и значения всех кнопок из группы, в идеале как у меня в примере - перетрясыванием набора исходных значений (у меня это shuffle).
Собсно у меня есть задача, где надо будет реализовать нечто подобное. Изначально хотел cursive, но там пиздец, потом egui, но там немногим легче. А тут прям самое то.
Почему так? Хочу разобраться.
В расте всё очень плохо с этим, оно в зачаточной стадии находится. Странно ожидать от веб-параши производительности в итеративных вычислениях.
С imgui будет пикрилейтед. Не надо никаких лямбд, не надо никаких полей и лапши в строках.
Поясните нормальное решение? Стоит также дрочить алгоритмы на расте или у вас другие паттерны?
В целом раст сильно сложнее?
Не обзывайте пожалуйста
Вот и хорошо, вот и замечательно. Думаю, на egui похожим образом можно сделать.
Зато тут стили, кроссплатформенность и, что для меня важно, реактивность через их этот Signal, который можно шарить между тредами.
>как более перспективный язык на рынке труда
Смотря что кодишь. Если машоб/нейронки, то как бы mojo не оказался более перспективным. Если бэк, то goвно явно перспективнее. Самый перспективный способ получить деньги за работу на расте сейчас - это самому внедрить его на текущей работке. Типа, есть какая-то задача, которая реализована бажно и тормознуто на пыхе/петухоне, ты за выходные переписываешь её на раст и презентуешь барину. Барин ссыт кипятком от такой скорости и стабильности, повышает тебе ЗП, ты докидываешь абзац в резюме - который тоже не факт, что пригодится.
>переписываешь её на раст и презентуешь барину.
А потом просишь повысить зп еще, потому что тебе на замену он никого не найдет
> Зато тут стили, кроссплатформенность
Да и на imgui всё это есть. У egui ещё производительность такая себе, я недавно чекал его в очередной раз и довольно грустно для десктопного гуя. У imgui хотя бы на уровне qt производительность.
Можешь посмотреть какие ебанутые комбайны можно на нём делать:
https://github.com/WerWolv/ImHex
нахуй ты местных нищуков так пугаешь? там бесплатно для некоммерческого использования
не угадал :(
Да лан, мне и на диоксусе збс.
Поясню, почему: в моей задаче гуй не самое важное, лишь бы было удобно работать с условным бэком - диоксус это могёт. Параллельно хотелось бы
а. Оставаться в экосистеме раста (хотя бы затем, чтобы прям из ide смотреть код сторонней функции)
б. Изучить что-то новое, потенциально годное для портфолио - реактивные гуи на DOM+CSS я ещё не делал, теперь вот поделаю.
Я даже не знаю, смеяться или плакать над тем, что слабоумный консерватор не в курсе того, что вместо твиттера теперь Х -- прибежище наиболее слабоумных консерваторов.
Слабоумные либералы в твиттере, слабоумные консерваторы в X
Отвечает прям как типичный пидорастер.
Наверное язык/система программирования соответствует мышлению определенной категории людей.
Проще говоря язык от либерах для либерах.
С ценрализованной инфраструктурой, надзором от большого брата и с изменчивой семантикой чтоб никакое пропитое быдло грязными мазутными руками не могло разобраться в замысловатом творческом коде господина пидорастера.
>С ценрализованной инфраструктурой
то ли дело, есть 3-4 слабо совместимых между сбой компилятора, а нужные либы надо гуглить. И потом ебаться долгими вечерами, прилаживаю одно к другому, ммм...
Да, я тоже удивлен, что выдача гопоты не отличается от стокового члена RUSTCEAN. Может быть, все это и не люди пишут?
>то ли дело, есть 3-4 слабо совместимых между сбой компилятора, а нужные либы надо гуглить
В карге лежат "либы" уровня tinyxml2 это влучшем случае, а в типичном уровня leftpad. То есть то что в нормальном мире либами и не считается, считается модулями.субмодулями.
Либы это libsdl libtorrent libopenssl libgtk3
Что касается несовместимости то это надо спрашивать у ллвм/шланг почему он изобрел велосипед с квадратными колесами, а не взял уже готовый Gimple на котором написаны фронтенды для гцц. Хотя я знаю ответ - авторы хотели и рыбку съесть и на хуй присесть запилить компилятор который и как HOT и как JIT работает, со вторым в итоге пососали хуев и теперь мы имеем странный компилятор который переводит языки в байткод (LLVM IR) который прожевывает аки виртуальная машина и выпукивает машинный код.
В карге всё есть, не пизди.
>Либы это
>libsdl
wgpu/winit
>libtorrent
тут +- . при желании можно состряпать rust-only клиент на том, что есть, но пусть будет минус, хуй с тобой
>libopenssl
rustls заменяет openssl почти во всех крейтах, где нужно шифрование
>libgtk3
Прямо сейчас полно замен, если не требуется писать именно gtk/qt
Из последнего https://github.com/lapce/floem и https://github.com/audulus/rui - стильно, модно, реактивно.
В плюсах например есть библиотека lodepng это примерно такая же small+fast библиотека-модуль которая легко подключается к проекту и собирается с ним, но это не замена всяким libpng, libjpeg-turbo итд. она не умеет в разность бит на цвет и не умеет в полный стандарт, не имеет симд и опенмп для обработки больших данных.
А ты предлагаешь трехколесные велосипеды в качестве альтернативы квадроциклу, вот поэтому раст и сосет.
Используй биндинги, ноу проблем. Вообще, конкретно эта предъява к расту очень легко применима к любому другому языку не из мира C/C++ , причём в гораздо большей степени.
Если взять и посравнивать, то окажется, что по количеству либ, написанных на нём самом, раст всасывает разве что жабе/шарпу. А из компилируемых языков он вообще первый - это я говорю про вне С/С++ тусовочки, напомню.
Тогда уже говно-языки hare/zig/ocaml/fortran/nim/crystal/elixir/jai/mojo/.. - на них ведь тоже без биндингов к сям далеко не уедешь.
>Используй биндинги, ноу проблем.
Ну да, когда растобляди переписали свою альтернативу, то дыряшка сразу не нужна, но когда чего-то не хватает, то обертки из швятого растокода над сишной либой - это не зашквар.
>Тогда уже говно-языки
>zig
Лол, что? Некоторые уже сишный код собирают через zic cc, да и в целом нет ни одного языка, где существовала бы такая легкая интеграция с кодовой базой на Си(ну кроме самого си).
>когда растобляди переписали свою альтернативу, то дыряшка сразу не нужна
>когда чего-то не хватает, то обертки из швятого растокода над сишной либой - это не зашквар
Не вижу тут противоречия, но вижу скулёж брошенки.
>Некоторые уже сишный код собирают через zic cc
От этого сишный код не становится зиганутым кодом, зато появляется мешанина, написанная хуй пойми на чём. Вообще, этого говна, совместимого с обычной сишкой, было уже немало и ничем оно принципиально не выделялось, разве что добавляло немного сахарку. Те же обж-си, ди, ним.
Там ваш фанбой, который учил вас расту на ютубе, устал от него и полюбил зиг
https://www.youtube.com/watch?v=NAOOGB1q6uQ
Я и сам не прочь перекатиться, но на что-то типа mojo, когда его допилят. Сейчас там даже тулинг развернуть - уже изрядно поебаться и не на всяком линухе работает при этом.
А zig в своей нише низкоуровневого байтоёбства пускай и ошивается, я не против.
>Не вижу тут противоречия, но вижу скулёж брошенки.
А оно есть, и заключается в двойных стандартах шлюх.
>От этого сишный код не становится зиганутым кодом, зато появляется мешанина, написанная хуй пойми на чём
Сам придумал, сам оспорил? Никто и не говорил, что Си код превращается к код на зиге(хотя и такая функция есть), а говорилось лишь то, что зиг работает с кодовой базой на Си почти бесшовно, что увеличивает комфорт системной разработки в разы.
>>70116
>он ни одной проблемы не решает.
Решает, и это видно по сообществу языка, куда приходят байтоебы, ибо видят в нем настоящую замену Си, а не веб макаки/питонобляди, которые в очередной раз пишут свою парашу. Удивительно, что язык, имеющий версию 0.12.0, подходит для системной разработки больше, чем "убийца си", который не один десяток лет пилится.
>>70141
>Я и сам не прочь перекатиться, но на что-то типа mojo, когда его допилят.
Вот вся суть шлюх, т.е. беготня за current thing ради бытия в ТУСОВОЧКЕ. ИРЛ их нормальные люди обоссывают, поэтому приходится свою социальную жизнь и самовыражение в профессиональную область выносить.
>>А zig в своей нише низкоуровневого байтоёбства пускай и ошивается, я не против
Ну да, ведь раст же не для этого создавался.
zig - это апофеоз линуксоидов-пердоль. Там есть сомнительные фичи, добеленные просто потому что так Андрюха решил. А есть куча фич, которые забракованы по надуманным причинам. Всё что не free по мнению гну-пидорасов - там под запретом, баги не фиксятся и откладываются на несколько релизов вперёд т.е. на годы как некритичные. Разрабы по большей части заняты не непосредственно языком/компилятором и улучшением юзерэкспириенса, а какой-то хуитой типа написания никому ненужных либ под MIPS и переписыванием сишного кода. Сборка чего-то сложнее хеллоу ворлда - кал собаки, надо литералли на любой пук писать "скрипты" сборки на самом зиге. Чего только стоит их "более удобный компилятор крестов", где вместо трёх строчек симейка надо написать портянку на зиге. При том что он ещё даже до хоть какого-то рабочего состояния не дошёл, а уже есть куча легаси либ, в том числе легаси документации и инфы из гугла, которая иногда только путает, т.к. сейчас уже поменяли некоторые места. Либ нет, а биндинги на сишные либы пишут руками и они везде неполные. Производительность сосёт, и у крестов, и у раста. У них написано "Call any function at compile-time", но это пиздёж и все компайл-тайм вычисления даже у крестового constexpr отсасывают по итоговой оптимизации. Можно бесконечно перечислять всё говно зига, по факту даже D на текущий момент более пригоден для кодинга, чем зиг.
>видно по сообществу языка, куда приходят байтоебы,
>Ну да, ведь раст же не для этого создавался.
прикинь, не для этого. С ранних версий он развивался с прицелом на разработку браузерного движка servo, а там больше логики, чем непосредственно байтоёбства.
>беготня за current thing ради бытия в ТУСОВОЧКЕ
ну не совсем. То, что я перейду именно на mojo, это громко сказано, сперва пощупаю. Но и на раст я перешёл с питона, когда устал от его тормозов, gil и отсутствия типов. mojo пытается быть чуть более дружелюбным растом с питонячьим синтаксисом - сама идея мне норм.
При этом какие ошибки в движке лисы были такие и остались.
Например джаваскрипт запущеный на странице из контекста расширения не производит никаких сообщений в консоль.
В хромом все это работает, но хромой сразу создавался с песочницей и многопотоком, а лиса обрастала им постепенно и там код из костылей, от которых они не хотят избавляться но хотят переписать их на что то более внятное что бы проще было поддерживать, но вот справляется с этой задачей раст это большой вопрос, где то читал жалобы какого то дяди из мозилы что в коде стало еще тяжелее разбираться, плюс сам фаирфокс из браузера который легко собирается на чем угодно, превратился в браузер который работает только на тех которые поддерживаются ллвм+растом (то есть китайские мипсы и эльбрус в пролете).
Сейчас довольно небольшая доля лисы написана на расте. И раст не защищает от логических ошибок и эффективных манагеров.
>хромой
Давно под нами.
https://source.chromium.org/search?q=file:Cargo.toml&ss=chromium&start=51
Да лан, лиха беда начало. А ещё вот так посмотри
https://source.chromium.org/search?q=file:%5C.rs$%20-third_party&ss=chromium&start=1
> превратился в браузер который работает только на тех которые поддерживаются ллвм+растом (то есть китайские мипсы и эльбрус в пролете).
Может это и была цель? Лешить конкурирующие платформы свободного браузера?
Да нет, просто мозилой руководят лгбт пидорасы подсаженые гуглом. Мобильный браузер изговняли и фактически уничтожели, на слабом интернете он просто не открывает страницы, а свое собственное расширение я никак не могу поставить потому что оно не рекомендовано пидерастами-проверяющими.
Сижу на старом где пока еще можно на аддоны зайти и поставить тот же AudioOnly for YT
На десктопе тоже работа кипит, надо сделать так что бы у лисы не осталось никаких преимуществ перед хромокалом, вот ребята и стараются. Скоро платформонезависимый интерпритатор на плюсах выкинут чтоб нельзя было без портирования jit обойтись, а на хромом запилят.
Дружеское напоминание: за 99% закрученных в мире гаек ответственны традиционалисты-натуралы.
Готов спорить на деньги что мозилой руководят правопопулистские бумеры-натурасты.
>Дружеское напоминание: за 99% закрученных в мире гаек ответственны
Во первых политики свою личную жизнь обычно не афишируют и какие они на самом деле ты не можешь знать. Католические попы в свое время тоже рьяно за целомудрие и нравственность боролись и надевали мальчикам железные клетки на хуи.
А во вторых речь кок раз про бестолковые креативные изменения.Кроме того один из директоров там точно сжв пидарок https://blog.mozilla.org/careers/pridezilla-a-resource-group-for-lgbtqia-mozillians-and-allies/
>wc -l cargo.lock
>9750
Ебанутые, блядь, пориджи. Добро пожаловать в мир нпм.
Как мне жить с этой хуйнёй, если дома нет инторнета? Можно как-то, как в линупсе с сишечкой собрать либы и подпихнуть бинари для конпелятора?
А еще удачи проверить сотни писькопакетов, которые рекурсивно тянутся к твоим зависимостям)
Безопасный язык для системной разработки, хули.
Попроси своего парня нарезать двд со слепком crates.io, потом по инструкции поднимешь локальную репу.
а у сиблядей по другому что ли? я тут QEMU на днях собирал из исходников - аналогично туева куча пидорских зависимостей
потратил минут десять, чтобы понять, что ему нужен python3-setuptools (сначала грешил на версию петухония)
Блядь, просто пакеты ставишь, автоконф скрипты допирают, чего не хватает, 99.99% конпеляций работает с первого захода.
а если пакеты нужны разных версий? в т.ч. версий, которые уже не поддерживаются и которые не найти?
>>wc -l cargo.lock
>>9750
>Ебанутые, блядь, пориджи. Добро пожаловать в мир нпм.
>Высосал из жопы проблему.
почему постоянно? оно ж кэшируется, раз скачал и оно лежит себе у тебя на жестком диске. смекаешь?
папку target в проекте снес и оно снова все скачает при компиляции проекта
Дедуля со своими два ядра два гига и adsl модемом хули ты тут забыл? Пиздуй в одноклассники
>ADSL
>модем
а ты сам откуда такие аббревиатуры и слова знаешь? может тебе самому в одноклассники пиздовать надо?
https://www.youtube.com/watch?v=r0rocq3w5CU
Вот да, это пиздец.
Обоссаное консольное приложение 4гб исходников+объектных файлов.
В целом язык очень нишевый, точно не десктопный ибо не нужон ваш ffmpeg/wxWidgets скоро на расте велосипед подъедет, а скрипты и luajit вообще выкиньте, пишите на расте и радуйтесь звучит как аргумент из дурки. Может быть серверные веб приложения вот это все где сейчас джава доминирует, нода как раз не шмагла по перфомансным причинам.
> что то связанное с символами экранирования.
Майкрософту пора принять решение и отказаться шиндоус путей
просто перейти на юникс/позикс-гибрид как мак и все.
Давно бы уже могли это сделатьб я уверен они сами уже наелись говна с этими спецсимволами и кодировками.
Раст, это язык от программистов для программистов. А программисту нужно что? Контроль. А для контроля нам надо, чтобы всё од рукой. Вот о дефолту там и идёт куча дебажных символов и проч. Релизную сборку делаешь по инструкции https://github.com/johnthagen/min-sized-rust и будет тебе щастье
>это язык от программистов для программистов. А программисту нужно что? Контроль.
Тут не поспоришь, однако обычно когда один "программизд" пишет что-то для другого, то в итоге появляется форк. Так как первый понимает "контроль" когда на тебя надевают ошейник и ведут на полосу барьеров и препятствий которые можно проходить только единственно правильным способом, тогда как второй свой собственный контроль над программой а не вот это вот все.
Обычно языки создают люди с академическим образованием и мышлением,
основывая их на законах и постулатах-парадигмах, поэтому обычно в них таких проблем нет.
Попробуй аду и хачкель. С ады я вообще охуел, насколько там всё неудобно. Зато академично, что ниибаца.
> будет тебе щастье
Под виндой чтоб опуститься ниже 100 кб только no_std врубать. Хоть обосрись, но голый main даже без использования std сожрёт 100+ кб, lto делает ровно нихуя.
Алсо, с контролем в расте как раз всё очень плохо. Иногда ощущается что ограничений больше чем в питоныче.
> Обычно языки создают люди с академическим образованием и мышлением, основывая их на законах и постулатах-парадигмах
Ну вот макаки придумали ООП, там явно мышление не участвовало в процессе созидания. Мартин SOLID придумал, но за 20 лет никто так и не смог чётко сформулировать что это такое, все по разному объясняют значение этих пяти букв. Хотя там уже первая буква - целый мем, определяющий всё легаси-говно.
Пиши на петоне. Это люди небольшого ума придумали писать инфраструктурные вещи на комплируемом языке.
Объясни как рубисту, неужели нет преимущества у написания инфраструктурной хренотени на гошечке или расте? В вебе мне понятно, ты упрешься в пропускную способность намного раньше процессорного времени, а тут во что?
Разумно, спасибо. Для чего тогда раст? Что на нем пишут вообще в повседневности?
Так сами сервисы могут быть на чем угодно, в том числе и на расте и на говоланге. Но зачем скедулер для этих сервисов на голанге? Особенно если ты не клауд провайдер.
Ансейф не спасёт от боровчекера и типов.
>нет преимущества у написания инфраструктурной хренотени на гошечке или расте?
Чувак, ты про вообще? Вся инфраструктурная хренотень написана на go. Docker написан на go. ArgoCD написан на go. Kubernetes написан на go. Istio написан на go. Helm написан на go. Prometheus написан на go. Ну и так далее.
Я знаю, что оно на го всё написано. Я пришёл в чат растеров, узнать, подходит ли их язык для такого, просто в рамках своего личного исследования его применимости, которое я провожу перед тем, как решить, стоит ли ковыряться в расте или возвращаться к котлину, который мне поможет по работе, но к которому душа не лежит. Или вот всё бросить и дрочить го. Я вообще из веба/руби/питона, для меня это всё чужое и непонятное, а тут вон чувак говорит, что инфраструктурные штуки, которые мне нравятся, проще на питоне писать. Я и спрашиваю, какого хуя.
Спасебо
Эластик написан на джаве, Логстэш написан на джаве, ДинамоДБ - джава, Кафка - джава, Рэббит - она же, Дженкинс - тоже
Ява теперь неебаться крутой язык для инфраструктуры оказывается
К слову, так было пару лет, когда я на растопараше писал, сейчас похоже всё не так, карга пакеты вроде в .cargo складывает и появилась какая-то хрень - локальная registry. Алсо, если учитывать, что раньше всё собиралось из исходников, потому что АБИ был нестабильным, то выходит они до сих пор аби не стабилизировали?
ООП это программирование в парадигме объектов, их свойств и их методов.
У тех кто его понимает не возникает вопросов "что это такое".
ООП дало возможность пачке макак работать над одним проектом не мешая друг другу.
Старая шутка про - один программист может написать программу за месяц, а двое туже программу за два месяца - была актуально именно над процедурными языками.
Контракты и инкапсуляция, позволяет не наступать друг другу на пятки, а IoC дало еще возможность это тестировать.
То что эволюция пошла взад, виноваты педерасты.
Проблема в том что этих макак эволюция обошла стороной. ООП хоть и задумывался как помощь братьям нашим меньшим, но так и остался инструкцией для умственно отсталых.
> let image = DynamicImage::from_decoder(PngDecoder::new(&sum[..]).unwrap()).unwrap();
Есть такая строчка. В &sum[..] лежит исходники картинки. С image все ОК, с ним можно работать (кропать, сохранять на диск и т.д.).
Вопрос: как сделать обратное - из image получить sum[..]. Всякие as_bytes не дают желаемого. Нужно именно кодировать обратно.
Использую image = "0.24.6"
>Нужно именно кодировать обратно.
Ну так и поищи по слову encode в документации. Там же сразу по этому слову найходитя write_to() и write_with_encoder().
>>78642
Спасибо, тогда вопрос такой.
>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.
Сделай буфер вектором, а не массивом, оберни его в BufWriter и передавай так в DynamicImage. Ты же сам по русски написал что тебе надо, остаётся просто перевести это в термины раста.
Дети, которых не учили расту, а учили плюсам и паскалю, не могут что-то сделать на расте. Шок, сенсация.
друг мой любезный, если бы все было так просто, я бы тут не спрашивал
обернуть в BufWriter можно только типы Sized
Вектор имплементирует Write:
https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-Write-for-Vec<u8,+A>
Твоему PngEncoder'у нужен контейнер, имплементирующий Write:
https://docs.rs/image/latest/image/codecs/png/struct.PngEncoder.html#method.new
Просто передай туда мутабельную ссылку на вектор, буфер не нужен, меня наебал комментарий в описании библиотеки.
https://www.youtube.com/watch?v=o111yYPqLHU
таймкод лень искать
патлатый даун (книжки пишет и преподает в какой-то параше) там говорит, что студентик нынче туповатый пошел и такую вещь как указатель впринципе понять не способен из-за физических ограничений мозга
>студентик нынче туповатый пошел и такую вещь как указатель впринципе понять не способен из-за физических ограничений мозга
Как будто раньше студентик понимал, и поэтому вызывал маллок по поводу и без. Наверное потому что ему вот такие бородатые клованы рассказывали про поинтеры, но не рассказали про то как работают комплюктеры.
>>79326
Я хз как можно не понять концепцию указателей. Сейчас речь идет не о сложных кейсах, когда происходит каша из указателей на массив указателей на указатели на функцию и т.д, а о самых примитивных случаях, которые преподают в ВУЗике.
Если студент не в состоянии осилить такую простейшую абстракцию, то о чем речь? Он и остальные абстракции не поймет.
Есть такое. По прежнему говорю, раст не сложный в обучении, он неудобный для меня.
Ой да ладно, очередное раньше было лучше, раньше были умнее. Это в 90е С++ был основой для всего, а сейчас область си настолько сузилась, что это ваше системное программирование нафиг не мотивирует никого, вот люди с трудом жуют.
Запомните, ошибка в обучение лежит на преподавателе, его способности мотивировать и обучать. Вот и представьте компетентность этих людей.
Ну к Столярову я бы с опасением относился, учитывая какие пассажи он прогоняет и тот факт, что он нихрена не работал в индустрии.
Самые полезными и толковыми преподами в универе были чуваки с многолетним опытом в индустрии(писатели телекоммуникационных систем, например), а не академические крысы.
>в 90е С++ был основой для всего
Зумерок, спок.
>а сейчас область си настолько сузилась,
У зумерка с++ = си
>Запомните
Ещё и учит кого-то, 🍑ц.
В свое время дропнул паскаль из за этого. Не язык, а какой-то надзиратель хватающий тебя за загривок и окунающий в бочку с водой, потом вытаскивающий и орущий в ухо: "ДЕЛАЙ КАК Я СКАЗАЛ, САЛАГА! ДУХ! ЧЕРВЬ!", снова окунающий, снова орущий и так постоянно. Какое же мерзкое душнилово, и это при том, что паскаль позволяет свободно в указатели и даже ассемблер. А тут 30 лет спустя изобрели такую же залупу "руст", только в десятки раз хуже, и еще находятся особо одаренные это нахваливающие. Я бы к такому выродку не подошел на пушечный выстрел, это уже за пределами любой деградации, литеральные черви, не люди.
>Я хз как можно не понять концепцию указателей.
Если ты понимаешь концепцию указателей значит ты не понимаешь что такое указатели вообще. Это полу-ассемблерная семантика, а концепция языка Си это абстрактный от архитектур визуальный ассемблер.
Понимать "указатели" не понимая как работает железо, это засовывать себе в анус очки, как мартышка из басни, полагая что от этого улучшается зрение.
Сам по себе указатель это просто метка для подстановки комманд лоад/стор, самая важная часть в указателе это размер данных к которым ты по нему обращаешься (то есть тип). Если супер-программизт нахуевертил гигаструктуру не особо заботясь о размерах сегментов и расположении данных, то хули толку понимать поинтеры.
Еще хуже обстоит дело с executable поинтерами, еще на заре взлета Си будущие бородатые деды с терминалами понимали что это хуевая затея и ей не место в языках высокого уровня, поэтому изобрели ООП у которого в памяти создается объект с которым ассоциированы функции через метоинформацию. Не нужны больше статики и функшн поинтеры казалось бы, но пришла асинхронщина с лямбдой в калбеке и сказала объектам подвинутся.
>поэтому изобрели ООП у которого в памяти создается объект с которым ассоциированы функции через метоинформацию.
То есть, через vtable.
>но пришла асинхронщина с лямбдой
Это уже не си, а высокоуровневый абстрактный кал который вон чел в видео выше называет "не-фоннеймановским" программированием, наравне с лиспом и прочими хаскелами/растами, короче соевые выебоны. Да, соя была издавна, тот же лисп, но тогда она была малоизвестной нишей.
>концепция языка Си это абстрактный от архитектур визуальный ассемблер
Называть си ассемблером я бы не стал. Компилятор может переставлять и выкидывать строки как ему вздумается. Ради интереса открыл сейчас ISO/IEC 9899:2018, там 10 страниц (408-418) с перечислением Undefined Behavior. Все UB — это картбланш компилятору на любую оптимизацию.
> Компилятор может переставлять и выкидывать строки как ему вздумается
Как и CPU, лол. Учи модели памяти чтобы не быть батхёртом.
>Ваш ассемблер не ассемблер.
Ясно всё с тобой. Иди со своей казуистикой в /b/, там все твои друзья.
Ну так-то он прав, в x86 инструкции могут не в порядке машинного кода выполняться и даже одновременно в одном такте, если соблюдаются условия для этого.
Так я что, спорю что-ли? Какое отношение это имеет к моему утверждению, что си и ассемблер это разные вещи?
>Все UB — это картбланш компилятору на любую оптимизацию.
Не совсем. Компилятор всегда оптимизирует с позиции что UB недостижим. Т.е. если у тебя есть if (foo) bar() else UB, компилятор это cоптимизирует до bar().
Оптимизации работают с позиции что разработчик проверил что все возможные входные значения не приводят к UB, а значит возможные значения которые триггерят UB можно не учитывать при оптимизациях.
Да не трясись ты так, Столяров.
Ещё про чтение и запись в память через кэши, с их протоколом когерентности, из-за которого некоторые изменения до памяти вообще не доходят.
Вообще я говорил про вот такое:
myStruct->callback = &my_function;
хmyStruct->callback();
То есть указатель не просто с адресом функции которую надо вызвать, а прыжок в конкретное место на стеке со статик локалами.
А vtable это просто vtable[][] = { {"funct_name", virtual_call1}, ... }
И нужны они только для виртуальных методов, для которых заранее неизвестно какой вариант надо вызывать.
>>79886
Он шизик и гик, не слушай его.
Большинство кода на Си работают как раз не на фоннемоновских архитектурах, потому что все остальные языки предполагают что у нас безграничная куча памяти, как дедушка фоннейман завещал.
И возможно как раз тот самый вызов подпрограммы по указателю на нефоннемоновских архитектурах выглядит не так уж 🍑цово, микроконтроллеры не запускают программ извне и память у них набортная без всяких mmu.
>>79991
>Компилятор может переставлять и выкидывать строки как ему вздумается.
Не совсем понял как это относится к разговору, yj да в компиляторе есть агрессивные оптимизации которые могут сломать программу, обычно в документации указано какие именно, например проигнорировать NaN INF и прочую математическую хуету или сосчитать результат заранее и вместо вызова подставить результат.
А вот есть ли оптимизации заставляющие выкинуть обращения по указателю, которые расставил по коду нерадивый программист я не уверен.
> А вот есть ли оптимизации заставляющие выкинуть обращения по указателю, которые расставил по коду нерадивый программист я не уверен.
Компилятор делает много оптимизаций на вычислении границ возможных значений. Если он увидит что в какой-то указатель на функцию запись делается всего в одном месте и одной функции, он может сделать везде прямой вызов этой функции.
https://loglog.games/blog/leaving-rust-gamedev/
Компилятор не делает никаких оптимизаций, пока ты их не включишь. Тем более агрессивные с выкидыванием оригинального и подстановкой оптимального.
И в абсолютно любом случае он очень ограничен в ситуациях когда неизвестно на какую область памяти будет смотреть тот или иной указатель, ведь на этапе компиляции ее просто нет.
Поэтому и нужны всякие метки вроде restrict
> неизвестно на какую область памяти будет смотреть тот или иной указатель
Самое смешное что именно компиляторописатели придумали dangling pointer, про который ни слова не писали в стандарте и только в недавних версиях добавили. Авторы стандартов не предполагали что UB для компиляторов станет форточкой, через которую будут протаскивать пианино, в попытках оптимизировать всё на грани поломки кода. И старая сишка не была такой опасной, отстреливающей жопу при неверном движении с О2.
Я тут ковырнул одну мелкоигру на анриале4 и просто охуел с того сколько оно все весит (400мб) и как медленно работает на моем древнекомпе.
Там реально внутри какой то скриптовый язык походу с интерпритатором обмазаный плюсовыми библиотеками для работы с графикой и вот этим всем. Наверняка на лету из строки клепает шейдеры и компилирует.
А потом всякие клованы нихуя не понимающие заявляют что надо с юнити на анриал тарков или WOT с плюсового дагора переписать и будет заебись.
Судя по комментам, эта статья вызвала всплеск антологичных эмоций у людей работающих в той же области. Гейдев на расте - все.
>>80433
Компилятор без оптимизаций никто не использует.
Другое дело, что не всё так страшно на самом деле и компиляторписатели не делают всё возможно ради оптимизаций. Вот пример. Я конечно может в нём ошибаюсь, но по-моему компилятор мог смело выкинуть в нём строку, печатающую 'Hello', потому что условие приводящую к её выполнению является UB.
> никто не использует
Я помню в нулевых, когда gcc пытался косплеить ядерный полигон, а LLVM ещё не превратился в юзабельный продукт он и сейчас с трудом юзабельный, на пердоликсе некоторый софт можно было собирать только в О1, в О2 тебе отрывало жопу.
> компилятор мог смело выкинуть в нём строку, печатающую 'Hello'
Нет, у тебя там нет никакого UB в выводе строки. То что ты стек захуячил - это не UB и вообще к строке не имеет отношения.
чтобы вместо _ if строка.contains(подстрока) => {}можно было написать, например, "подстрока" => {}
в числах же есть диапазоны, хули со строками все так убого?
В самом выводе строки нет. Но я писал
>условие приводящую к её выполнению является 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).
> мог бы
Не мог, массив это сахар над указателем. Пикрилейтед абсолютно валидный код без UB. array subscript - это обращение по индексу. Индекс может быть любым.
Я тебе цитату привёл из стандарта с указанием номера статьи, где написано что это UB...
Вот сам параграф, если ты не умеешь в гугл.
Ты сам видишь что там написано? Результат обращения UB, всё. UB значит что там может быть что угодно, стандарт не определяет что, но это не значит что туда нельзя обращаться. Компилятор никак не следит куда ты обратился, и уж тем более не оптимизирует как ты мечтаешь.
>но это не значит что туда нельзя обращаться
Но это и не значит, что туда можно обращаться. Компилятор вправе сделать вывод, что программист заранее всё продумал и таких обращений не будет. После чего выкинуть соответствующие инструкции. И самое интересное, что именно так он и поступает.
Признаю, что привёл не очень удачный пример, потому что ничего плохого из-за данного UB в нём не происходит. Просто мне казалось так было проще проиллюстрировать мою мысль о том, что нельзя считать си ассемблером, потому что компилятор в довольно широких пределах может изменять программу.
Давай посмотрим на другой UB, который компилятор действительно эксплуатирует. Как видно результаты выполнения программы для -O1 и -O2 кардинально различаются. Вроде все значения помещаются в нужные типы. Почему так получается? Мой вариант объяснения происходящего:
При умножении x и y происходит неявное преобразование их к int (знаковое целое). Переполнение при умножении знаковых целых это UB. Именно это и происходит когда x = y = 0xFFFF. Но компилятор посчитал, что программист не будет передавать в функцию такие значения, которые приводят к переполнению. Поэтому при более высоком уровне оптимизации он использовал инструкцию jle (сравнение знаковых целых) вместо jbe (сравнение беззнаковых). Хотя казалось бы сравнивал он беззнаковую переменную и константу.
Честно признаюсь не очень понимаю, почему в этом случае применяется такая агрессивная оптимизация, которая ломает выполнение программы, ведь явного выигрыша она не даёт. При этом догадываюсь, почему нет агрессивной оптимизации в случае выхода за границы массива (сломается весь типичный сетевой код нахрен, в котором это используется намеренно, когда объявляется массив длинной 1 в конце структуры, описывающий пакет). Одно знаю точно — в си слишком дохера неявностей, которые приводят к неожиданным результатам. В этом плане раст к ассемблеру ближе будет, лол.
>>81002
Кейсы в match должны быть известны на этапе компиляции. foo.contains и шаблоны под это ограничение не подходят, зато if-guards как в твоём примере, позволяют обойти это ограничение. Может поменяют в будущем, т.е. сделают сахарок над if-guard'ами.
Ну во первых test у тебя публичная функция и просторов для оптимизации в ней нет, оптимизации надо смотреть там где ее вызывают, то есть в main, где по идее можно все заранее сосчитать и выкинуть нахуй вызов функции.
Что касается UB, то это уже выходит за рамки возможностей компилятора, компилятор не разбирается в твоем кгновнокоде,
Хотя для отлова таких простых ошибок как у тебя в компиляторы добавили опцию -Wall, в рантаймных случаях только валгринд или эльбрус в режиме -mptr128.
И это не UB это ошибка
>В этом плане раст к ассемблеру ближе будет
Ну прост надо Си хорошо знать и не будет проблем, поэтому он и сложный.
>>81402
Мне кажется, ему взять вездесущую либу ахо karasique для этого, если там есть прегенерация.
>>81476
>Хотя для отлова таких простых ошибок
Дядь, там уб-санитайзеры в гцц уже завезли лет 10 назад.
> вправе сделать вывод
Нет. Неконстантные бранчи никогда не будут удалены, это стандарт запрещает.
> на другой UB
И нахуй ты это притащил? До этого вообще другая ситуация была, ты 🍑л что бранч будет оптимизирован из-за левого UB.
> jle (сравнение знаковых целых) вместо jbe
GGC всегда был кривым говном в О2. В шланге и msvc всегда будет корректно считать. Если как ты сделать, то он с оптимизациями вообще при компиляции посчитает, если через аргументы, то всё равно не будет переполнения. Без оптимизаций тоже нет переполнения.
>>81351
> выдал неправильный результат
> За что раст мне и нравится.
Лол.
Ну вот это UB однозначно, ты вылазишь в стек процедуры x86й машины
>это сахар над указателем.
Это барьер от долбоебов с ружьем направленным себе в ноги.
>Дядь, там уб-санитайзеры в гцц уже завезли лет 10 назад.
Куда именно "в гцц" ?
Ну и адрес санитайзер это уже совсем про зоонаблюдения за указателями.
>оптимизации надо смотреть там где ее вызывают, то есть в main
Оптимизации заканчиваются на границе функций.
>Что касается UB, то это уже выходит за рамки возможностей компилятора, компилятор не разбирается в твоем кгновнокоде
Разбирается, я что зря этот пример показал?
>Хотя для отлова таких простых ошибок как у тебя в компиляторы добавили опцию -Wall, в рантаймных случаях только валгринд или эльбрус в режиме -mptr128.
В данном "простом" случае ничего из этого не поможет. ну ладно, проверял только -Wall.
>И это не UB это ошибка
Это UB, пример которого буквально приведён в определении UB.
>>81505
>И нахуй ты это притащил?
Чтобы показать, как компилятор из-за UB и оптимизаций ломает программу.
>Нет. Неконстантные бранчи никогда не будут удалены, это стандарт запрещает.
> В шланге и msvc всегда будет корректно считать.
Правда?
msvc кстати тоже выкидывает, но код генерирует хуже.
>>81569
Возьми реальный компилятор, а не онлайн-парашу. Я тебе уже кинул скрины, оно при всём желании не ломается, а при включенных оптимизациях он оптимизирует нахуй вообще весь код кроме принта.
> msvc кстати тоже выкидывает, но код генерирует хуже
Хотя бы потому что у него нет аргумента -О2. Хватит уже траллить тупостью.
>В данном "простом" случае ничего из этого не поможет. ну ладно, проверял только -Wall.
Потому что в Wall и Wextra не все флаги, но да, подобное не ловится через линтер -Wconversion, но через -Warith-conversion есть (но он слишком шумный).
Ну взял, что дальше?
>Я тебе уже кинул скрины
Я вообще не понял, что за скрины ты мне кинул. Скрины отладчика, в котором запущен код без оптимизаций? Ну так я весь день и пишу, что одна и та же программа в зависимости от оптимизаций может работать совершенно по разному.
>Хотя бы потому что у него нет аргумента -О2
Похоже в винде (или в msvc) /O2 и -O2 это одно и то же. Проверить сам не могу, верю годболту. Если ввести откровенную чушь, msvc даёт варнинг.
> Оптимизации заканчиваются на границе функций.
>Разбирается, я что зря этот пример показал?
Сперва ты мне показался грамотным, а теперь кажшься тролем
>Это UB, пример которого буквально приведён в определении UB.
Там написано про какой то array object
int arr[] ={ 1, 2, 3} - это не array object, запись куда-то запределы кучи это по большому счету сегфолт.
>Сперва ты мне показался грамотным, а теперь кажшься тролем
Не очень понял. Почему?
>int arr[] ={ 1, 2, 3} - это не array object, запись куда-то запределы кучи это по большому счету сегфолт.
Ну здрасьте, учимся объявлять массивы на дваче. Это то же самое, что int arr[3] = { 1, 2, 3];
array это куча, а не массив
куча это просто данные лежащие на стеке (либо в памяти) линейно.
Разница в том что кучу нельзя воспринимать как нечто целостное, да и работать с ней тоже не получится ее нельзя записать целиком в фаил или передать копию другой функции.
Это неструктурированные данные у которых нет начала и конца, есть только адрес позиции.
Что бы создать "массив" в Си надо делать вот так:
struct { int d[4]; } arr_t;
Ммм. Любопытно.
гцц выдает ворнинг без всяких санитайзеров
А вообще почему он пишет signed int и почему переполнение беззнакового числа?
Может из за того что ты знаковый литерал подставил? Сделай >= 0x80000000u
Не, там проблема в том, что си неявно приводит x и y к int'у (int promotion rules). Это делается для всех типов меньших по размеру чем int, просто потому что процессор не может в арифметические операции для таких типов. Раст в такой ситуации кстати просто отказывается компилировать и заставляет тебя явно все приведения провести и ты либо напишешь правильно (приведёшь x и y к u32), либо сделаешь багу, из-за которой программа будет падать в панику (см. >>81351).
А скинь выхлоп как ты компилируешь с gcc, только добавь флаг -v? У меня не получается никаких варнингов, чтобы я ни делал.
Ты что-то не договариваешь оно у тебя ругается на то что 65k*65k не может дать положительный знак в случае int недвусмысленно намекая что надо бы перейти на long. Но у тебя везде беззнаковые стоят и никакого переполнения в случае беззноковых чисел не должно возникать.
Ты троллишь что ли я не понимаю?
Ебучая двач-тематика, даже в pr жирные сидят и кормят говном.
>А скинь выхлоп как ты компилируешь с gcc, только добавь флаг -v? У меня не получается никаких варнингов, чтобы я ни делал.
Пикрелейтед, происходит такое потому, что процессору для перемножения надо положить числа на регистры и поскольку не указано что это беззнаковая константа, компилятор по логике должен сделать следующее действие: положить число на регистр, вызвать команду расширения знаком команды после чего умножить
то есть
(short)-1 х (short)-1 => (int)-1 х (int)-1
или
0xffff х 0xffff => 0xffffffff х 0xffffffff
то есть почему происходит переполнение думаю теперь понятно.
Почему у тебя вылазит ошибка: наверное потому что ты компилируешь с -O3 и компилятор инлайнит функцию тест и в результате имеем что то подобное. Либо это ошибка во фронтендах шланга u16 u16 не должно превращаться в int int, беззнаковый тип для того и введен что бы компилятор знал что никаких преобразований над числом делать не нужно.
>Но раст всё ещё лучше с этим справляется, щитаю!
1) санитайзеры только для тестов
2) с гцц/шлангом для си можно добиться абсолютно такого же поведения при signed overflow как и в пидорасте
Проблема си в том, что нужно хорошо знать все подводные и инструмент, поэтому си - это для профессионалов, а раст для новечков.
Линтер сразу это ловит, потому что у тебя литералы сразу перемножаются, если как у челика выше с переменными, то не всё так просто.
справа литералы точно так же перемножились после инлайна функции, никаких предупреждений нет, потому что аргументы определены как unsigned short и их умножение выглядит как 0x0000FFFF x 0x0000FFFF => 0xFFFE0001
никакого переполнения быть не должно.
>никакого переполнения быть не должно
Произведение 65535 и 65535 не может быть представлено знаковым интом.
Это либо ошибка, либо в составе -O по умолчанию включаются разные ломающие оптимизации.
А кто просил знаковый int?
умножаются беззнаковые шорты, записываются в беззнаковый результат откуда берется знаковый инт?
В целом согласен, вот только вывод мне кажется не вполне однозначный должен быть. С одной стороны в раст вкатиться заметно труднее чем в си, но при этом это инструмент, который будет работать хорошо и корректно и обладает всеми современными удобствами. С другой стороны в си миллион подводных камней, про которые нужно просто знать™, но зато разработка проще и интуитивнее. Все жалуются про неуклюжесть и неудобства раста в серьёзной и крупной разработке, но и отлаживание вот таких багов на си может занять уйму времени и нервов. Хз, что лучше на самом деле.
Могу однозначно одно сказать изучить раст стоит хотя бы просто для себя как специалиста. Я вот уже почти год решаю задачи на литкоде с применением раста, читаю статьи, смотрю конференции и лекции на ютубе, даже парочку PR отправил в опен-сорсные проекты. В общем, немножко поднабрался опыта в этой области. И хоть я не применял его непосредственно в работе (хотя парочка маленьких сайд-проектов на расте у нас имеется, но их ведёт один человек и ему моя помощь не была нужна), но могу с уверенностью сказать, что всё это поменяло моё восприятие и си и плюсов.
>А кто просил знаковый int?
int просит твой процессор, он с шортами работать не умеет. В знаковые инты их по умолчанию переводит твой компилятор, потому что значение беззнаковых шортов влазит в знаковый инт. Такие дела.
>Могу однозначно одно сказать изучить раст стоит хотя бы просто для себя как специалиста
Если ты зумерок-пидорок, то да стоит учить %язык_нейм%, чтобы думать, что это там чёто помогает тебе, но если базированный профессионал, то ты просто изучаешь технологию, потому что она используется на проекте. Учить пидораст, как и любую другую хуйню, не стоит, если в этом нет практического смысла.
>int просит твой процессор
Челик про type promotion написано в стандарте, какой процессор нахуй, ты долбоёб?
у какого в 🍑 rvalue?
как ты для себя объясняешь что код скомпилированый без "оптимизаций", как написано - положить, умножить, сравнить итд, приходит к правильному результату, а если включить оптимизации то в выхлопе результат неправильный?
Мало понимать отдельные строчки в ассемблере, надо понимать код целиком. Вот результат с -O1 и что мы видим? Он тупо убрал половину кода и подставляет в принт заранее заготовленное значение внезависимости от результата.
Впрочем я сталкивался не один раз уже с историей когда компилятор в ассемблерный выхлоп выдает не совсем тоже что и в итоговой программе и доверять тому что в нем написано особо не стоит. Надо короче компилировать на хосте и делать обжект дамп бинарника или как там оно называется.
No offense, но у тебя логика типичного вкатуна. Базированный профессионал потому и профессионал, что любит учиться и вылезать за рамки обязанностей и потребностей. Вот этот подход — "учить только то что нужно" как раз и отличает новичков, которые в индустрии по причине денег. К ним ещё добавляется зумерская лень — "работать только по расписанию", которую они называют work-life balance, получается унылое говно на выходе.
>>82483
А теперь пораскинь мозгами и подумай почему оно в стандарте появилось. Думаешь, чтобы специально запутать двачеров?
>Базированный профессионал потому и профессионал
Потому что не долбоёб.
>А теперь пораскинь мозгами и подумай почему оно в стандарте появилось
Умунитарий, спокнись уже.
Но если ты правда тупой.
>Я хз как можно не понять концепцию указателей.
Я вот совершенно не понимаю концепцию ссылок в C++. Несколько раз читал разные учебники, и все равно ни хрена не понял.
А в указателях хз, что сложного, это просто адрес в памяти. Обычная переменная расположена по фиксированному адресу, а у указателя его можно двигать туда-сюда. И выделять/освобождать динамически.
Это копия, сохраненная 1 сентября в 04:11.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.