Rust — невероятно быстрый язык для системного программирования без segfault'ов и с гарантиями потокобезопасности.
Ссылка на официальный сайт: https://www.rust-lang.org/
В этом ИТТ мы можем объяснить базовые и продвинутые концепции языка, и программирования в целом, поможем вкатывающимся, подскажем что выбрать для веба, игр или, прости Абу, блокчейна.
НОВИНКА: Rust для Windows: https://metanit.com/rust/windows/
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
Предыдущий: >>3283990 (OP)
На чём писать прикладной софт с компиляцией в бинарник? На чём писать ОС, когда гну-макаки в нарушение своих же гну-лицензий выгоняют из проектов неугодных людей и подчищают код?
Да хоть на питоне. Только сама по себе компиляция в бинарник ничего особо не дает, я видел проги переписанные на крестах которые работали примерно так же.
Я собираюсь в опенжл, но для чего мне раст, когда для этого есть божественный LWJGL и IDEA?
Нужна хоть какая-то производительность. Одно дело написать youtube-dl на нём, где 99% времени упор в IO, другое дело когда питон в 10-15 раз медленнее крестов и ты ничего не можешь с этим сделать, кроме как через костыли переписать на сишку кусок питоновского кода.
>>10784
Без сахара жить сложно, нужен сахар что привкус хуёв во рту не чувствовался.
>Java
>OpenGL
>IDEA
ТРЕД ЯВЛЯЕТСЯ АНКЛАВОМ ЕВРЕЙСКОЙ АВТОНОМНОЙ ОБЛАСТИ. ГОИ ОБЯЗАНЫ ПОКИНУТЬ ТРЕД В ТЕЧЕНИЕ 12 ЧАСОВ
>Без сахара жить сложно, нужен сахар что привкус хуёв во рту не чувствовался.
Что именно не хватает?
>Без сахара жить сложно, нужен сахар что привкус хуёв во рту не чувствовался.
С++/C# там столько синтаксических конструкций, что просто вынимать не будешь ох эти растеры и их аналогии с членами
>питон в 10-15 раз медленнее крестов
Ну не знаю, нейросетки работают одинаково что на питоне что на с++. Ну если профайлером найти ботлнек и переписать его на ассемблере то наверно будет быстрее.
У торча свой JIT. Речь про чистый код. Когда питоновского кода набирается пару десятков тысяч строк, то уже неприятно.
У тебя полная совместимость с сями, тебе вообще нечего бояться. Это раст если загнется (уйдет в апач фондейшн) ты останешься с корытом, а здесь ты сможешь вернутся на си не переписывая код.
Если у зига были бы евангелисты языка, то из каждого утюга бы звучало про совместимость, как например:
js -> ts
java -> kotlin
c -> zig
Но увы, это до сих пор неочевидно.
А кто тебе запрещал на сях писать? Это для тех кто кому нужно могущество си, но на самих сях писать уже не хочет.
Вот сделали бы для си инструмент типа cargo и нафиг ни какие зиги, расты не нужны были бы.
Они что-то пытаются, вон meson высрали, но там у них голова чуть по-другому работает в отличии от нормальных людей, они не стремятся к тому чтобы сделать что-то удобнее для себя, поэтому это скорее всего верхняя планка
> инструмент типа cargo
Это когда без подключения к серверам нельзя собрать ничего? Как показывает практика, завтра могут просто отключить доступ к ним из рашки, а послезавтра в коде сделать закладки для рашкинского региона, чтоб карга не работала там. И никто не будет разбираться, как в линуксе по буковкам "ру" будут нахуй посылать и иди жалуйся в спортлото.
Если тебя это беспокоит и ты не озаботился vpn'ом и/или собственным/надёжным реестром пакетов/зеркалом, то ты дурачок, вон из профессии, иди в пятёрочку.
Тебя и от гитхаба могут отключить, и от sourceforge, и от debian с арчом - хоть из США, хоть из РФ (что не менее вероятно лол - вспомни как РКН ёбнул доступ к гитхабу в РФ в 2014г)
Зачем нужен вездесущий маркетинг и реклама?
Почему нельзя собрать проект без интернета?
Почему нельзя называть переменные "не политкорректными" названиями?
Почему async и лайфтаймы выворачивают язык наизнанку?
Почему в сообществе одни трансы и пидоры?
Почему до сих пор ничего толком не написано на этом "системном" языке кроме цветных версий grep и ls?
Почему так много зависимостей в каждый проект тянется?
>Зачем нужен вездесущий маркетинг и реклама?
Его нет
>Почему нельзя собрать проект без интернета?
Можно
>Почему нельзя называть переменные "не политкорректными" названиями?
Можно
>Почему async и лайфтаймы выворачивают язык наизнанку?
Что значит выворачивают наизнанку?
>Почему в сообществе одни трансы и пидоры?
Общемировая практика
>Почему до сих пор ничего толком не написано на этом "системном" языке кроме цветных версий grep и ls?
Написали, но если хочешь что то конкретное то можешь начинать писать хоть сейчас
>Почему так много зависимостей в каждый проект тянется?
Я ебу почему в твои проекты так много зависимостей тянутся? Либо убирай из сам, либо проси разрабов убрать ненужные зависимости
>Зачем нужен вездесущий маркетинг и реклама?
Поставь adblock.
>Почему нельзя называть переменные "не политкорректными" названиями?
Можно.
>Почему async и лайфтаймы выворачивают язык наизнанку?
Не выворачивают.
>Почему в сообществе одни трансы и пидоры?
Микропластик.
>Почему до сих пор ничего толком не написано на этом "системном" языке кроме цветных версий grep и ls?
Напиши.
>Почему так много зависимостей в каждый проект тянется?
Не тяни.
Одно дело когда по IP блочат, совсем другое когда с другой стороной ищут русских под кроватью всеми способами. В том числе начинают резать "русский" код, что бы это ни значило. Я уже приводил пример с линуксом - там китайский/русский код подчищали, по буковкам "ру" банили, из списка авторов кода в нарушение лицензии убирали. Как тут тебе зеркала помогут не понятно. В симейке/ГОвне хотя бы нет привязки к пердольным репозиториям под юрисдикцией швятой, а просто по ссылке на репу зависимости ставятся, всё децентрализовано. А тут фактически нужно будет свою отдельную репу карги делать и поддерживать, чего естественно не будет никогда.
>а просто по ссылке на репу зависимости ставятся
В карго можно прописать ссылку на гит
> тут фактически нужно будет свою отдельную репу карги делать и поддерживать, чего естественно не будет никогда.
В чем проблема? Максимум сотню широкоупотребимых залить на фсбхаб даже просто руками ничего не стоит.
Почему ещё не запретили? Довольно странно. Пойду создам петицию на форуме спидерастов. Ещё нужно запретить BABE и прочие женоненастнические символы. я реально это сделаю через пару месяцев, найму пару прогрессивных компаний для этого
Кок разве такое позволит сделать?
>Зачем нужен вездесущий маркетинг и реклама?
Кстати услышал тут в такси по радио рекламу крутили, типа ставь наш новый молодежный язык и будешь круче всех. По телевизору вообще 24/7 его рекламу крутят, я редко его включаю, но как не включу везде реклама раста. Ну я зашел к ним в офис в Питере на Рубинштейна 24, мне сказали что можешь бесплатно пользоваться, но чтобы установить нужна флешка, свою нельзя только фирменную, пришлось покупать фирменную, она стоит 100$, но из-за ссанкций ее везут через Казахстан, плюс НДС и растоможка и в рублях уже 16800. Попутно всучили подписку на serde за 499 в месяц. Вот тоже думаю совсем маркетологи охуели
Этот растошизик даже мыслить не может вне своей карго-хуйни, лолд. Вот это выдрессировали опущенца.
Я типа могу Makefile написать и билдить всё скриптиком, хоть на верилоге, хоть на Си. Могу на Cmake написать, и билдить сгенерённым мэйкфайлом. Можно забиндить всё это дело в моём емаксе на f9 и не париться вообще, алсо никакой непонятной хуйни и анальной зависимости от вендора карги/другого магического комбайна, работало 30 лет назад и ещё также (с оговорками лол) проработает 100 лет.
>Почему нельзя собрать проект без интернета?
Хм, поподробней можно?
>Почему нельзя называть переменные "не политкорректными" названиями?
Coolstory? Не принимают код в Open Source сообществе, или за недопущением переменных с неправильными названиями следит сама IDE/компилятор?
>Почему в сообществе одни трансы и пидоры?
Сейчас трансов и пидоров, нет только разве что в Delphi (потому что он как Неуловимый Джо, никому не нужен) и в C (потому что там нужно реально мозгами шевелить, а среди реально мозговитых, "нитаких как все" квиров, обычно не встречается).
Да ладно сразу на ум приходит создатель такого тула как Yosys.
Карго и npm зло, они видимо пошли по пути го
https://zig.news/edyu/zig-package-manager-wtf-is-zon-558e
> json
Больные ублюдки. И так билд-скрипты как письмена шизов, только с мейкфайлами соперничать, так ещё и мету в жсоне делают, пиздос.
Проблема в том, что просто кодить на C не дают. Весь FAANG срочно переходит на Rust и даже Белый Дом требует на него переходить.
В npm были же диверсии в либах по ip, причем там дебил навредил больше своим службам, которые работали в сетях Беларуси и им все потерли (осталась его фото). Из-за флуда в пакетах говна можно засунуть в любой вложенности, а так как в случае карго ты не владеешь своими пакетами после публикации то проблемы могут иметь фанатичный характер.
Менеджер пакетов не должен быть привязан к одной репе. Да и сами репы имеют специфичный формат, а нужно как в го или зиге - скачал, если что, ручками и закинул. Такой подход так же не создает миллион мини реп.
Ебать вот это ПРОСТОТА, нахуя такой велосипед, если можно как сегодня поставить deb пакет со всем нужным/сконпилить из исходников привычным способом.
Естественно его рекомендует белый дом, карго вроде настроен так что автоматом подтягивает версии 1.1.х, то есть цру может просто включать и отключать бэкдоры когда надо в любой цепочки (в каком-нибудь очередном "left-pad"). Просто идеальная платформа.
Там не json, это анонимные структуры зига. Автор говорит "похоже" на json. В мире зига даже билдинг пишется на зиге.
Кто не дает? Они сейчас с тобой в одной комнате?
Си язык богов, скорее загнется все остальное чем си, поэтому хорошее обновление языка не помешало бы. Естественно веб макакам это не подойдет, да и хруст не особо для вебмакакинга подходит, эта беда с асинками, да и костылище сердо.
> Менеджер пакетов не должен быть привязан к одной репе.
Cargo не привязан к одной репе - можешь использовать любую другую доступную.
> Да и сами репы имеют специфичный формат,
Вся специфичность - наличие cargo.toml в папке с пакетом.
> а нужно как в го или зиге - скачал, если что, ручками и закинул. Такой подход так же не создает миллион мини реп.
В cargo.toml ты можешь использовать сторонний репозиторий, git и пути файловой системы для пакетов. Вот прям ручками качаешь, ручками распаковываешь в папочку и ручками прописываешь путь к этой папочке - всё
> любую другую доступную
Я хочу любую другую поддерживаемую. Ясен хуй напердолить можно что угодно, но тогда смысл в карго пропадает, зависимости по ссылкам на гитхаб намного проще в этом случае. А сколько-нибудь поддерживаемая только официальная.
Вот тебе по прямым ссылкам на любой гит репозиторий, можешь выбрать нужный коммит, тег, ветку и путь
https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#specifying-dependencies-from-git-repositories
Так, вот сейчас стало интересно - что это за cargo и с чем его едят?
Просто сколько лет программировал - ни разу ни одно средство разработки не требовало Интернета. Кроме разве что, FlutterFlow но там собственно, само средство разработки исполняется в облаке, а доступ через браузер.
>Cargo не привязан к одной репе - можешь использовать любую другую доступную.
Ну мы же говорим про реальный мир, а не вымышленный с единорогами, да? Можно, но де-факто это не так.
>Вся специфичность - наличие cargo.toml в папке с пакетом.
Скорее всего есть какой-то формат и просто сорцы не положить, мне лень разбираться, на деле всегда есть какие-то костыли у такого подхода.
В общем, когда появиться с десяток реп по типу как у maven, тогда можно будет еще говорить о свободе. (такого не будет, сразу отменят тебя)
Мне больше всего напрягает то, чтобы писать под винду надо тянуть вижлу и С++ билдер в 6гигов.
У зига так же?
Ну это уже как тебе угодно
В реальном мире у меня для личного пользования несколько впс в разных регионах с впн, а для рабочих задач поднята artifactory с кешированием и проксированием до crates, docker hub, nuget, npm и прочего - полнейшая свобода.
Ты какую-то хуиту придумал и сам ее боишься как тот конь который насрал посреди манежа и пугался своего говна
Впервые про роутеры слышишь? Нет никакой проблемы трафик перекидывать на VPN на уровне роутера, а не софта. VPN клиент в любом контейнере поднимаешь хоть на самом роутере.
2011 год - хаха они не могут запретить <базворд>
-----вы находитесь здесь-----
2024 год - хаха они точно не смогут запретить <еще один базворд>
тор тоже не "могли заблокировать" а потом заблокировали, лол
После ввода китайского опыта будут просто автоштрафы прилетать за твои базворды, на твою карту/госуслуги.
>Cargo не привязан к одной репе - можешь использовать любую другую доступную.
Безумный растошиз сейчас всерьёз эту хуйню высрал? Ору нахуй с оправданий.
Нет чтобы признать что растохуйня без анального каргокала не работает нормально, но шиз продолжает какие-то безумные маняфантазии высирать.
К чему всё это? Очевидно что растом пользоваться просто невозможно в современных условиях, он для этого не предназначен.
Не гори так мань, сходи там pkgconfig подергай, autotools сконфигури, cmakelists.txt поправь - ну у тебя столько дел в твоей "испытанной временем" экосистеме, а ты тут ходишь позоришься, тролишь тупостью, уже даже скучно тебя обоссывать
>Не пизди, 1.6.
Я бы тебе поводил скриншотом по губам, но к сожалению все уже установлено (там даже больше 6гб).
Раз установилась вижла я еще шарпы поковырял, лол
Зачем мне это делать, я же не безумный растошиз который вместо написания программ копается в конфигах и каргокале.
Что там? Или ты хочешь чтобы мы пошли изучили синтаксис зига чтобы понять твою мысль?
К сожалению филиал дурки в другом месте. я так понял ты в первые увидел правосторонний кодинг когда возвращают сразу инициализацию вместо присвоения в переменную? Тебе понравится котлин
Кстати легко читается, даже не зная зига не режет глаза.
Загугли - ? это опшены, а встроенные функции через собаку.
Не пизди. Даже если тебя отправляет в установщик студии, то там можно выбрать только тулчейн без самой студии.
А на линуксе тебе не надо тянуть сто зависимостей и gcc?
Ща бы покупать пеку с 64 гигами для компиляции цветного grep и не играть в компьютерные игры.
Разве Линус разрешал тебе использовать пинус?
На самом деле обосрались тут не вин юзеры, а раст, который победил С++, но при этом без С++ тулинга не собирается.
Какой устойчивый манямир, не раст обосрался, а виндузятники. Так и запишем.
И кто вам разрешал сидеть на финском линуксе?
Он вообще приболел немного
># OP
>Растоман
Лол, а ты тогда кто? Или по доброте душевной на зарплате чужие треды перекатываешь?
Интересующийся/зоонаблюдающий.
>на пике я получу прирост производительности в четыре раза?
Может получишь, а может и нет, а может вобще хуже станет
>на арме
Как ты себе представляешь это? Просто переход на другую систему команд в вакууме? И при чём тут яп высокого уровня?
Своего ide написанного на русте не завезли. Ясно.
Конечно. Это же значит, что нужно что-то разрабатывать. Мало того, ещё и чтобы по уму все работало.
Я кстати заметил, что в тредах о русте сам код не обсуждается в принцепе, что показательно. Видимо секта раста - это методичка о том, какой он хороший, свободный и хороший.
Этот тред пристанище шизов, если хочешь обсудить язык, то есть группы в телеге там обычно таких банят. Тут даже ОП на расте не пишет, а просто так перекатывает лол
Он наверное припёрся обсуждать zed, не просто так начал накидывать про иде, а тут чего-то не хотят, пусть сам с собой поразвлекается
Да не, всё удобно, обсуждай
>Я кстати заметил, что в тредах о русте сам код не обсуждается в принцепе, что показательно.
А ты такой же наблюдательный, как Слепой Пью. В Говноланге постоянные срачи на тему Котлина/Шапрпа/Джавы. В Джаве Котлин/Шарп/Го. Тут вся доска такая.
Одно дело накручивать опросники и делать враперы, другое дело писать качественный софт с нуля.
>в тредах о русте сам код не обсуждается в принцепе
В прошлом треде смотри.
>>3308401 →
Там ещё было, но мне лень скроллить. Большая часть постов - толстые набросы и ответы на них. Агрессивный маркетинг привлекает не только потенциальны клиентов, но и поджигает дупы сектантам других языков, которые сюда прибегают что-то доказывать. Впрочем, без них мы бы затонули, наверное.
>Агрессивный маркетинг привлекает не только потенциальны клиентов, но и поджигает дупы сектантам других языков, которые сюда прибегают что-то доказывать.
Вот если есть маркетинг, то он работает в первую очередь на них, прям с таким усердным рвением нужно приходить сюда и что-то доказывать лол. Как религиозные фанатики показывают свои коран/библию/сторожевые башни представителем других конфессий и готовы усраться что-то доказывая
Искусственный хайп привлекает не очень умные массы, от чего появляется мемы типа "а вы не думали переписать на раст" или "дело не в языке, дело в навыке", или "половина раст чата состоит из питонистов" итд. Чтобы это увидеть надо сидеть в забугорном инете, сейчас лулзов меньше, но маркетологи продолжают натягивать раст то на питонистов то на джаваскрипшиков, который он нахер не сдался и которые не имеют бэкграунда С++, чтобы писать либы, но зато те как попугаи повторяют одни и те же идеи раста через свою призму тупости.
Отсюда феномен, его все любят, особенно те кто на нем не пишет, потому как идеи раста хороши (хоть за 10 лет надоели уже), но глубинный раст уродлив и неудобен да, проблема навыка, или в нашей интерпретации - неосилил
>>16439
Plot twist: агрессивные маркетологи раста под видом хейтерков сами постят сюда максимально тупые претензии, чтоб двачекомьюнити их блестяще опровергало.
Хейтерки обоссаны, комьюнити в сияющих доспехах сияет, тред живёт, профит!
Хотя я в этом треде с 2017 сижу-пержу и вижу, что претензии-то повторяются из треда в тред, можно и FAQ чисто под это запилить но мне лень расписывать.
Вот набросаю черновик пожалуй:
Q: В комьюнити одни сплошные LGBTQGCCPP
A: Похуй, ты как был одиноким пидором, так им и останешься
Q: Компилятор раста использует LLVM, а значит не настоящий
A: Похуй, фронтенд на расте, а хуячить собственный бекенд под все поддерживаемые LLVM архитектуры, когда есть готовый (и пилится GCC-кодген) - бестолковая трата ресурсов
Q: На расте нет больших/известных/крутых проектов
A: Похуй, но есть: https://github.com/rust-unofficial/awesome-rust?tab=readme-ov-file
Q: Раст задеприкейтил Windows 7
A: Похуй, оно давно end of life
Q: Раст для Windows требует установки Visual Studio C++ Build Tools
A: Похуй, это всего несколько гигов. Можно обойтись и MSYS2/x86_64-pc-windows-gnu . От туда нужны либы и линкер
Q: RC это GC
A: Нет, долбоёб, это shared_ptr (да и похуй)
Q: А вот зиг/плюсы/сишечка ...
A: Похуй
Q: Синтаксис сложна/нипанятна
A: Похуй, ты ещё туповат для него
Q: Бороу-чекер сложна/нипанятна
A: Похуй, он умнее тебя
Q: Агрессивные маркетологи раста ...
A: Похуй, алсо смешно читать как на opennet в любом посте с упоминанием раста горят жопы хейтерков
Q: Раст сейф но кругом ансейф ряяя
A: Похуй, зато сразу видно в коде что этот блок - ансейф, а не как в сишке/плюсах сплошной ансейф
Q: Проект не собрать без инторнета и доступа к crates.io
A: Похуй, возьми VPN или подними свой кеширующий/приватный реестр пакетов на artifactory/чём-то ещё и пользуйся. Не можешь - иди нахуй
Всё, заебался, пойду чаю попью
>>16439
Plot twist: агрессивные маркетологи раста под видом хейтерков сами постят сюда максимально тупые претензии, чтоб двачекомьюнити их блестяще опровергало.
Хейтерки обоссаны, комьюнити в сияющих доспехах сияет, тред живёт, профит!
Хотя я в этом треде с 2017 сижу-пержу и вижу, что претензии-то повторяются из треда в тред, можно и FAQ чисто под это запилить но мне лень расписывать.
Вот набросаю черновик пожалуй:
Q: В комьюнити одни сплошные LGBTQGCCPP
A: Похуй, ты как был одиноким пидором, так им и останешься
Q: Компилятор раста использует LLVM, а значит не настоящий
A: Похуй, фронтенд на расте, а хуячить собственный бекенд под все поддерживаемые LLVM архитектуры, когда есть готовый (и пилится GCC-кодген) - бестолковая трата ресурсов
Q: На расте нет больших/известных/крутых проектов
A: Похуй, но есть: https://github.com/rust-unofficial/awesome-rust?tab=readme-ov-file
Q: Раст задеприкейтил Windows 7
A: Похуй, оно давно end of life
Q: Раст для Windows требует установки Visual Studio C++ Build Tools
A: Похуй, это всего несколько гигов. Можно обойтись и MSYS2/x86_64-pc-windows-gnu . От туда нужны либы и линкер
Q: RC это GC
A: Нет, долбоёб, это shared_ptr (да и похуй)
Q: А вот зиг/плюсы/сишечка ...
A: Похуй
Q: Синтаксис сложна/нипанятна
A: Похуй, ты ещё туповат для него
Q: Бороу-чекер сложна/нипанятна
A: Похуй, он умнее тебя
Q: Агрессивные маркетологи раста ...
A: Похуй, алсо смешно читать как на opennet в любом посте с упоминанием раста горят жопы хейтерков
Q: Раст сейф но кругом ансейф ряяя
A: Похуй, зато сразу видно в коде что этот блок - ансейф, а не как в сишке/плюсах сплошной ансейф
Q: Проект не собрать без инторнета и доступа к crates.io
A: Похуй, возьми VPN или подними свой кеширующий/приватный реестр пакетов на artifactory/чём-то ещё и пользуйся. Не можешь - иди нахуй
Всё, заебался, пойду чаю попью
Ада - современный язык, алсо, у нас есть спарк.
Q: В комьюнити одни сплошные LGBTQGCCPP
A: Зашквар, пацаны не поймут.
Q: Компилятор раста использует LLVM, а значит не настоящий
A: Ну по суди да, они смогли только осилить ASТ дерево, да и то поставили макросы затычки.
Ты забыл что это говнина компилируется долго.
Q: На расте нет больших/известных/крутых проектов
A: Расту 10 лет, это настораживает, даже у говна есть флагманы, а он ппц какой неудобный.
Q: Раст задеприкейтил Windows 7
A: Там была проблема обратной совместимости. То есть, ты можешь взять старые рантаймы/интерпретатор любого языка и запустить на старом парке компов (всякие банкоматы и кассы могут на этой залупе еще жить). У раста такой возможности не существует из-за того что винда не ставит Visual Studio C++ Build Tools. В общем, нельзя делать так чтобы кабан соснул, иначе соснет язык.
Q: Раст для Windows требует установки Visual Studio C++ Build Tools
A: Расту как победителю С++ нужен тулинг С++, эпик вин.
Q: RC это GC
A: Да, с точки зрение терминологий CS. Но что в этом плохого (в реале это узкая и локальная сборка мусора, тут просто страдает маркетинг, сказать что у раста есть GC, это удар по языку, но язык без RC не может, по дизайну)
Q: А вот зиг/плюсы/сишечка ...
A: Нам нужны не пидорские языки, а интеропы С/C++
Q: Синтаксис сложна/нипанятна
A: Не сложный, он неудобный. Нас буквально хеллоу ворд встречает с макроса.
Q: Бороу-чекер сложна/нипанятна
A: Не сложный, он неудобный.
Q: Агрессивные маркетологи раста ...
A: Агрессивный маркетинг рождает ровно таких же фанатиков с другой стороны, с линукс комьюнити это показывает.
Q: Раст сейф но кругом ансейф ряяя
Q: зато сразу видно в коде что этот блок - ансейф, а не как в сишке/плюсах сплошной ансейф
A: Сначала тебе из каждого утюга говорят про безопасность, а потом на деле оказывается не так все просто. Ты ловишь фрустрацию. Еще раз, агрессивный маркетинг зло, не надо считать программистов за дебилов, ибо у тебя останутся только тупые фанатики, вместо реал кодеров.
Q: Проект не собрать без инторнета и доступа к crates.io
A: Похуй, возьми VPN
Сидит маленький мальчик без ножек на диване
смотрит мультики... тут в комнату врывается папа
И переключает на футбол...
- Пааап .. но я же мультики смотрю
-НУ тогда встань и переключи
-Но паап.. у меня же нет ножек...
-НЕТ НОЖЕК - НЕТ МУЛЬТИКОВ
Q: В комьюнити одни сплошные LGBTQGCCPP
A: Зашквар, пацаны не поймут.
Q: Компилятор раста использует LLVM, а значит не настоящий
A: Ну по суди да, они смогли только осилить ASТ дерево, да и то поставили макросы затычки.
Ты забыл что это говнина компилируется долго.
Q: На расте нет больших/известных/крутых проектов
A: Расту 10 лет, это настораживает, даже у говна есть флагманы, а он ппц какой неудобный.
Q: Раст задеприкейтил Windows 7
A: Там была проблема обратной совместимости. То есть, ты можешь взять старые рантаймы/интерпретатор любого языка и запустить на старом парке компов (всякие банкоматы и кассы могут на этой залупе еще жить). У раста такой возможности не существует из-за того что винда не ставит Visual Studio C++ Build Tools. В общем, нельзя делать так чтобы кабан соснул, иначе соснет язык.
Q: Раст для Windows требует установки Visual Studio C++ Build Tools
A: Расту как победителю С++ нужен тулинг С++, эпик вин.
Q: RC это GC
A: Да, с точки зрение терминологий CS. Но что в этом плохого (в реале это узкая и локальная сборка мусора, тут просто страдает маркетинг, сказать что у раста есть GC, это удар по языку, но язык без RC не может, по дизайну)
Q: А вот зиг/плюсы/сишечка ...
A: Нам нужны не пидорские языки, а интеропы С/C++
Q: Синтаксис сложна/нипанятна
A: Не сложный, он неудобный. Нас буквально хеллоу ворд встречает с макроса.
Q: Бороу-чекер сложна/нипанятна
A: Не сложный, он неудобный.
Q: Агрессивные маркетологи раста ...
A: Агрессивный маркетинг рождает ровно таких же фанатиков с другой стороны, с линукс комьюнити это показывает.
Q: Раст сейф но кругом ансейф ряяя
Q: зато сразу видно в коде что этот блок - ансейф, а не как в сишке/плюсах сплошной ансейф
A: Сначала тебе из каждого утюга говорят про безопасность, а потом на деле оказывается не так все просто. Ты ловишь фрустрацию. Еще раз, агрессивный маркетинг зло, не надо считать программистов за дебилов, ибо у тебя останутся только тупые фанатики, вместо реал кодеров.
Q: Проект не собрать без инторнета и доступа к crates.io
A: Похуй, возьми VPN
Сидит маленький мальчик без ножек на диване
смотрит мультики... тут в комнату врывается папа
И переключает на футбол...
- Пааап .. но я же мультики смотрю
-НУ тогда встань и переключи
-Но паап.. у меня же нет ножек...
-НЕТ НОЖЕК - НЕТ МУЛЬТИКОВ
Почему на расте постоянно все приходится переписывать, как так вышло? Почему это бай дезигн?
>Ты забыл что это говнина компилируется долго.
По сравнению с чем и на каком коде?
>Расту 10 лет, это настораживает
Какой крупный проект, которым все-все-все пользуются, появился на каком-либо другом языке за 10 лет?
>даже у говна есть флагманы,
Какая-то хрень для докера, который сам по себе нужен, потому что весь софт нахуй сломан?
>То есть, ты можешь взять старые рантаймы/интерпретатор любого языка и запустить на старом парке компов
Ты можешь поставить старый Раст на старую винду. В худшем случае придётся собирать самому.
>Расту как победителю С++ нужен тулинг С++, эпик вин.
Ты можешь напрямую дёргать системные вызовы винды, если тебя это настолько беспокоит. Придётся пересобирать половину тулчейна, но это в любом языке плата за ебанутость. Го на Линуксе каждые полгода стандартную либу правит.
>но язык без RC не может, по дизайну
Ни разу не пользовался. Несколько раз был нужен Сell и UnsafeCell по всяким эзотеричным нуждам.
>Q: Проект не собрать без инторнета и доступа к crates.io
>A: Похуй, возьми VPN
>Сидит маленький мальчик без ножек на диване
Сидит тупой безрукий мальчик на диване, который в 2024 не смог завести себе vps'ку за пару криптобаксов вне РФ, ну и пусть себе сидит, нам не нужен дурачок
>По сравнению с чем и на каком коде?
Какая разница с чем? Вечно вам надо сравниваться, ладно, например с го.
>Какой крупный проект, которым все-все-все пользуются, появился на каком-либо другом языке за 10 лет?
Го - губер, докер, еще что-то там.
>даже у говна есть флагманы,
>Какая-то хрень для докера
Что за тупость?
>Ты можешь поставить старый Раст на старую винду.
Именно про это и говориться что не могу, физически просто не могу, я уже не знаю как это объяснить, одно и тоже.
>Ты можешь
>Придётся пересобирать половину тулчейна
Давайте будем реалистами. Ты можешь и свой язык написать, если что-то не нравится.
>Ни разу не пользовался.
Начни уже писать программы, а не скрипты.
Почему растеры такие глупые, тебе говорят нет интернета - собери впску. У тебя ножек нет, сбегай в магазин.
Почему растохейтеры такие тупые? Тебе без интернета даже apt/dnf install gcc libc-dev make vim не выполнить, а ты все рвешься на расте писать. Возьми турбо-паскаль на дискетке, а лучше сходи во дворе погуляй, глупыш
То есть, если я приду с флешкой на другую машину, без сети я не смогу ничего сделать? Вы че там обкурились?
>Какая разница с чем? Вечно вам надо сравниваться, ладно, например с го.
Код на го будет в пять раз длиннее, потому что ни метапрограммирования, ни нормальной работы с памятью не завезли. В итоге будет одно на одно.
>Что за тупость?
Докер решает проблему управления микросервисной парашей, хотя микросервисная параша - это проблема сама по себе. Как вейп вместо сигарет.
>Именно про это и говориться что не могу, физически просто не могу, я уже не знаю как это объяснить, одно и тоже.
Что пишет?
>Давайте будем реалистами. Ты можешь и свой язык написать, если что-то не нравится.
Ты понимаешь, что это как жаловаться, на драйвера? Якобы легендарный Джон Кармак написал игру, а она вылетает, если не установить непонятный костыль с левого сайта.
>Начни уже писать программы, а не скрипты.
Чел, ты компилятор поставить не осилил.
>То есть, если я приду с флешкой на другую машину, без сети я не смогу ничего сделать? Вы че там обкурились?
На флешку нужно что-то скачать, а как это сделать, если РКН запретил?
Ребят, вы если даже не можете две минуты в Гугле потратить, может системное программирование это не для вас?
Ясно, толстота значит
>Чел, ты компилятор поставить не осилил.
Как это отменяет то что ты пишешь скрипты?
>Что пишет?
Читай прошлый тред. Из-за того что МС задиприкейтил тулы (те 7гб С++ радости), нельзя поставить старый раст.
>Докер решает проблему управления микросервисной парашей
Да какая разница, ты просил показать флагман проект языка за 10 лет, я тебе показал. Покажи мне флагман раста (к счастью с серво вы уже не носитесь)
>На флешку нужно что-то скачать
Маневры, то есть без сети эта залупа не работает?
Мне на инет как-то срать, меня больше беспокоит что все яйца в одной корзине. И правда что карго минорные версии автообновляет? То есть можно будет шустро включать отключать руткиты?
>Читай прошлый тред.
Я пытался, но какие-то долбоебы там искали геев и джавистов под кроватью, дальше не читал
>пук
Чего-то не читается что ты пишешь, но ты продолжай
>Как это отменяет то что ты пишешь скрипты?
Пилю игру/движок. Не UE5, но где-то в 50 раз сложнее всех твоих хелло ворлдов. Всё работает на базе элементарного бамп аллокатора даже без RAII. Стандартные контейнеры рассчитаны на слишком общий случай и для геймдева избыточны. Rc вообще по ощущениями добавили чтобы было даже в отрыве от геймдева.
>Из-за того что МС задиприкейтил тулы
Попроси Копайлот показать, где можно на сайте МС скачать старые либы.
>Да какая разница, ты просил показать флагман проект языка за 10 лет, я тебе показал
И ты показал набор скриптов, который умеет автоматически устанавливать пакеты. Охуенно.
>Покажи мне флагман раста
Клёво же.
https://www.youtube.com/watch?v=mKoRzTK1HkU
>правда что карго минорные версии автообновляет?
Если пишешь в зависимостях звездочку, то правда.
Трейты, замыкания, вывод типов, паттерн матчинг, нативный код, система сборки. Этого мало? С тем же успехом можно спросить, а чем Раст хуже любого другого языка. STL в плюсах настолько же неюзабельный кал, например.
Что это? Редактор для создание ассетов-башен?
Я просил флагман, а не мультяшные ассеты для юнити
>в 50 раз сложнее всех твоих хелло ворлдов
Ну я рад что это сложнее моих хеллоу вордов, казалось, что может быть сложнее хеллоу ворда, оказывается есть.
В 50 раз, говоришь? Так-с, 50 умножаем на ноль...
>даже в отрыве от геймдева.
Неожиданно, в геймдеве часто применяют сборку мусора. Даже в анрил. Если бы ты варился в геймдеве то знал бы это.
Я понял что ты очередной раскрашиватель grep
>же неюзабельный кал, например.
Ох эти питон специалисты. А потом окажется что нужная либа на плюсах, или врайпер багован и де-факто заброшен. И вдруг неюзабельныи гавном окажется твой раст.
Открою тебе секрет, что настоящая трудность и проблема для реального программиста это не наличие трейтов, вывода типов, паттерн матчинга и замыкания, а наличие стабильных либ с тысячами человека-часов работы.
> а вот я тру программист и эксперт вот моё мнение
> нет это я тру программист и эксперт, твоё мнение говно, вот моё мнение
Сука дети выйдите из треда, что за цирк вы тут устроили?
И почему в треде половина анонов вобще не программирует на расте а возможно и вообще, кто то форсит тред в б или что?
Это же вообще дефолт, в треде го по ощущениям большую часть постинга исходит от двух шизов - эксшепшн шиз и нинужен шиз. Возможно, второй это эволюция первого.
>Неожиданно, в геймдеве часто применяют сборку мусора. Даже в анрил
Во-первых, Rc не сборка мусора. Во-вторых, Анрил переинженеренное статтерящее мыльное недоразумение, которое используют, потому что остальное еще хуже. Или это был контрпример?
>>17506
>а наличие стабильных либ с тысячами человека-часов работы.
Они требуют тысячи человеко-часов, потому что переизобретают готовые примитивы ОС поверх нескольких слоёв сериализации, виртуальных машин и такой-то матери. А по другому и не получится, потому что мы зачем-то эмулируем PDP-11.
>>17510
Ну маааам.
>ряяя гц ненужно, а где нужно там деды и плохо.
>ряяя счетчик ссылок не сборка, в компьютер сайнс это сборка, а у нас нет, а если надо будет, перепишем ваш компьютер сайнс!!!
>ряяя либы ненужны, я крашу grep, мне там либы ненужны.
Я кажется стал понимать, все эти питонщики выбирают раст, потому что там нет GC и когда они слышат что умные указатели это тоже вид GC - у них взрывает пукан, мол как так я же раст терплю ради ручного управления памятью, а тут опять гц, ряяя!!!
>И почему в треде половина анонов вобще не программирует на расте а возможно и вообще, кто то форсит тред в б или что?
Тут тред держится или наоборот опустел из-за них благодаря шизам или даже одному и тех кто пытается чего отвечать на эти дешевые набросы. Сюда максимум как в зоопарк можно приходить, не более того
Нормальным людям и без этого понятно что умные указатели это сборка мусора.
Просто дети не в курсе что если требуется любая сборка мусора и любые умные указатели - следствие дерьмовой арахитектуры.
Как в расте и C++ придумывается архитектура? Вот в джаве есть чистая архитектура, но там пиздец полный, сложно. А в низкоуровневых языках как это делается?
Отталкиваясь от данных. Смотришь на данные, как часто они меняются, как преобразуются, как долго хранятся, как запрашиваются. Выбираешь подходящие структуры для них, массивы структур, структуры массивов, многомерные массивы. Конечно же большая часть всего этого в глобале существует. Дальше пишешь под это дело всё функции, абстракции, итераторы, атомики всякие, смотря от требований и возможностей. Аллокаций в большинстве программ вообще можно избежать с таким подходом.
>дети
Вот как раз таки дети заполонили тред этими срачами, при этом не давая четких определений что чем является, собственно неопределенность и позволяет обеим сторонам вилять жопой и разводить бесконечный срач. Нормальные взрослые люди начинают с терминологии и определяют рамки того что чем является и уже дальше нужно смотреть подходят ли умные указатели под критерий сборщика мусора или нет, а не просто кидаться говном.
Мимо
Это у питонистов бомбит, для нормального человека нет проблемы что смарт поинтеры это локальная сборка мусора без стоп-зе-ворд. Почему растеры рвут на себе чулки от этого я не понимаю
>>17620
Тебе несколько раз сказали про терминологию cs, в этом вся суть фанатиков, вы будете юлить до последнего и троллить тупостью.
Там очень просто определение
In computer science, garbage collection (GC) is a form of automatic memory management. The garbage collector attempts to reclaim memory that was allocated by the program, but is no longer referenced; such memory is called garbage.
Этот спор можно навсегда закрыть. В прошлых тредах был пример связанного списка на rc<refcell и вроде на ансейве с сырыми указателями. Или же взять смарт поинтеры из с++ и сырые указатели, если раст ограничивает и ансейв.
И честно (с публикацией на гитхаб в докере с результатом) протестить этот список с десятками миллионов значений.
Если разница не велика - то вообще не важно GC или не GC, всегда можно обоссать оппонента, что это дешевая операция, а не костыль. Если же разница велика, втихую как крыса промолчать и спрятаться за анонимностью двача, до следующего срача.
Спойлер - если указатели часто не создаются и не дропаются, то там почти нет накладных расходов (на разыменовывание).
>Тебе несколько раз сказали про терминологию cs
Это вы между собой там спорите, кидаясь какашками в песочнице, я же написал что мимо. Но то что уже пользуетесь справочной литературой, уже хорошо, молодцы
>>17801
У нормального человека вообще не должно рвать от наличия или отсутствия сборки мусора, а нужно решать конкретную продуктовую задачу. Если при решении задачи сборка мусора не мешает, но при этом экономит еблячасы при разработке и сопровождении, то однозначно её нужно использовать. А всякие малолетние дебилы из этого срач на десяток тредов устроили на потеху публике.
ну есть же Rust под ARM
разве я не могу взять исходники проекта и просто перекомпилировать его под ARM?
Тоже так подумал, как то проще мне показался, да и vscode я знаю хорошо. А в чем RR выигрывает в перспективе?
Планирую активно сорцы исследовать, помниться в жб был удобный тулинг для этого и отладчик (но это в жабе, а тут хз).
>А в чем RR выигрывает в перспективе?
Он не использует lsp и при внесении изменений в код быстрее соображает в обмен на съеденную память, плюс чуть побольше возможностей для рефакторинга, а в общем и целом все тоже самое. Сам летом пересел на vscode, по началу было непривычно, а теперь всего хватает
>Планирую активно сорцы исследовать, помниться в жб был удобный тулинг для этого и отладчик (но это в жабе, а тут хз).
А вот это хз, я этим не пользуюсь, только профайлером https://github.com/flamegraph-rs/flamegraph и тот из терминала запускаю
Не везде, конечно, работает как надо, но лучше чем vscode, который показывает ассемблер (хотя я может ньюфаг и просто не знаю).
Потому что тред угнали и перекатывают школьники на винде потому что в игори надо играть, которые не имеют отношения ни к расту ни к разработке в целом, чтобы всех троллить. Вот полюбуйся на ОПа >>12936
Но будучи не трудоустроенным ни дня такие не знают что почти все сидят на маках и линуксах, а виндой пользуются только опущенные пхпшники, шапрписты и игроделы. Поэтому шутка за 300 не взлетела
Попробуй репортить не через две недели, а когда видишь провокации в оп-постах после переката. И сисики писики тоже репортить не забывай. Будет тебе счастье. Страницу обнови через F5.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ebc30b7403b9fbe00d88caab90b76d66
Нашёл и потерял. Как обычно, блокчейн. Брали на испытательный срок. Оказалось, что там не разобраться в теме за две недели. Надо как минимум полгода. Чтобы во всех этих ебучих транзакциях, подписях, и проч. Ничего особо не объясняли. Месяц промучался и усё.
Раст это элитарный язык для души, а черкаши на галлере можно отскребать и на node.js
Как мы делали раньше - у нас есть объекты сервисы и мы их прокидываем как зависимость везде (ну самое простое коннект к базе) сам сервис либо имеет состояния либо нет, у нас просто есть ручки которые мы дергаем и нам не важно, состояние для нас скрыто/инкапсулировано.
С точки зрения архитектуры у нас есть контекст исполнения. А как реализовать подобное в расте? Одни иммутабельные ссылки - не вариант, клонировать владение - ну не вариант вообще (100500 коннектов в базе).
Получается только постоянно прокидывать мутабельную ссылку в каскад функций
f1(&mut MyService) -> f2(&mut MyService) -> f3(&mut MyService)
И надеяться что скоуп ссылки не будет пересекаться (хотя в 90% нам буде нужна иммутабельность).
Какую архитектуру строят на расте и главное как? только без - "а-а-а неосилил", тут правда не видно вариантов для построения большой архитектуры
Рад за вас, но только кто вы и что значит один объект для указателя и для чего вам его должно его хватить?
Ну либо компилятор по попе даст, либо сам себе по попе за низкий перф
Это же вроде про работу с критическими секциями, или у раста это несет дополнительный смысл?
>Это же вроде про работу с критическими секциями,
Это про смартпоинтеры, то что ты выше писал где тебе нужно передать кучу мутабельных ссылок. В большинстве случаев тебе для этого потребуется Arc<Mutex<T>> на картинке выше многопоточность и не нужно следить за владением
>CISA recommends that developers transition to memory-safe programming languages such as Rust, Java, C#, Go, Python, and Swift
Поясните почему в этом списке rust?
Так предложи растовские бест-практикс, я не верю что в расте принято как в жопоскрипте дергать в модуле из другого модуля глобальное состояние.
Каким местом IoC про ООП? Это про связанность архитектуры и скорее про юнит тесты.
И причем тут замыкание, я даже спрашивать не буду, ты какой-то тролль или нездоров.
Связанность архитектуры и юнит-тесты - это баззворды, порожденные ОО дизайном. Голоса в голове сказали нам разделить данные на взятые с потолка лоскутки, в итоге каждый кусок кода надо покрывать тестами, потому что малейшая ошибка развалит всю систему, и ты концов не найдёшь.
Я одного не понимаю, нахуя этому обоссаному пидору IoC в расте (любом другом системном языке), ебало просто имаджинируйте: условная библиотечка для работы с свг форматомю, давайте затащим сюда IoC.
Нет конечно же, тут вкатунов мало и люди на опыте сразу делают все через DI чтобы код можно было легко тестировать и одна часть программы знала как можно меньше о других. Разумеется речь за бекенд, как там cli и gui приложения я не в курсе. Так что ближе к жабе чем к жопаскрипту, на гошке примерно также
Ok(
Object {
"Message": String,
"Result:" Array [
Object {
"Name": String,
"Lastname": String,
"Phone": String,
},
Object {
...
},
...
],
"Success":Bool(),
},
)
В документации serde ничего нужного и близко нет.
>тут вкатунов мало
>сидят невдупляют о существование базовых архитектурных паттернов.
Ладно, было ошибкой спрашивать на двачах.
>Непонятно до чего хочет доебаться
>Ладно, было ошибкой спрашивать
Ладно, узнал завсегдатого шиза ИТТ, не буду кормить
Скорее более подходящее оказалось interior mutability
RefCell (и Rc)
Тут даже пример сразу с моком для тестов.
https://doc.rust-lang.org/stable/book/ch15-05-interior-mutability.html
Насчет шумихи с Rc, насколько я понял значение там одно, не клонируется физически, просто счетчик увеличивается и уменьшается. Так что непонятно откуда столько шумихи.
хотя это правда выглядит все как овер-костыли, RefCell уже может упасть в рантайме и тогда смысл во всем этом борроу-чекенге
Разобрался, спасибо.
Не умею с голубем в шахматы играть
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=649484620382d9f4c54e46779948f772
Я смог достичь IoC превосходства. Спасибо Rc<RefCell (правда тут однопоточно).
>>19848
>>19795
Оказалось Mutex это RefCell для бедных для многопоточки. В общем, раст такая хрень, его надо сначала полностью изучить чтобы что-то пытаться кодить на нем.
Так то вроде норм, не сложно, но боюсь как меня еще асинки встретят.
Можно вместо Rc<RefCell<T>> указывать просто дженерик, а уже конкретную реализацию сделать в структуре Context, например что-то типа этого
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b4d95093e294d5f2b6604d00f864f830
Почему у Раста так плохо с сетью? Какую-то tokio-перделку надо подключать. Хотя бы из main её можно вынести?
Я сначала пришел к такому подходу, тут без Rc вообще
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f270ab858bc2ed0acbd2a8793576e75b
Что мне не понравилось.
1) Мы передаем иммутабельную ссылку, но структура в процессе мутируется. Выглядит грязно, это тот самый Interior Mutability Pattern, насколько это нормально я хз, по мне проще тогда просто везде мутированную ссылку прокидывать и все, как тут
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e11c7a2a9bc11992acd8445b9530a42d
Раст, кстати, не ругает если мы кидаем мутирующую ссылку но не мутируем (в этом примере это хорошо).
2) Не понравилось что меняется API, с задуманного:
fn status(&self) -> &str
на
fn status(&self) -> String
Не хватило мозгов как вернуть ссылку от RefCell может клонировать и прописать лайфтаймы? Хз возможно ли это.
>Не понравилось что меняется API, с задуманного:
fn status(&self) -> &str
В общем, если кто объяснит почему тут так происходит и можно ли это решить буду благодарен.
Чел, у тебя данные на стеке лежат, ты не можешь вернуть ссылку на стек, потому что он очистится. В случае со ссылочным типом типа строки - только класть на кучу его.
Тут же работает
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0bbabe8a1090713a119031c74a4fe3a9
fn status(&self) -> &str {
self.status.as_str()
}
Как я понял, так специально сделано там RefCell возвращает некий тип
Ref<'_, T> (вместо &T) - может фишка в этом лайфтайме?
Тише, мистер Андерсон
>Не хватило мозгов как вернуть ссылку от RefCell может клонировать и прописать лайфтаймы? Хз возможно ли это.
Там проблема что он не уверен во времени жизни ссылки из-за чего либо клонируй, либо делай что-то внутри этого метода
Попробуй скорее всего прокатит, я так на скорую руку пример накидал. Я вообще Arc пользуюсь из-за асинхронности там свои другие приколы
>Я смог достичь IoC превосходства
И ни у кого в этой цепочке не пришло в голову спросить, а не хуйню ли мы делаем?
Я каждый рабочий день такие вопросы задаю. А так в целом +/- движешься в правильном направлении, такой подход с DI помогает проще тестировать и не зависеть от других кусков кода. Можешь кстати сразу взять actix+sqlx и сделать какое-нибудь crud приложение, глядя на примеры в интернете
Главное тут не в том делаем ли мы херню или нет, а в том что мы можем это сделать если надо.
>>20302
>>20301
Я перепробовал все что на данный момент знаю, потом погуглив нашел коммент и как я понял - RefCell ведется себя как мьютекс. Вот один недооценённый коммент, затерявшемуся среди ответов стаковерфлоу (многие рекомендуют возвращать Ref<T>, а это плохо)
You can't return a &T because the borrow() on the RefCell creates a temporary. It let's go of the RefCell-borrow once the Ref is destroyed. Think about it: By returning a Ref<T>, you are effectively write-locking the RefCell until the Ref is dropped by whoever the caller of get() is. This seems like poor isolation.
>>20425
>такой подход с DI помогает проще тестировать и не зависеть от других кусков кода
Пусть у нас есть три функции, которые вызываются последовательно. Одна делает запрос в базу и складывает в более удобные массивы, вторая обрабатывает эти массивы и как-то их преобразует, а третья рендерит на базе первых двух какую-то хтмлку. Каждую из этих функций ты можешь запускать и тестировать отдельно просто через #[test] (немного сложнее в случае с асинком). Остаётся добавить какой-то смок тест, чтобы убедиться, что всё работает совместно.
Что мы получаем, превращая код в ебаный конструктор из абстрактных шизо-трейтов, ради которых еще приходится обходить боров чекер?
Ты когда пишешь код, ты выводишь те или иные состояния программы, ты делаешь по сути те же тесты, только проверяющий код это ты сам и тесты эти одноразовые.
Проверив что все верно, ты идешь дальше.
А потом через месяц ты вносишь правки в работу этой функции и думаешь, а не отвалилось ли где-то что-то, да и как-то в падлу проверять эту функцию заново
Другой момент тестов, отлавливается кучу проблем на этапе разработке, в том числе пересматриваешь дизайн апи.
Не знаю как в расте будет с тестами. Возможно чтобы что-то замокать придется писать очень много кода, но в других языках юнит тесты просто заставляют IoC юзать.
Тут смысл что тебе не нужен какой-то сервис-контейнер - ты зависимости можешь и в мэйне раскидать, тут именно смысл в инверсии управления, например ты можешь дать коннект на тестовую базу или вообще на сервис который вместо коннекта готовый объект возвращает.
Признавайтесь, кто писал.
> кто писал
Шизик, борющийся с голосами в голове. Там какая-то каша, пиздец.
> struct method that returns by reference is allowed to return any reference other than the implicit this reference
Может быть потому что структура это value-тип, а класс - ссылочный? Просто возврат this из класса в шарпе вернёт внезапно ссылку, как этот шизик и пытается сделать со структурой.
> In C#, the garbage collector exists to make references last forever
> Ignoring the performance implications
Тут тоже ахуительные истории, игнорящие факт наличия оптимизаций компилятора и то что реальный GC намного сложнее, а не просто наивная реализация с референскаунтом и циклами сборки мусора.
> Maybe there’s something that makes C#’s ref subset so unusable that people just ignore it
Надо быть совсем отбитым, чтоб не понимать реальную причину. В шарпе JIT все оптимизации делает сам. Поэтому нет смысла ебаться с этим, если нет прироста производительности. А добавили ref в шарп для оптимизации жора памяти в сложных алгоритмах, а не чтоб везде это пихать в надежде получить скорость.
В общем, закончил я свои небольшие исследования, набросал небольшой вывод.
1) Если брать за аксиому, что нам нужны хотя бы юнит тесты, а для юнит тестов нужна инверсия управления и постоянно прокидывание DI-сервисов, то раст становится очень неудобен.
Представим у нас есть сервис который возвращает какой-то список товаров, не важно через что он работает, важно что мы его везде прокидываем, так или иначе у сервиса есть внутренние изменчивое состояние. Чтобы достичь изменчивости, хоть она и внутренняя мы прокидываем его везде через &mut и рано или поздно утыкаемся на ограничения количества mut ссылок. Для решения проблемы мы пытаемся использовать паттерн внутренней изменчивости (Interior Mutability Pattern) и прописываем RefCell контейнер для внутренних данных, который проверяет заимствование на этапе исполнения (комптайм идет лесом), но тут же сразу вытекает другая проблема - мы не можем вернуть данные даже в режиме иммутабельности (можем, но мы по сути блочимся и отдаем лок-мютекса в чужие руки, как вариант клонировать данные и передать владение, переписав сигнатуру трейта и объекта, то есть похерев API).
Из-за кривости паттерна внутренней изменчивости, мы принимаем решение обернуть не внутренние данные, а весь наш сервис в RefCell и еще раз обернуть в Rc так как мы решаем проблему множественного mut.
В итоге DI сущности у нас становятся вида Rc<RefCell<T>> и проблема решается ценой накладных расходов на производительность и проверкой в рантайме.
Потом оказывается некоторые наши DI-сущности надо будет использовать в многопоточном режиме. Если бы это был объектный мир, мы бы внутри объекта просто задействовали лок над критической секцией, но в расте мы снова ломаем API и не просто ломаем, мы переписываем все сервисы и все сигнатуры функций c Rc<RefCell<T>> на Arc<Mutex<T> (вот ревьюер обрадуется коммиту).
2) Почему на каждом этапе мы ломали апи и полностью меняли концепцию? Проблема стара как мир - проблема протекающих абстракций. Да, раст течет как водопад.
Вот пример, у нас есть объект радио, у него сложное устройство, но наружу выставлены только тумблеры и регуляторы (мы создали абстракцию спрятав/инкапсулировав сложность). Радио помимо своей главной функции имеет в АПИ возможность установитьЧастоту(hz) и получитьЧастоту(). То есть, наше радио имеет изменчивое состояние, но опять же вся сложность работы от нас спрятана - у нас только внешние регуляторы (методы). Проблема начинается тогда, когда мы в расте создаем "иммутабельное радио" тем самым повлияв на его внутренние поведение, запретив ему устанавливать себе частоту, тем самым извне мы сломали внутреннюю логику работы объекта. Это и есть протекание абстракции, самая распространенная проблема бизнес-логики.
В общем, раст превосходный по замыслу язык, но раст совершенно не подходит для промышленной разработки. У раст совершенно нет семантического решения для множественных изменчивый состояний, то есть, когда твой мир статичен - раст добр и дружелюбен, но как только ты попадаешь в измененную сложную среду (приложения, игра, крупный софт) - раст начинает всячески тебе мешать, в итоге ты доходишь до абстракций Rc<Refcell<T> которые полностью выворачивают раст и показывают проблемы в дизайне языка.
И это я еще не дошел до асинхронного мира.
В общем, закончил я свои небольшие исследования, набросал небольшой вывод.
1) Если брать за аксиому, что нам нужны хотя бы юнит тесты, а для юнит тестов нужна инверсия управления и постоянно прокидывание DI-сервисов, то раст становится очень неудобен.
Представим у нас есть сервис который возвращает какой-то список товаров, не важно через что он работает, важно что мы его везде прокидываем, так или иначе у сервиса есть внутренние изменчивое состояние. Чтобы достичь изменчивости, хоть она и внутренняя мы прокидываем его везде через &mut и рано или поздно утыкаемся на ограничения количества mut ссылок. Для решения проблемы мы пытаемся использовать паттерн внутренней изменчивости (Interior Mutability Pattern) и прописываем RefCell контейнер для внутренних данных, который проверяет заимствование на этапе исполнения (комптайм идет лесом), но тут же сразу вытекает другая проблема - мы не можем вернуть данные даже в режиме иммутабельности (можем, но мы по сути блочимся и отдаем лок-мютекса в чужие руки, как вариант клонировать данные и передать владение, переписав сигнатуру трейта и объекта, то есть похерев API).
Из-за кривости паттерна внутренней изменчивости, мы принимаем решение обернуть не внутренние данные, а весь наш сервис в RefCell и еще раз обернуть в Rc так как мы решаем проблему множественного mut.
В итоге DI сущности у нас становятся вида Rc<RefCell<T>> и проблема решается ценой накладных расходов на производительность и проверкой в рантайме.
Потом оказывается некоторые наши DI-сущности надо будет использовать в многопоточном режиме. Если бы это был объектный мир, мы бы внутри объекта просто задействовали лок над критической секцией, но в расте мы снова ломаем API и не просто ломаем, мы переписываем все сервисы и все сигнатуры функций c Rc<RefCell<T>> на Arc<Mutex<T> (вот ревьюер обрадуется коммиту).
2) Почему на каждом этапе мы ломали апи и полностью меняли концепцию? Проблема стара как мир - проблема протекающих абстракций. Да, раст течет как водопад.
Вот пример, у нас есть объект радио, у него сложное устройство, но наружу выставлены только тумблеры и регуляторы (мы создали абстракцию спрятав/инкапсулировав сложность). Радио помимо своей главной функции имеет в АПИ возможность установитьЧастоту(hz) и получитьЧастоту(). То есть, наше радио имеет изменчивое состояние, но опять же вся сложность работы от нас спрятана - у нас только внешние регуляторы (методы). Проблема начинается тогда, когда мы в расте создаем "иммутабельное радио" тем самым повлияв на его внутренние поведение, запретив ему устанавливать себе частоту, тем самым извне мы сломали внутреннюю логику работы объекта. Это и есть протекание абстракции, самая распространенная проблема бизнес-логики.
В общем, раст превосходный по замыслу язык, но раст совершенно не подходит для промышленной разработки. У раст совершенно нет семантического решения для множественных изменчивый состояний, то есть, когда твой мир статичен - раст добр и дружелюбен, но как только ты попадаешь в измененную сложную среду (приложения, игра, крупный софт) - раст начинает всячески тебе мешать, в итоге ты доходишь до абстракций Rc<Refcell<T> которые полностью выворачивают раст и показывают проблемы в дизайне языка.
И это я еще не дошел до асинхронного мира.
>мы переписываем все сервисы и все сигнатуры функций c Rc<RefCell<T>> на Arc<Mutex<T>
Безотносительно того, это всё выглядит как креативные способы нарисовать часы в Джире, а чего не сделать враппер или алиас?
>Потом оказывается некоторые наши DI-сущности надо будет использовать в многопоточном режиме. Если бы это был объектный мир, мы бы внутри объекта просто задействовали лок над критической секцией, но в расте мы снова ломаем API и не просто ломаем, мы переписываем все сервисы и все сигнатуры функций c Rc<RefCell<T>> на Arc<Mutex<T> (вот ревьюер обрадуется коммиту).
Именно поэтому нужно скрывать реализацию и везде передавать T и у тебя большинство описанных тобой проблем пропадет.
>>21222
>а чего не сделать враппер или алиас?
Или вот второй путь, структура обертка или алиас
>И это я еще не дошел до асинхронного мира.
Там тоже самое
1250x706, 3:16
Во-первых, следует отметить, что при инструментировании пользовательского приложения с помощью AddressSanitizer во время каждой операции доступа к памяти генерируется код, который проверяет корректность границы памяти.
Это приводит к значительному увеличению размера исполняемого файла и снижению производительности приложения.
Более того, требования к памяти для пользовательского приложения значительно возрастают из-за создания красных зон для всех объектов.
Еще одним недостатком использования красных зон является невозможность охватить все адресное пространство пользователя.
Например, если красная зона для некоторого объекта составляет 32 байта, а доступ к памяти относительно его расположения превышает это значение, то обнаружить такое нарушение с помощью AddressSanitizer невозможно, тогда как выполнение программы в защищенном режиме приводит к исключению из-за нарушения границ памяти.
Еще одним существенным недостатком AddressSanitizer является невозможность обнаружения ошибок доступа к памяти на границе адреса, соответствующих двум соседним байтам теневой памяти.
Первый теневой байт содержит информацию о том, что адрес, описываемый его значением, определен как неотравленный, а второй байт указывает на то, что соответствующий адрес отравлен.
Эту ситуацию иллюстрирует следующий пример на языке C:
...
char a[10]; // предположим, что адрес «a» выровнен на 8
int ⚹p = (int ⚹)&a[7];
…
// где-то здесь массив «a» должен быть инициализирован
…
return ⚹p; // здесь мы загружаем 4 байта, и один из них недействителен
Ошибка пользователя здесь заключается в чтении адреса, на который указывает переменная «p».
Первые три считанных байта будут в назначенной стековой памяти пользователя, но последний байт будет за пределами выделенной границы стековой памяти.
При проверке границы памяти адрес, находящийся в переменной «p», будет сопоставлен с теневой памятью, он будет соответствовать тому байту в теневой памяти, который содержит нулевое значение.
Таким образом, эта ошибка останется незамеченной. Во время выполнения программы с этим кодом в защищенном режиме описанная проблема будет обнаружена из-за использования дескрипторов, которые имеют точную информацию о размере памяти, доступной пользователю.
1250x706, 3:16
Во-первых, следует отметить, что при инструментировании пользовательского приложения с помощью AddressSanitizer во время каждой операции доступа к памяти генерируется код, который проверяет корректность границы памяти.
Это приводит к значительному увеличению размера исполняемого файла и снижению производительности приложения.
Более того, требования к памяти для пользовательского приложения значительно возрастают из-за создания красных зон для всех объектов.
Еще одним недостатком использования красных зон является невозможность охватить все адресное пространство пользователя.
Например, если красная зона для некоторого объекта составляет 32 байта, а доступ к памяти относительно его расположения превышает это значение, то обнаружить такое нарушение с помощью AddressSanitizer невозможно, тогда как выполнение программы в защищенном режиме приводит к исключению из-за нарушения границ памяти.
Еще одним существенным недостатком AddressSanitizer является невозможность обнаружения ошибок доступа к памяти на границе адреса, соответствующих двум соседним байтам теневой памяти.
Первый теневой байт содержит информацию о том, что адрес, описываемый его значением, определен как неотравленный, а второй байт указывает на то, что соответствующий адрес отравлен.
Эту ситуацию иллюстрирует следующий пример на языке C:
...
char a[10]; // предположим, что адрес «a» выровнен на 8
int ⚹p = (int ⚹)&a[7];
…
// где-то здесь массив «a» должен быть инициализирован
…
return ⚹p; // здесь мы загружаем 4 байта, и один из них недействителен
Ошибка пользователя здесь заключается в чтении адреса, на который указывает переменная «p».
Первые три считанных байта будут в назначенной стековой памяти пользователя, но последний байт будет за пределами выделенной границы стековой памяти.
При проверке границы памяти адрес, находящийся в переменной «p», будет сопоставлен с теневой памятью, он будет соответствовать тому байту в теневой памяти, который содержит нулевое значение.
Таким образом, эта ошибка останется незамеченной. Во время выполнения программы с этим кодом в защищенном режиме описанная проблема будет обнаружена из-за использования дескрипторов, которые имеют точную информацию о размере памяти, доступной пользователю.
Это к дискуссии о том что защита на аппаратном уровне (как у эльбруса) не актуальна и все спокойно решается софтом. Просто не решается, худо-бедно решается только в рамках виртуальных машин, у которых в свою очередь проблемы с обработкой больших массивов данных. Ну а нативные библиотеки-санитайзеры это по сути защита только от дурака, пригодное только для того что бы в тестовом режиме запустить/погонять.
Во-первых, тебе никто не мешает для любого процессора написать компилятор, который вместе с каждым указателем держит длину объекта. Или тупо либу для плюсов. В 90% случаев дополнительную проверку можно будет выпилить, а остальные 10% влияния не окажут, потому что никогда не будут срабатывать.
Во-вторых, это вымученный пример, который в Расте даже не получится написать без ансейфа. Иди в плюсотред людей пугать.
В-третьих, это не исправляет программную ошибку. Твой самолёт с сиротками точно также упадёт, просто перед этим он не попортит память, а упадёт в сегфолт. Радостно. Причём, если память скорраптится в обычном проце, то с божьей помощью ничего страшного и не случится, а с Эльбрусом это сразу отключение двигателей и крутое пике.
В-четвертых, указатели и плоская память - это в 64-битной системе само по себе дорогая абстракция, от которой в парсерах и тому подобном отходят, а тут мы снихера удваиваем их размер, потому что какие-то деды в 80-х годах очень нахваливали фичу.
В-пятых, Эльбрус не взлетит, хватит топить за этот кал.
>у которых в свою очередь проблемы с обработкой больших массивов данных
Как и у Эльбруса.
720x1280, 0:24
>для любого процессора написать компилятор, который вместе с каждым указателем держит длину объекта.
И как это убережет от нарушений границ? Как ты проверишь обращение по указателю поехавший?
>Во-вторых, это вымученный пример, который в Расте даже не получится написать без ансейфа.
Так в расте много чего нельзя написать без ансейфа и что дальше? Разговор про адрес-санитайзер с которым у вас помоему даже программы по умолчанию собираются, его надо специально отключать.
>В-пятых, Эльбрус не взлетит, хватит топить за этот кал.
То же самое можно сказать про раст. И у эльбрусанет проблем с обработкой больших данных, там есть даже аппаратный аррей-префетч который по идее хорошо ложится на растовый итератор, в том смысле что он тоже один раз взводится и в режиме цикла обходит весь массив, причем данные массива не забивают кэш как интеловый префетч, а подкачиваются в специальный буфер подкачки откуда моваются на регистры.
Концептуально раст вообще продекларировал все то, что жизненно необходимо vliw архитектурам вообще и защищенным типа эльбруса в частности - компиляция всех модулей прямо из исходников, дебаг/релиз сборка из коробки, прекомпиляция модулей, lto. Для эльбруса так же важно что запрещены манипуляции со стеком которые в принципе не работают ни в каком режиме. Но на деле получилость как с llvm в свое время - все от и до продумано/реализовано настолько хреново, что не позволяет в полной мере даже задуманного
>И как это убережет от нарушений границ? Как ты проверишь обращение по указателю поехавший?
У тебя есть адрес указателя и размер буфера. Как проверить нарушение границы, не представляю.
>его надо специально отключать.
Лолчто.
>аппаратный аррей-префетч который по идее хорошо ложится на растовый итератор, в том смысле что он тоже один раз взводится и в режиме цикла обходит весь массив,
Любая fixed-function фича - это техдолг разработчика, который он хочет спихнуть на тебя. Этим не нужно хвастаться, за это нужно обоссывать. Даже видеокарты уже лет десять как умеют работать с памятью через простые load\store, кроме семплинга из текстур. Невидия вообще SIMD-ядра проапгрейдила до SIMT.
Защита на аппаратном уровне это вообще другой вопрос, наличие отсутствие средств диагностики и отладки ошибок идёт в параллельной плоскости.
>Ну а нативные библиотеки-санитайзеры это по сути защита только от дурака, пригодное только для того что бы в тестовом режиме запустить/погонять.
"только от дурака" - не в тему сказано, ты вообще возможно не понимаешь, что просто наличие санитайзера/любого рантайм инструментария это только 0.005 дела, тебе же надо попасть в ошибочное состояние ещё как-то.
>не получится написать без ансейфа
А без ряяя ансейфа тоже мало что получится написать. Here we go again.
>а упадёт в сегфолт
Вкатун, сегфолт это хорошо, плохо когда софт не падает в сегфлолт, но тебе похоже это неизвестно.
>"только от дурака" - не в тему сказано
Ну да, там в целом разговор то не про безопасность а про средство отладки программ, и то что санитайзер даже в этом плане не сверхнадежное решение. Не помню уже о чем думал когда это писал. В любом случае получаем такую картину:
a) ловим санитайзером (далеко не) все рантайм ошибки, исправляем пускаем в прод окропив святой водой и молитвами дабы бесы не проникли и стек/память не попортили.
б) при помощи отладочной либы опирающейся на аппаратные возможности ловим все что можно, исправляем и в релиз запускаем так же защищенный вариант просто без отладочной инфы.
Тем что сегфолт можно обработать, в отличии от паники. Чем тебе твой стектрейс поможет, если рантайм уже упал? И сегфолт обычно на уровне железа/ядра, это намного быстрее для производительности.
>Тем что сегфолт можно обработать, в отличии от паники
Обработать и сделать что? Если у тебя в рандомном месте случилось неконсистентное состояние ты можешь максимум насрать в лог. Паника хотя бы деструкторы вызовет.
>намного быстрее для производительности
Алло, это Эльбрус, тут заведомо о производительности говорить приходится. Тем более с толстыми указателями.
> Если у тебя в рандомном месте случилось неконсистентное состояние ты можешь максимум насрать в лог.
Нет. Как минимум в винде сегфолт бросает VEH-эксепшен, но наверное и в линуксе есть что-то подобное. Через AddVectoredExceptionHandler можно ставить обработчики эксепшенов и ловить Access Violation, прилетающие из ядра. Ядро убьёт процесс только если до него дойдёт этот эксепшен необработанным. Это один из беспалевных способов дебажить чужой процесс - ставить через VirtualProtect на участок памяти запрет на чтение, а как процесс пытается обратиться к своим данным случается сегфолт и выполнение прилетает в твой "зловредный" код. Ты там можешь даже посмотреть состояние регистров на момент сегфолта: https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-context
А потом можно вернуть выполнение обратно в следующую инструкцию цп, вернув из обработчика эксепшена EXCEPTION_CONTINUE_EXECUTION. При этом память самого процесса никак не меняется, все байтики как были.
так это разные вещи, стектрейс выкатывает операционная система + библиотека, а вот отлавлов некоректных обращений происходит по разному: аппаратная сама контролирует процесс и просто выплевывает сигналы, лови обрабатывай, стек на эльбрусах в любом случае можно получить только от операционной системы. Программная реализация подменяет вызовы алокаторов стандартной либы и создает за границами области памяти "санитарную" зону, в которой и отстреливает (в идеале) всех нарушителей.
А зачем всё это нужно, если всё и так отлавливается в юзерспейсе?
>и то что санитайзер даже в этом плане не сверхнадежное решение
Ты опять не понял, с рантайм-инструментарием тебе ещё нужно наступить на "минное поле", чтобы вообще узнать об ошибке. То есть просто даже наличие неидеального санитайзера грубо говоря ничего не даёт без дополнительных средств, то есть твои возбухания на санитайзеры это вообще пшик, ворос вообще не в санитайзерах на практике.
Наличие аппаратных средств - это вообще другое.
Если багнутый софт не падает в сегфолт, но продолжает работать, это хорошо по-твоему, мистер вкатун/джавахусесос/сисярпоподсос?
если unsafe, то segfault
все получилось, прирост больше, чем в четыре раза
только один крейт выебнулся - SSE2 ему подавай
был выпелен, т.к. основной функционал не затрагивал
*выпилен
хуйню одну
как я понимаю ему похуй mut или нет - там везде будет один адрес на стек (не кучу)
mut нужен для анализа перед компиляцией не натворил ли там делов
но я не сильно шарю, может хуйню написал
1. Зачем тебе биндген для либы на Расте?
2. Просто пропиши путь через cargo::rustc-link-search=PATH
> Просто пропиши путь через cargo::rustc-link-search=PATH
Это для статической линковки. Dll так не линкуется.
DLL обычно линкуется через статический трамплин, который подгружает саму либу. Или через специальные системные вызовы, если нужна ленивая загрузка, хот релоад и подобная шняга. Собственно, если ты зайдешь в папку с билдом, там будет два файла - .dll и .lib
> если ты зайдешь в папку с билдом, там будет два файла - .dll и .lib
Нет, не будет. Биндген только биндинг высрет в папку билда. Dll он никуда не будет перемещать, даже если укажешь ему где она лежит. И её не окажется рядом с приложением, которое при cargo run выдаст что не может найти dll. По логике этих дегенератов она должна лежать где-то в PATH, либо кидай руками. Ну или статически линкуй. На динамическую линковку в винде смело положен хуй.
Создаешь в крейте с либой .cargo/build.toml
[build]
target-dir = C:/куда_хош
И не надо никуда копировать. Ты слишком эмоционально реагируешь на хуйню, на которую нужно потратить три минуты в гугле.
> C:/куда_хош
И как я узнаю куда пользователь либы хочет, лол? Скопировать не проблема, проблема узнать куда. Зависимости собираются до сборки основного проекта и не знают ничего о нём. А основному проекту похуй на всё, он собрал и радостно запускает, даже если dll нужных нет.
> на которую нужно потратить три минуты в гугле
Если бы ты потратил хотя бы минуту в гугле, то увидел что про динамическую линковку в документации ни слова нет. Я тебе ещё раз повторю, если не доходит - всё что ты предлагаешь работает только в момент сборки либы, всё что не прилинковалось статически в этот момент - раст забывает про это навсегда. Всё остальное надо делать руками или писать скрипты по поиску этого говна в кишках карго и копированию куда надо. Даже в крестах есть инструменты для этого, но не в расте.
> Я тебе ещё раз повторю, если не доходит - всё что ты предлагаешь работает только в момент сборки либы, всё что не прилинковалось статически в этот момент - раст забывает про это навсегда
Плюсы работают также. Это в целом свойство винды.
https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
Если уж на что мошнить, то так это на нестабильный ABI, у тебя в принципе нет гарантии, что бинарь узнает либу, которую собрали другой версией компилятора.
>писать скрипты по поиску этого говна в кишках карго
/release/крейтнейм.dll и /release/крейтнейм.lib. Кого ты собрался искать?
>>23678
Пока ни разу не нужен был ни дебаггер, ни санитайзер, включая unsafe код.
>Пока ни разу не нужен был ни дебаггер, ни санитайзер, включая unsafe код.
Безопастность на доверии, я полагаю.
> Плюсы работают также.
Нихуя не так же. В том же cmake он знает таргеты зависимостей и при линковке либы всё сам делает.
> у тебя в принципе нет гарантии, что бинарь узнает либу, которую собрали другой версией компилятора
Ты опять путаешь статическую линковку и динамическую. ABI для динамической либы всегда один, какая ещё версия компилятора, нахуй. В каком-нибудь шарпе тебе даже биндинги не нужны, просто по сигнатуре вызываешь из неё функции.
> /release/крейтнейм.dll
Начнём с того что они лежат не в release, а в release\build\lib-7644e047376f5792 с рандомным именем. А закончим тем что могут и не лежать, если автор либы не положил туда её, раст только rlib оставляет там и никаких правил на этот счёт нет.
У Эльбруса безопасность вообще на товарище майоре (в смысле буквально: указатель можно создать только в режиме ядра, а ты можешь только менять оффсеты в пределах объекта. Сжатие указателей, XOR-списки и так далее - всё идет в жопу). Лучше уж на доверии, я считаю.
>>23695
>В том же cmake он знает таргеты зависимостей и при линковке либы всё сам делает.
Когда ты делаешь find_package, это заведомо предполагает, что зависимость установлена или скачена в какую-то заранее определенную директорию типа /usr/lib. И каждый find_package - это отдельный скрипт, который прописывает что-то в PATH или что-то куда-то копирует. Сам симейк нихрена не знает по умолчанию. Точно также, когда ты настраиваешь сборку в Вижуал Студии, тебе нужно вручную прописать, откуда брать хедеры, что линковать, откуда запускать.
Вот, например, сколько ебалы нужно скопипастить в консоль, чтобы собрать средних размеров проект.
https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWindows
>ABI для динамической либы всегда один, какая ещё версия компилятора, нахуй.
Чел. Если ты пишешь функцию без #[no_mangle], то она записывается в выходной файл с рандомным суффиксом. Если экзешник ищет функцию foo_l44545803458409, а в либе она лежит под названием foo_jfkghkjlghergheroiugher, то при запуске экзешника у тебя будет ошибка линковки. Это ж база.
>У Эльбруса безопасность
Я про другое, пока ты формально не доказал корректность программы, всё это на доверии, были же утечки в стандартной либе, пока там rustbelt до них не добрался.
> это отдельный скрипт, который прописывает что-то в PATH или что-то куда-то копирует
Потому что он может. Как я тебе уже сказал, в расте ты не можешь из зависимости какими-то разумными средствами положить dll пользователю либы куда ему надо.
> в Вижуал Студии
Там уже давно по умолчанию интеграция с vcpkg, с ним вообще однокнопочное использование либ.
> Это ж база.
Растобаза с миллионом ABI даже на одной платформе. А я про биндинги сишных/крестовых либ через bindgen, у сишных либ при динамической линковке нет проблем с этим.
Я доверяю самому себе, когда пишу код на Расте. Доверяю чуть меньше, когда пишу на плюсах, но не настолько, чтобы байтоёбить с кандалах.
> А я про биндинги сишных/крестовых либ через bindgen
Так а чего ты мозги канифолишь, если dll сишная? Я думал, тебе зачем-то DLL на Расте сдалось собирать. Просто кладёшь dll в корень (или пишешь PATH), а крейт-обвязку делаешь статической либой. Всё само работает.
> DLL на Расте сдалось собирать
Я в первом посте про bindgen написал. Я не знаю зачем ты выдумал шизу про биндинги раста на расте.
> кладёшь dll в корень
Т.е. без костылей никак?
>Т.е. без костылей никак?
В смысле костыли. Все программы в истории Винды либо таскают свои либы, либо срут куда-то в system32 при установке. Ты же в любом случае будешь деплоить приложуху когда-то?
Microsoft активно переписывает отдельные части своих программных продуктов на Rust — более производительной и безопасной альтернативе С#. Портал MSPowerUser заметил на сайте компании вакансию для главного архитектора ПО Microsoft 365: он возглавит новую команду специалистов, которые перепишут с C# на Rust серверный код облачной платформы.
Даже мплкософт отказались от своего поделия ака джаваклона лол.
Нихуя ты быстрый, даже двух лет не прошло как ты протухшее говно притащил. Ещё и максимально жёлтое, где шизо-журнашлюхи одну вакансию растана приравняли к "майки переходят на раст".
Внимание вопрос: что конкретно присвоилось? Адрес в куче, адрес не стеке, где лежит адрес на кучу или Foo клониролоась, хотя явно .clone() не вызывался. Foo после создания может релоцироваться? Если до возврата из функции я буду делать поинтеры на Foo, это норм? Они будут жить после присваивания?
Какой адрес на кучу, какие релокации структуры
Таблетки прими, шизик.
Тебе дали язык высокого уровня чтоб ты даже не пытался в это лезть, потому что когда такие как ты лезут в адреса стек, что вообще говоря выходит за рамки любого языка, происходит катастрофа как по части безопасности, так и по части переносимости и даже производительности.
Пиши как на скрипте и не лезь блять, дебилсукаебаный
У тебя уже выделено место под Foo внутри Bar. Скорее всего компилятор просто будет писать в данную область нужные данные.
Другой вариант - выделится место в стекфрейме вызывающей функции, в которую потом запишутся данные от вызова, которые потом присвоятся по адрессу внутри Bar.
Естественно если возвращается Box<Foo>, то передатся указатель на выделенные данные в куче, который потом перезапишется по Bar и самоудалится
Таблетки не забыл? Причем тут джава?
Как только переменную определил, если без оптимизаций, компилятор тебе на стэке выделяет область памяти под размер переменной + выравнивание. В частности, как в примере, в области памяти выделенной под Bar есть область памяти под Foo.
>>25159
два стула:
читаю файл
десериализацию в структуру Foo
на эту структуру хуярю поинтеры
структуру возвращаю из функции
Bar.foo = Foo
ИЛИ
читаю файл
десериализацию в структуру Foo
структуру возвращаю из функции
bar.foo = Foo
хуярю поинтеры уже на bar.foo
есть разница или вообще похуй, даже дверь открыта?
Как хранится Foo внутри Bar? Можешь вообще код использования кинуть?
Просто что ты делаешь в первом варике я не понял
struct Foo{
bar: Bar;
}
struct x{
куча полей
}
fn load(x: &mut X) -> Bar{
let data = load_from_file();
X.имя_поля = data.as_mut_ptr();
}
где-то в майне:
экземпляр foo.bar = load(x);
ИЛИ
fn load(x: &mut X) -> Bar{
load_from_file()
}
где-то в майне:
экземпляр foo.bar = load(x);
X.имя_поля = foo.bar.as_mut_ptr();
}
struct Foo{
bar: Bar;
}
struct x{
куча полей
}
fn load(x: &mut X) -> Bar{
let data = load_from_file();
X.имя_поля = data.as_mut_ptr();
}
где-то в майне:
экземпляр foo.bar = load(x);
ИЛИ
fn load(x: &mut X) -> Bar{
load_from_file()
}
где-то в майне:
экземпляр foo.bar = load(x);
X.имя_поля = foo.bar.as_mut_ptr();
}
а парик твои друзья до сих пор не вернули
так что конкретно присваивается: указатель на стек, где хранится указатель на кучу, сразу указатель на кучу или что-то еще? как это работает?
вот у нас есть структура, в ней поле, которое равно Foo::default()
потом мы создаем (читаем из файла) новый Foo (в функции)
возвращаем его из функции и присваиваем к полю структуру вместо Foo::default()
оно же никуда не релоцируется, правильно?
как это выглядит на более низком уровне?
Низкий уровень это команды@регистры, причем конкретной машины/архитектуры а не любой, если тебе интересно залезть в низкий уровень сначала изучи литературу поро какую нибудь архитектуру и ее ситему комманд которыми она все это делает, и потом просто возьми скомпилируй и сделай обжект дамп программы и так ты увидишь как это все реализовано на низком уровне. В данном же случае ты себе придумал какую-то джава-хип-подобную хуйню и требуешь объяснения как это на ней работает.
Никак оно блять не работает, считай все компилируется просто в "сишную программу" и все.
Для проца нет никакого стека или кучи, только память. Любой объект - это последовательность байт. Ты перемешаешь эти байты в конкретную локацию на памяти. Компилятор делает это статически, поэтому указателя никакого не создаётся, кроме указателя на стакфрейм (который, в свою очередь, тоже всего-лишь кучка байт). Кроме того, всё это дело может соптимайзиться, чтобы жить чисто в регистрах, но это детали.
>В данном же случае ты себе придумал какую-то джава-хип-подобную хуйню и требуешь объяснения как это на ней работает.
понятие стека и кучи есть и в книжках про rust
я читал, что в стеке лежат примитивы и ссылки на кучу, в куче более сложные объекты
в стеке все фикс размера, а в куче выделяется и освобождается память и т.д.
стек маленький и быстрый, а куча большая и медленная
при обращении к объекту ищут его на стеке, а там уже берут адрес в куче
let v1 = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
println!("v1.as_ptr(): {:p}", v1.as_ptr());
println!("&v1: {:p}", &v1);
первое вернет адрес в куче, а второе на стеке
где я напиздел?
Vec<u8> - это примерно struct A { len : usize, capacity : usize, data : *mut u8 }.
В первом принте ты видишь адрес вектора на стеке, а во втором значение указателя data, который лежит внутри этого вектора.
там даже не так, а как то вот так
text: {
0: "{:p}"
}
data: {
main: { 0: &vec foo.bar }
}
calls: {
main : {
0: Foo.new(&self[0]), // передаем адрес на стеке откуда начинаются данные структуры для инициализации
1: println(text[0], &self[0]), // печатаем этот адрес на стеке
2: println(text[0], self[0]) // печатаем то что лежит по адресу на стеке
3: return()
}
}
В любом случае это все условная абстракция которая перекладывается на реализацию конкретной архитектуры.
Вот это ровный чел, наш растан.
>теперь не так бесит когда надо высерать десяток строк мусора
Это где? Код на Расте раза в полтора короче тех же плюсов. И раз в десять короче, чем любой ООП язык.
> Код на Расте раза в полтора короче тех же плюсов.
На крестах просто делаешь что хочешь, а на расте ебёшься с безопасностью и соответствием типов. Даже растовский match требует больше символов чем просто if else.
> раз в десять короче, чем любой ООП язык
В каком месте? В ООП языках не надо трейты отделять от структуры и реализовывать каждый трейт в отдельном блоке, не надо определять модули, не надо делать безопасные обёртки и обрабатывать каждый Result. Литералли только лямбды компактнее чем у других, всё остальное требует больше буков.
>На крестах просто делаешь что хочешь
>Rule of 5
>Rule of 3
>каждый указатель может быть нулём, каждый объект может быть в невалидном состоянии, и их нужно в каждом месте проверять.
Да, охуенно. Это всё можно игнорировать, но так ты будешь как на минном поле, если на ревью не завалят.
>на расте ебёшься с безопасностью и соответствием типов
Если ты не собираешься нигде публиковать свою обёртку, ты можешь обернуть только самое ходовое, а остальное либо добавить потом, либо пользоваться через ряяя-ансейф.
>Даже растовский match требует больше символов чем просто if else.
Так он и делает больше, чем просто if/else. И все ветки матча может сгенерить раст аналайзер, даже нейросетка не нужна.
>В ООП языках не надо трейты отделять от структуры
Крестовый линкер передаёт привет (ну или добавляешь везде inline и собираешь любой проект длиннее 1000 строк по месяцу)
>реализовывать каждый трейт в отдельном блоке, не надо определять модули, не надо делать безопасные обёртки и обрабатывать каждый Result
Ну да, там надо делать иерархии абстрактной хуйни, энкапсулировать один тип хуйни в другой хуйне и прочее перекладывание бумажек. А потом окажется, что ты неправильно понял задачу и у твоей иерархии хуйни надо пробивать дырки в стенах. Зато трейты отдельно определять не надо.
> как на минном поле
Никто не пишет на C++03.
> Так он и делает больше, чем просто if/else.
И что же он делает? Паттерн матчинг и в if бывает.
> Крестовый линкер передаёт привет
Кому он передаёт привет, уже третий стандарт с модулями сидим. Линкер наоборот передаст тебе привет если попробуешь реализацию шаблонов от определения отделить. Да и речь же не только про кресты, раз ты обобщаешь до ООП-языков.
> иерархии абстрактной хуйни
В расте их нет не от хорошей жизни, а от того что потом боров-чеккер не даст просто взять и поменять иерархию. Алсо, уёбищная реализация модулей раста, когда надо чтоб всё было в дереве проекта, а иначе раст-аналайзер отрубит подсветку синтаксиса - это пизда. Из-за этого потом городят костыли с mod-залупой. При том что у всех остальных достаточно просто определить модуль и он просто доступен во всём проекте, без выстраивания дерева от main/lib.
Сейчас бы пользоваться операционкой финского нацика. Пусть дальше сидят на gcc 12 и хоть на сишке пишут.
>Никто не пишет на C++03.
А, там же теперь правило семи. Виноват, попутал.
>В расте их нет не от хорошей жизни, а от того что потом боров-чеккер не даст просто взять и поменять иерархию.
Плохо что ли? Хорошо. Ни разу не слышал, чтобы кто-то посмотрел на код и подумал "А вот бы в этот код заебенить пять тысяч строк абстрактных классов, которые делают ебаное ничего".
>Алсо, уёбищная реализация модулей раста, когда надо чтоб всё было в дереве проекта
Оформляешь как крейт и добавляешь по относительному пути. Без понятия, в чем твоя проблема.
> Ни разу не слышал
Может ты ещё ни разу не слышал как сдыхают проекты на расте из-за невозможности рефакторить его? А были бы нормальные абстракции - рефакторили бы любое легаси.
>Может ты ещё ни разу не слышал как сдыхают проекты на расте из-за невозможности рефакторить его?
Кроме той единственной истории от игродела, все наоборот дрочат на то, как легко им было отрефакторить код, при этом его не поломав к херам. И даже в той истории он не рефакторил, а наоборот пихал квадратное в круглое.
>А были бы нормальные абстракции - рефакторили бы любое легаси.
Абстракции есть. Неведомую херню сотворить сложнее.
> Кроме той единственной истории от игродела
Посчитай хотя бы сколько обёрток на Вулкан на расте написано одними и теми же людьми. Или сколько раз wgpu переписывали. И уже потом рассказывай как это всего лишь один игродел, лол.
>Посчитай хотя бы сколько обёрток на Вулкан на расте написано одними и теми же людьми. Или сколько раз wgpu переписывали
Они пишут абстракцию, ниже которой только драйвер. Базовый уровень. Естественно, что здесь каждый элемент должен быть на своём месте. ООП тут никак не поможет, только перед тем как ты поймешь, что написал херню, у тебя выйдет вдвое больше кода и ты больше заебешься.
Нефига манямир, а волосы шелковистее?
>Литералли только лямбды компактнее чем у других
Самые удобные лямбды в груви котлине и вытекающем оттуда dsl
Я не понимаю почему в новых экзотических языках обходят этот шикарный сахар.
ООП позволяет инкапсулировать внутренние изменчивое поведение от потребителя API, в расте изменчивое состояние достигается только через костыли рантайма rc<refcell>>.
Так что ООП это не только про злое и пугающие зумеров наследование, это еще настоящая инкапсуляция внутренних изменений (в расте это недостижимо, а значит проекты больше grep будут превращаться жопоболь)
Мягкие хотели сделать свой раст с множественной мутацией, но закрыли эксперимент, увы (ну или это недостижимо)
ООП такая штука, она не всегда нужна полностью, но когда нужна, лучше когда она есть.
> в расте изменчивое состояние достигается только через костыли рантайма rc<refcell>>.
Теплое с мягким перепутал
Кто мне в штаны насрал? Оно реально просто рандомно падает. Может 5 раз нормально вызваться, а потом 3 раза подряд упасть. На крестах гонял тесты час - всё ровно.
Алсо, самое поганое что отловить это невозможно никак, раст сразу в панику проваливается. Пробовал дебажить, кроме "Critical error detected c0000374" нихуя понятного.
Можешь попробовать втроянить в свою либу обработчик sigsegv и напечатать стек вызовов. А исходники есть у тебя?
Ты не можешь менять внутренние состояние если ты был создан через let. Это помогает барран-чекать, но просто множит на ноль инкапсуляцию и асбтракцию, а значит любое проектирование.
Простыми словами ты можешь создать машину которая не может завести двигатель, кофеварка, которая не греет, радио которое не может изменить частоту.
Ага, а в плюсах ты не можешь менять состояние если const
Про ключевое слово mut что то слышал?
const в си и плюсах это дополнительное объявление для типа переменной, а не для самой переменной.
Операторов объявления как таковых у них нет вообще. Раньше контроль преременных не считали проблемой, потому что раньше писали размашисто/увесисто типа:
function discursModeration
argument threadAbsoluteId type unsigned short int,
argument userUnicueId type unsigned long int,
argument trollFullWeight type fat64
returnvalue modVerdict type boolean
begin
if trollFullWeight == 10^99
then call zaBanitPidora with userUnicueId
then set modVerdict = true
else
then set modVerdict = false
end
end
наследие старых языков ориентированных на построчный ввод в терминале. Целые поколения в стенах университетов воспитаны объявлять dvernayaRuchkaN1 которую с локально объявленым xer -ом никак не спутаешь.
Но сегодня программирование доступно для широких народных масс, которые в большинстве своемуниверситетах не обучались (хорошо если хоть школу закончили я например нет), не привыкли много читать и писать и поэтому предпочитают более простой и короткий код:
фу блять() {
аа = "1"
ыыы = ээ_блэт()
пук val
}
но с уменьшением количества буков пришла и проблема пересечения переменных, пришлось изобретать принудительный контроль
const в си и плюсах это дополнительное объявление для типа переменной, а не для самой переменной.
Операторов объявления как таковых у них нет вообще. Раньше контроль преременных не считали проблемой, потому что раньше писали размашисто/увесисто типа:
function discursModeration
argument threadAbsoluteId type unsigned short int,
argument userUnicueId type unsigned long int,
argument trollFullWeight type fat64
returnvalue modVerdict type boolean
begin
if trollFullWeight == 10^99
then call zaBanitPidora with userUnicueId
then set modVerdict = true
else
then set modVerdict = false
end
end
наследие старых языков ориентированных на построчный ввод в терминале. Целые поколения в стенах университетов воспитаны объявлять dvernayaRuchkaN1 которую с локально объявленым xer -ом никак не спутаешь.
Но сегодня программирование доступно для широких народных масс, которые в большинстве своемуниверситетах не обучались (хорошо если хоть школу закончили я например нет), не привыкли много читать и писать и поэтому предпочитают более простой и короткий код:
фу блять() {
аа = "1"
ыыы = ээ_блэт()
пук val
}
но с уменьшением количества буков пришла и проблема пересечения переменных, пришлось изобретать принудительный контроль
Такую шизофрению могла только чатгпт выдать, какое отношение этот текст к моему ветке постов имеет?
Словесный салат.
>>333017
>Про ключевое слово mut что то слышал?
Смешно, но проблемы появляются именно, когда начинаешь передавать везде mut (с его ограничением).
то что фп не может решить эту проблему не значит что этой проблемы нет
Исходники есть, там сишное ручное управление памятью и обращение к драйверу, где угодно может это происходить, максимальный ансейф. Как дебажать сишную либу, когда она в расте - не понятно. При этом у либы есть официальная обёртка под шарп и там она без проблем работает. Пробовал в расте делать вызовы функций без аргументов даже, если в цикле делать вызовы, то падает на 2-8 вызов, полный рандом. Раст каким-то образом подсерает в окружение или ломает память.
Но фпшную хуйню проще верифицировать.
В общем, если либу из исходников собрать свежим MSVC, то всё начинает работать. Пидорство. А ведь в шарпе и с гитхаба бинарник работает, хоть с AOT, хоть с JIT. В расте даже пробовал с libloading с ручным вызовом в рантайме и так же рандомно падает.
Что за драма?
мимо говорил, лет 5 назад, что зависимость от чужого бэкенда зло и что говна пожрете
А когда его не хуесосили? Помню ещё лет 10 назад финский нацик горел с багов llvm и то что его пердольный код не работает как надо с оптимизациями, приходится только на gcc собирать. А у растанов наоборот всегда llvm был как позитивная фича, типа оптимизацию за них сделали, они только язык пилят не волнуясь о скорости ассемблерного кода.
>>32341
Заживём когда Карбон допилят.