Comments 86
Сколько времени занимает изучения Rust и нужно ли перед этим знать С?
Знание Си в расте скорее мешает. Кучу раз видел как сишники, используя раст, просто продолжают кодить на Си, но в синтаксисе Раста. Компилятор ругается? Ну просто поставим unsafe, и все заработает!
Си знать не нужно. Но желательно понимать, как работает память компьютера, указатели, стек, куча.
Для освоения Раста лично для меня бОльшую пользу сыграл Хаскель. Внезапно, да. Но так вышло, что с ним знаком был сильно раньше, а потом оказалось, что в Расте используется много фич, характерных для ФП и Хаскеля в частности.
На Расте можно писать сишный код, но если писать на Расте именно растовый код, то от си там не будет буквально вообще ничего. Все другое.
P. S. Мне для вкатывания в Раст на уровень "ну теперь я хотя бы понимаю, что происходит, читаю код и могу писать что-то на начально-среднем уровне" понадобилось меньше недели. Но это зависит от бэкграунда сильно, конечно.
Торвальдс пишет, что многие пишут на раст ради самого раста то, что проще сделать на С. И что молодежь во главе Раста ведется себя не совсем корректно, чем сами вредят распространению языка.
Все преимущество это "безопасная модель" памяти, работа с указателями и т.д.
Это как ООП там, где можно обойтись ФП. В большинстве случаев ООП это глупость, машине все равно, это людям только надо, чтобы сложность упростить.
Машине глубоко по фиг, что исполнять. Не может быть, чтобы реализацию безопасности с Раста не могла быть перенесена в С без изменения синтаксиса и грамматики языка.
Это как изучение новых языков, когда людям за 40.
Люди не учат по той причине, что просто не успеют отбить вложения в изучение нового языка. Изучение ради изучения не имеет смысла.
Про С++ вообще отдельная тема, создатель Unix говорил в 1980х, что проблема С++ в том, что он так часто меняется, что невозможно расчитывать на то, что написанный код заработает в новой версии языка.
Вот, гражданин говорит, что ему очень помогло. Но статистика использования языка говорит о том, что торопиться не надо.
Ежу понятно, для чего создавался С. Чтобы написать UNIX.
Для чего создавался Rust, объясните. В чем цель создания этого языка?
Не зная цели языка, можно учить Lisp, Smalltalk или там, Erlang , и тупо потерять время.
PS. Поправьте, как говорил Аристотель, мы здесь пытаемся найти истину, а не выяснить, кто прав, кто виноват.
Заглушу холивар на стадии искры.
Никто у вас не отнимает Си. Никто вам не навязывает Раст. Более того, можно писать на обоих языках.
"Никто вам не навязывает Раст. " еще как навязывают ;) постояно везде "раст, раст, раст, это сделано на расте" у нетфликс стек на java (их все устраивает) у них спрашивают "почему не раст"? словно это какой-то грааль программирования. я что-то не припомню чтобы раньше так пиарили какую-то технологию словно это серебряная пуля без каких-либо недостатков
словно это какой-то грааль программирования. я что-то не припомню чтобы раньше так пиарили какую-то технологию
Пайтон, пайтон, пайтон, а почему не на пайтоне пишете? На чем у вас бэкенд? А почему не на пайтоне? А вот пайтон то, а пайтон се, а вот такая-то компания пишет на пайтоне, а вы ещё не пробовали пайтон? Пайтонпайтонпайтонпайтон! /S
нет, такого никогда не было, потому что все знали, что пайтан это не про производительность, а следовательно это уже решение с сильным компромиссом. я помню когда руби-рейлс была популярна благодаря скорости разработки (мол топ для стартаперов), потом nodejs за счет возможности держать большое количество соединений, но все равно хайп был лишь отчасти похожий, потому что все (ну или хотя бы большинство) понимали подвохи и возможное целевое использование. но только в случаи с растом все прям специально подчеркивают что "это сделано на расте", практически через черточку после названия продукта ;) когда аналогичное сделано на c++ то так почему-то никто не делает.
Почему же мало реальных проектов на раст?
Я бы не сказал, что его сильно сильно освоить. Стаж сеньора лет 10, ну пол года можно потратить на нормальный язык и знать его в совершенстве
Для чего создавался Rust, объясните. В чем цель создания этого языка?
А может, чтобы заменить яву? Си/++ учить не надо, а получается также быстро.
не получится заменить java, потому что она работает под виртуальной машиной (не нужно иметь разные бинари под разные платформы, уж тем более перекомилировать код через 10 лет чтоб применить все новые оптимизации), динамическая по своей природе с поздним связыванием и богатой возможностью динамически менять код на лету. ничего этого бинарник дать не может. мне как джависту очень инетерсно посмотреть на аналоги продуктов, которые появятся по итогу. Пару таких есть, замена кафке и эластику, но насколько я понимаю они все равно еще слабее по функционалу и вот интересно как раст поведет себя на больших масштабах разработки (я в курсе про фаерфокс, но 1 пример это не пример) а главное будет ли реальный профит с учетом затрат на разработку
Да, в расте есть бинарики под разную платформу, но если под musl линукс, то как-бы и не много версий и не надо.
Например: https://en.wikipedia.org/wiki/Write_once,_run_anywhere
Сколько с того времени, между прочим 1995 год, сейчас можно запустить?
А потом 'вжух' и появился докер, и который пытается решать проблемы с версионностью.
богатой возможностью динамически менять код на лету. ничего этого бинарник дать не может
динамическая загрузка so/dll и в расте есть.
кстати - AWS lambda тоже можно на rust
Поздние связывание сильно поможет в большие проекты, через несколько лет разработки? Вот серьезно - аспекты, аннотации, и прочее оно все может и удобно, но читабельности, понимания иерархии вызовов, и последовательности, особенно при debug, не построчной отладки, a по скудным логам прода, в bugfix нифига не помогает.
И Dynamic Dispatch, в расте, тоже есть, но не такой популярный.
В любом случае - если надо чтобы работало быстрее и постоянно, т.е. нет пакетной нагрузки, когда можно дернуть GC, или нельзя ждать на GC локах, то... ну не на Cях-же делать.
Вам большой проект чего? по строчкам кода или по задаче? если по задаче, есть парочка, тот-же: etcd в виде queue брокер для serverless функций питона из раста. Есть, работает, никто о нем не знает, не потому, что не надо, а потому что не рекламирует его.
Сколько с того времени, между прочим 1995 год, сейчас можно запустить?
все, все будет работать без пересборки, только если вы не лезли туда куда не надо или делали чего-то на свой страх и риск.
динамическая загрузка so/dll и в расте есть.
есть, но как я понимаю только для строго определенных методов, а в java для абсолютно всего. я например как-то делал трюк когда в проприетарном коде мне нужно было изменить поведение, я декомпилировал нужный мне класс (в java с этим тоже нет проблем), поменял нужные строчки, собрал этот 1 класс стандартными консольными средствами, т.к. для компиляции 1 класса по сути ничего не надо кроме его самого и указания на другие уже скомпилированные классы от которых он зависит и вуаля, все подхватилось и все работает. Для нативного кода такой трюк не пройдет.
Докер не решает проблему на 100%, потому что под арм нужен билд именно под арм, даже если у вас докер, такой вот нюанс.
Сколько билдов надо и как их собрать для всех комбинаций win-lin-mac x64-arm ? А для IBM мейнфрейма с его архитектурой сможете собрать или для sun sparc в прошлом? Благо, что сейчас это можно в облаке все сделать, но я вот не уверен что у вас не будет какого-то специфического бага в какой-то платформе и мне интересно как вы будете его дебажить не имея оной у себя (хотя может именно для раста это маловероятно, не знаю). Хипдамп тоже можно между платформами анализировать? я сомневаюсь... А в java у вас 1 jar, за все остальное отвечает oracle и таких проблем как правило нет. Как бы не просто так она и подобные решения с vm стали популярны, а потому что у нее есть решение всех этих проблем изначально.
Вот серьезно - аспекты, аннотации, и прочее оно все может и удобно, но читабельности, понимания иерархии вызовов, и последовательности, особенно при debug, не построчной отладки, a по скудным логам прода, в bugfix нифига не помогает.
у меня противоположное мнение, если у вас прямые руки то все будет супер, а вот если писать это явно то вид будет всегда ужасный и суть будет ускользать из-за нагромождений и бойлерплейта, и как я понимаю в расте от этого не уйти. К тому же иногда нужно сделать магию именно динамически и не очевидно для остальных, без прибивания поведения гвоздями во время компиляции. Особенно это нужно когда у вас имеется какой-то фреймворк и вам нужно кастомизировать его работу. Есть какие-то cms на расте или коммерс решения где дается фреймворк для создания магазина с базовым функционалом который вы потом под свои нужжы кастомизируете? ;) а это тоже большая ниша, когда то что ты делаешь потом берет кто-то другой и меняет под свои нужды через систему модулей, плагинов и т.д. В общем не просто так нет вордпреса на с++ и на расте как я понимаю не будет.
Есть еще кстати любопытный пример: у java есть разные jit, всего таких 4 на рынке но тут интересны 2 от оракла: один на c++ а второй новый на java, который сейчас на 20% быстрее, потому что на java писать проще и она понятней даже для тех, кто разрабатывает jit и как бы сам по себе не дурак. Не знаю на сколько далеко rust от с++ но это как мне кажется хороший пример когда инструмент влияет на результат даже если руки растут из нужного места, может конечно фактор новизны тоже играет роль, но тот на с++ (hotspot) тоже не глупые и не криворукие писали, а по итогу получилось, что крайне мало людей могут разобраться с ним и запилить какие-то новые оптимизации для vm. Так что тут вопрос: а раст точно понятнее, лаконичнее, компактнее и удобнее java чтоб ее заменять? Насколько я слышал например тот же связанный список на чистом расте не сделать.
я например как-то делал трюк когда в проприетарном коде
а в расте это будут изначально сорцы, которые компилятся с zero cost abstraction.
Так что тут вопрос: а раст точно понятнее, лаконичнее, компактнее и удобнее java чтоб ее заменять?
ну так попробовать, не?
а в расте это будут изначально сорцы, которые компилятся с zero cost abstraction.
так сорцов нет и взяться им неоткуда, но даже это не проблема если автор не страдает паранойей и обфусифицирует код. а бинарники все легко и красиво дизассемблируются, в худшем случае вы только не увидите изначальные имена переменных. можете даже по ним прогнать свои тесты с узнать покрытие кода или узнать покрытие кода просто работающей программы :) так что я всегда могу посмотреть любой проприетарный код, даже без сорцов и решить свои проблемы.
ну так попробовать, не?
да, надо будет как-нибудь
еще раз - в расте этого не будет, потому что раст будет компилить все сорцы.
вот небольшой список либсов и апсов: https://github.com/rust-unofficial/awesome-rust
а в расте это будут изначально сорцы, которые компилятся с zero cost abstraction.
Может я чего-то не понимаю в вашем диалоге но что значит изначально и при чем тут сорцы?
В Java это тоже изначально были сорцы которые скомпились в байт код, разумеется без zero cost. У автора коммента на руках не было сорцов но был байт код. Он его декомпилировал, пропатчил, скомпилировал результат, запихнул в бинарник. В вашем случае у вас будет продукт компиляции - бинарник.
Как будете менять в бинарнике конкретный кусок кода?
zero cost abstraction, это про оптимизацию syntax sugar и уменьшение виртуальных связей во время компиляции. В яве этого нет, в яве эта оптимизация будет во время выполнения на уровне JVM.
Это значит, что все библиотеки проекта должны быть доступны в исходниках во время компиляции. vtable в расте есть, но не так популярны. Теоретически, проприетарный код может быть использован, как dll/so, но не как компиляция. Упаковка одного бинарика в другой, компиляцией не считается.
То-есть вот этого всего трюкачества: "декомпилировал & пропатчил" просто не будет, потому что не надо декомпилить. Код либы будет скорей всего доступен в гите, можно форкнуть, пропатчить (+PR) и пересобрать.
Код либы будет скорей всего доступен в гите
Если бы код либы был доступен в гите автор того комментария не приводил пример с декомпиляцией Java класса.
И вы не ответили на вопрос: Как будете менять в бинарнике конкретный кусок кода?
Или для вас ситуация что есть бинарник но нет исходников она в принципе невозможна?
объяснил вроде.
Ситуация, когда есть либа в бинарике и используется в сборке (не компиляции) бинарика в расте, в принципе теоретически возможна. Но компиляция (не сборка/упаковка) требует сорцов И либы будут с сорцами.
Если этот бинарик надо менять, ну меняйте - Disasm, binary patch, тоже теоретически возможно.
Это в яве нормально, когда jar байткод качается из мавен репо, И сорцы идут опционально отдельно.
а в расте это будут изначально сорцы
Вот это наброс. Джава одна что ли такая "гибкая" и "динамическая"? А как же JS, TS, Python, даже PHP?
И не надо накидывать про "кровавый Энтерпрайз". Старый Энтерпрайз просто ловко посадили когда-то на джаву и теперь защищают свои гигатонны корявого легаси. Современные корпорации такой болезнью не страдают
Для чего создавался Rust, объясните. В чем цель создания этого языка?
Чтобы не быть голословным, вот зачем создавался Rust

Не может быть, чтобы реализацию безопасности с Раста не могла быть перенесена в С без изменения синтаксиса и грамматики языка.
Только никто этого не сделал, а Rust вот он с нами
Специфический use case. Спасибо
С был написан под UNIX.
Windows появился спустя 10-15 лет, чтобы выяснилось, что модель памяти не имеет защиты.
Имея доступ к адресам памяти, можно...
В основе языка безопасная модель памяти. А комитет по развитию языка С долго реагирует.
Сколько работы в часах на С , сколько на rust, какая разница в зарплате?
Вероятно нишевый язык, инициировал msft, ,сама msft массово сокращает программистов.
Подмножество от подмножества.
Если это такой хороший язык, то его будут учить в курсе операционных систем.
А есть ли курс по операционным системам с Rust, порекомендуйте пожалуйста?
Rust была придуман Грейдоном Хоаром когда тот ещё работал в Mozilla. Идея была избавить браузер от детских болячек и перестать писать новые. MSFT хотела сделать свой Rust под названием Verona и сделать его типа ультраскалярным, чтобы параллелизовать вычисления (включая сразу на CUDA), но пока в миру его никто не видел и не факт, что проект вообще жив.
А есть ли курс по операционным системам с Rust, порекомендуйте пожалуйста?
есть блог о написании своей ОС с нуля, есть девлоги Redox OS, есть книжка по framekernel, есть новостник по OS Dev на ржавчине.
Спасибо Вам.
Значит эти и тут, как с браузером и джава. Копируют или покупают.
подскажите, как на анроид или йос через их терминалы скрипт - фото сделать и, главное, сохранить?
Через а снимок нельзя сохранить, через й снимок можно только отправить по ip протоколу.
Надо сделать n снимков, которые глупо и физически невозможно руками сделать. Не подскажите, где найти подобный скрипт? Сидеть и жать руками на экран весь день, это, простите, издевательство.
Это идеальная задача для cli приложения, а не сидеть весь день строчить рукой по экрану, как обезьяна.
Не может быть, чтобы у десятков миллионов юзеров не было такой же проблемы.
Эти вендоры не дают прав через терминал сохранить сделанную их же телефоном фотку на их же телефон, который вы ошибочно считаете вашим.
Никакой это не ваш телефон, вы просто арендуете у них эту штуковину.
Терминала по умолчанию от производителя нет ни в андроиде, ни в йос.
У производителя есть терминал, но лично для себя, чтобы удалённо управлять их устройством, которое вы ошибочно считаете своим, и вы на купленном своем телефоне даже терминал на запустить не можете, так?
Значит эти и тут, как с браузером и джава
кто эти, где тут и что там с браузером и джава? вы про джава апплеты вспомнили?
подскажите, как на анроид или йос через их терминалы скрипт - фото сделать и, главное, сохранить?
совершенно не понимаю о чем вы пытаетесь спросить. надеюсь, что у вас это не последствия инсульта.
Msft пытались купить предшествееника мозилла, а потом скопировали его, то же и с языком sun Java.
Странно, это общеизвестно
Как через терминал на этих йосандроидах сделать и сохранить фотку туда, куда пальцем можно, не тыкая пальцем: сделай снимок, сохрани снимок.
Это г, типа ваш телефон, снимок сделает, а сохранить пишет permission denied. Тогда зачем это недоразумение нужно? Как тренажёр доя тапания по экрану?
Печатает так на анроид е. Попробовать после людлома с айфоновсеим терминалом решил, так в андроиде все ещё хуже.
Судя по отзывам линуксфоны ещё хуже, но там хотя бы терминал работает.
Или линук фон посове уйте, это строчерство с этими тапами реально раздражает
Сйчас с терминалом все, андроидов нету?
Подскажите плиз как через терминал полный доступ к своему андроиду или йос получить
Не может быть, чтобы реализацию безопасности с Раста не могла быть перенесена в С без изменения синтаксиса и грамматики языка.
Как бы вы на C без изменения синтаксиса и грамматики выразили бы «объект по возвращаемому из функции указателю живёт не дольше, чем объект по указателю-параметру этой функции»?
Как бы вы выразили гарантию «указатель указывает на существующий объект и не является висячим»?
В виде пакета /библиотеки класса для тех, кому это вообще актуально, и в виде дефаотных политик ктнфигурируеиых для всех остальных , кому нужна тонкая настройка
Что за библиотеки класса в C?
Впрочем, ладно. Не нужно писать реализацию классов/функций/структур этого пакета, опишите просто, пожалуйста, как будет выглядеть сигнатура функции
const char* substr(const char* str, int pos, int len);
с использованием такого гипотетического пакета?
все по Гегелю, если что-то существует, значит, оно кому-то нужно
Первый курс по специальности был Turbo Pascal, это тип, который создал это язык, смог убедить других, ч то им это надо, но я как на самом курсе не понимал, зачем, так и потом.
С++ вероятно успешен, потому что Страуструп тратит огромные усилия на его продвижение, до сих пор, 45 лет после создания.
Кто-то до сих пор поддерживает код, написанный еще до появления С, 1 или 2% этим заняты
Спрашиваешь про конкретику возможного API — получаешь отсылки к Гегелю и какой-то рандомный набор фактоидов.
Ясно.
Реализация чего угодно, это вопрос того, зачем.
Борьба между теми, кто знает раст и с , речь о том, что все это уже было, и даже если с с классами загнется, майнейнить его будут ещё минимум 50 лет.
Ваши вопросы про реализацию, это вопросы глеба капустина.
Спрашивать это надо на форуме поддержки языка.
Большинству плевать и на раст, и на с, и вся эта реализация работает каждый год по-разному.
Я здесь думал спросить, как сделать и сохранить фото в терминале на йосе или андроиде через терминал.
А вы не знаете, никто из вас этого не знает.
В терминале линукс это две команды.
Тут нет терминала , или он не рабочий.
Вместо этого вы должны написать гуи приложение на прорриетарных под каждую платформу языках.
Это, @@@, две строки в терминале.
Справедливости ради, в Расте это все реализовано на уровне компилятора, и какой-то примитивный борроучекер+автосбрасыватель ссылок на Си прикрутить тоже можно. Опять же, написав специальный компиль.
Но именно что примитивный. На минималках. Потому что без правок синтаксиса, в какой-то момент упремся как минимум в лайвтаймы ссыллок, которые, конечно, можно выводить автоматом, но не всегда. Ну и при отсутствии разделения ссылок на мутабельные и немутабельные, под вопросом будет вообще возможность написания кода жизнеспособного...
Никаких гарантий, разумеется, это предоставлять не будет, максимум - некоторая помощь. Хотя, сдается мне, проще загнать код в какой-нибудь ядрёный статанализатор.
Есть такое. См https://safecpp.org/ и соответственно Circle C++ with Memory Safety
для цпп да, там много было попыток разной степени успешности
Я именно про Си. Там, вроде, не делали подобное, но могу ошибаться.
И там такое можно сделать, но, как я выше писал, с большими оговорками.
Справедливости ради, в Расте это все реализовано на уровне компилятора, и какой-то примитивный борроучекер+автосбрасыватель ссылок на Си прикрутить тоже можно.
В clang есть атрибут для некоего подобия лайфтаймов, но оно умеет очень мало и плохо.
Есть также набор атрибутов для проверки корректности локов, но оно тоже умеет очень мало и плохо.
Хотя, сдается мне, проще загнать код в какой-нибудь ядрёный статанализатор.
У ядрёного статанализатора будут те же проблемы, что у попыток прикрутить систему типов поверх синтаксиса, для этого не предназначенного, и семантики, изначально этого не учитывающей.
Всё это довольно быстро упирается в проблему останова.
Изучение ради изучения не имеет смысла.
Вот тут пожалуй не соглашусь. Удовлетворение любопытства - одна из первичных потребностей очень многих людей, даже немолодых. А у других людей есть необъяснимая потребность изучать и учиться, без каких-то причин.
Вот вам проблема, если вы такой любознательный.
Ни на йос , ни на андроиде прлноценный терминал не работает.
Вы что-то писали про q3 планшет.
Как на счеи того, чтобы собирать плвншеты на линукс типа cutiepi, и ещё других убедить этим пользоваться?
Нету ни норм телефонов, ни норм планшетов на линуксе.
Для чего создавался Rust, объясните. В чем цель создания этого языка?
Казалось бы, ответ лежит не поверхности, буквально на главной странице языка https://www.rust-lang.org/. Но, как мне кажется, вопрошающий не ищет ответы, а ищет срача. Видимо следующим не менее важным вопросом будет Почему ПХП такое УГ и как можно на нам писать, когда есть (вставить свой любимый ЯП)
Это они свои хотелки там написали, но только место это уже давно занято.
Причина поиск решения проблемы нерабочего терминала и вообще отсутсвия норм мобильных устройств линукс за норм деньги.
У вас есть какое-то решение для этого?
Проблема:
подскажите, как на анроид или йос через их терминалы скрипт - фото сделать и, главное, сохранить?
Через а снимок нельзя сохранить, через й снимок можно только отправить по ip протоколу.
Надо сделать n снимков, которые глупо и физически невозможно руками сделать. Не подскажите, где найти подобный скрипт? Сидеть и жать руками на экран весь день, это, простите, издевательство.
Это идеальная задача для cli приложения, а не сидеть весь день строчить рукой по экрану, как обезьяна.
Не может быть, чтобы у десятков миллионов юзеров не было такой же проблемы.
Эти вендоры не дают прав через терминал сохранить сделанную их же телефоном фотку на их же телефон, который вы ошибочно считаете вашим.
Никакой это не ваш телефон, вы просто арендуете у них эту штуковину.
Терминала по умолчанию от производителя нет ни в андроиде, ни в йос.
У производителя есть терминал, но лично для себя, чтобы удалённо управлять их устройством, которое вы ошибочно считаете своим, и вы на купленном своем телефоне даже терминал на запустить не можете, так?
Для чего создавался Rust, объясните. В чем цель создания этого языка?
Чтобы на него переписать примерно 10% файрфокса. Остальное там до сих пор на C++ :)
Время зависит от того что вы собираетесь делать. Это как с английским. Сколько времени занимает изучение английского и нужно ли для этого знать кельтский? С Rust всё примерно так же
спасибо, но английский произошел от немецкого, dane rule и все такое.
Так и Rust скорее произошёл от Хаскеля, чем от C
Не помню чтобы я хоть раз писал монаду на Rust, да и мутабельности куча у меня было. Может там и взят какой-то базис, но всё же Rust ближе к ООП чем к функциональному программированию, а то и к процедурному, как раз C. Там даже функции первого порядка только сейчас завозят в nightly-билде, хоть и много иммутабельности и лямбды есть. И всё же это не функциональный язык.
Никто не говорил, что Раст - это Хаскель. Монады ему не нужны ровно по той же причине, по которой нужны Хаскелю - by design. Но влияние есть.
ООП в Расте нет. Там такая же система типов и трейтов как в Хаскеле(typeclasses). Функции высшего порядка есть чуть ли не с первого дня. Функций первого порядка в том же Хаскеле, насколько помню, тоже нет, хотя смотря что вы называете этим термином, конечно. Иммутабельность переменных - дефолтное состояние.
Раст - не чисто функциональный язык, но отлично работающий в функциональном стиле. И, повторюсь, человеку, знающему Хаскель, Раст будет понятнее, чем человеку, знающему Си. Одни только мэтчи с гвардами чего стоят.
И тут даже речь не о том, что Раст это ФП, так как это не ФП в чистом виде, а именно в том, чье влияние в нем ощущается больше. От Си там почти и нет ничего.
Да, с функциями первого порядка - моя ошибка терминологии. Я всегда считал такими не только те функции, которые можно передавать и принимать в параметрах, и возвращать из функций, но и те, которые имеют свои собственные свойства и методы. Однако, судя по данным в интернете, это не обязательно, достаточна возможность их передачи. Впрочем, свойства-методы всё-равно пока в найтли, но их когда-то зарелизят и в стейбл.
Я знал JS/TS, немного Ruby и по мелочи ещё пару языков. Месяца 4 надо чтобы начать писать без боли. Я прочел две онлайн-книги на русском - референс по языку и со стороны практики с примерами. Они предлагаются прямо на сайте раста. Не хватило мне только про async, но в принципе можно почитать спеки Tokio, это библиотека для async. Ещё чтобы не ломало в начале хорошо бы почитать про RefCell и зачем оно, реально вызывало вопросы про передачу данных во множество мест. В принципе через год полноценного изучения можете писать продакшн.
Спасибо.
Под какие платформы и какие продукты?
Вебсервисы на rust пишутся?
Как мейнтейнится код после сдачи проекта?
Спасибо Вам.
Успехов с пользователями.
Не подскажите, как на анроид через скрипт фото сделать и сохранить?
Надо сделать n снимков, пальцы сводить начинает. Не подскажите, где найти подобный скрипт?
Знать Си не нужно, иногда даже вредно, заставляет думать в неправильных паттернах) А создавался он для простой цели: писать быстрый и безопасный софт, в первую очередь - браузерный движок, чтобы не было тех самых уязвимостей с памятью, которые составляют 70% всех дыр в безопасности
"Rust была придуман Грейдоном Хоаром когда тот ещё работал в Mozilla. Идея была избавить браузер от детских болячек и перестать писать новые.
MSFT хотела сделать свой Rust под названием Verona и сделать его типа ультраскалярным, чтобы параллелизовать вычисления, но пока в миру его никто не видел и не факт, что проект вообще жив.
А есть ли курс по операционным системам с Rust, порекомендуйте пожалуйста?
есть блог о написании своей ОС с нуля и есть девлоги Redox OS , есть книжка по framekernel , есть новостник по OS Dev на ржавчине."
"Знать Си не нужно, иногда даже вредно, заставляет думать в неправильных паттернах)
А создавался он для простой цели: писать быстрый и безопасный софт, в первую очередь - браузерный движок, чтобы не было тех самых уязвимостей с памятью, которые составляют 70% всех дыр в безопасности"
Спасибо, то есть, создавался он для Mozilla Firefox в 2000х?
Понимание ниже лежащей UNIX машины спустя 30 лет после создания С очевидно другое, та управляет памятью, выводом и доступом к файлам, и предоставляет терминал для взаимодействия с компьютером. Но большинству хватит в своей жизни даже не С, а простого терминала.
Проблема в том, что терминал, shell больше не работает на смартфонах, так как они проприетарные.
Все правильно понимаю?
Только взглянул на ваш код на TS сразу увидел проблему. С таким сталкивался еще в школе 25 лет назад…
Пример на Rust как раз показывает всю ущербность Rust. Сам себе создал проблему на ровном месте (await, отсутствие контроля за потоками), сам ее нашел еще и в другом месте и героически не дал собрать проект.
Напомнило C++ 2000-х годов, где сообщение об ошибке ссылалось на что угодно, только не на строку с проблемой.
На C++ за десятилетия программирования я ни разу не столкнулся с ошибкой что освободил мьютекс из другого потока…
Дедлоки - да, но они и в расте могут быть.
И за этим всем на самом деле скрывается некачественная архитектура проекта. Блокировать мьютекс надо только на составление запроса, но не на выполнение (с оговорками на случай больших транзакций с откатами).
Сам себе создал проблему на ровном месте (await, отсутствие контроля за потоками), сам ее нашел еще и в другом месте и героически не дал собрать проект
Предлагаете await не использовать совсем? Назад, к лучине, берестяной грамоте. Await на любом языке может неявно менять поток. Но rust об этом скажет, а c++ и др. нет.
На C++ за десятилетия программирования я ни разу не столкнулся с ошибкой что освободил мьютекс из другого потока
Короткие локи? Если делать долгие задачи, то обязательно появится
await на JS не меняет поток :) await в C++ нет. И да, я предпочитаю когда я точно знаю какой поток что выполняет, а не рандом.
Ради эксперимента можем посоревноваться, я пишу на C++, а вы на Rust и сравниваем скорость разработки, быстродействие программы, безопасность, архитектуру, простоту поддержки и красоту кода. C++ сделает Rust.
Хороший паттерн блокировок в C++ - scoped_lock, unique_lock, никто уже давно не лочит мьютексы сам. Приходится захватывать мьютекс в одном месте, а освобождать в другом = архитектура кусок говно. Раньше я и без них не делал так, чтобы лок / анлок был в разных функциях
можем посоревноваться
Как в анекдоте: утащите на свой уровень и задавите опытом. Вот, await уже предлагаете не использовать.
Понятно, что я пишу на раст месяцы, а вы на плюсах десятилетия.
До этого писал на плюсах, шарп и (прости, Господи, грех страшный, никогда больше так не буду) на пхп.
Rust очень молодой и незрелый ещё. Тулза только начинает появляться: IDE rustrover хоть можно стало пользоваться с этого лета, не раньше. Библиотек прикладных нет вообще, Excel надо парсить самому если стили надо все прочитать.
Хороший паттерн блокировок в C++ - scoped_lock, unique_lock, никто уже давно не лочит мьютексы сам
Но await нету, а аналог такой же как и везде.
Task<void> fetch() {
std::cout << std::this_thread::get_id(); // Thread A
auto response = co_await http_get(url);
std::cout << std::this_thread::get_id(); // Thread B ???
auto data = co_await process(response);
std::cout << std::this_thread::get_id(); // Thread C ???
}
Не забудьте выстрелить себе в ногу, C++ это любит.
В C++ нет полноценного “async/await” как законченной модели исполнения. Есть низкоуровневые корутины (co_await/co_yield) - синтаксический сахар без Future/Executor/IO-рантайма, которое нужно всё написать самому, там же и настраивается поведение в каком потоке проснется код после co_await, но тут даже по имени видно "co_await" != "await", о чём я и говорил.
Я не утверждал, что в C++ нет ничего похожего по поведению на .await в Rust.
И в любом случае, даже в C++ корутины в продакшене плохо - они делают код некрасивым, сложным, медленным (без шаманств). И даже с этими всеми недостатками гибкость C++ выше на голову.
В С++ fetch выведет одинаковые thread_id если запустить вот так:
asio::io_context io;
auto ex = asio::make_strand(io);
co_spawn(ex, fetch(), detached);
io.run();
В C++ вообще мьютексы на общие данные внутри корутин использовать не очень хорошо, будут проблемы, но тем не менее это можно сделать корректно, например, организовав шардинг задач по id (если вся работа с локами только внутри корутин) или используя await-able мьютексы.
Выстрелить себе в ногу - это больше про интеллект, чем про ограничения и возможности языка. Тот же нож в руках у идиота тоже может делов натворить и что, из-за пары идиотов делать все ножи тупыми?
Не подскажите, как на анроид через шелл скрипт фото сделать и сохранить?
Надо сделать n снимков, пальцы сводить начинает от такого количества нажатий.
Не подскажите, где найти подобный скрипт? Ни под анжроид, ни под йос ничего нету?
Вызвать камеруadb shell am start -a android.media.action.IMAGE_CAPTURE
Замените Х и Y на координаты баттона сделать фотоadb shell input tap X Y
либо нажать кнопку volume upadb shell input keyevent 24
Список файлов фотографийadb shell "ls /sdcard/DCIM/Camera/"
скачать все фотографииadb pull /sdcard/DCIM/Camera/ C:\AndroidPhotos
скачать одну фотографию adb pull /sdcard/DCIM/Camera/IMG_20250911_083000.jpg C:\AndroidPhotos\IMG_20250911_083000.jpg
На телефоне должен быть включен режим разработчика и в нём отладка
adb скачайте с https://developer.android.com/tools/releases/platform-tools
спасибо
Камеру скрипт открывает, но на IMAGE_CAPTURE, tap и keyevent 24
терминал выводит:
/system/bin/input : /data/data/com.termux/files/usr/bin/cmd : Permission denied
ternux имеет только две записи, права Microphne, Notifications,
for Storage, надо отдельно, вероятно, проблема в том, что через termux андроид не дает доступ к файлам
у андроида есть терминал на самом смартфоне, по типу termux, чтобы скрипт запустить?
how to start terminal on android 15
Google :
Enable Linux Development Environment:
Navigate to Settings > System > Developer Options.
Scroll down and find the Linux development environment option.
Toggle the switch to the On position. This will enable the Linux environment and initiate the download and setup of necessary components, such as a Debian instance.
Но там был экспериментальный терминал, сейчас его нет.
Как терминал от андроида 15 запустить, подскажите пожалуйста, с самого андроида, а не через подключения андроида к компьютеру по кабелю USB.
Зачем это было усложнять настолько. Это две строки bash в Линукс
Всё-таки, await это удобно.
Можно, конечно, написать всё руками. Но чаще всего, не нужно.
И в любом случае, даже в C++ корутины в продакшене плохо - они делают код некрасивым, сложным, медленным (без шаманств).
В средней софтине корутины — это очень удобно. Куда проще писать код в духе
Task<Either<Error, Result>> FetchPhotos(int id)
{
const auto& reply = co_await network->request(id);
const auto& data = co_await *reply;
const auto& json = co_await parseJSON(data);
co_return co_await traverseJSON(json, { "reply", "photos" });
}
вместо, скажем, Q
:
void FetchPhotos(int id, auto callback)
{
auto reply = network->request(id);
connect(reply,
&QNetworkReply::finished,
[&]
{
if (!reply->isValid() || reply->code() != 200)
{
log() << "bad reply:" << ...;
callback(Left { NetworkError {} });
return;
}
const auto& data = reply->data();
const auto& maybeJSON = parseJSON(data);
if (!maybeJSON)
{
log() << "failed to parse json" << data;
callback(Left { JSONError {} });
return;
}
...
});
}
Выстрелить себе в ногу - это больше про интеллект, чем про ограничения и возможности языка. Тот же нож в руках у идиота тоже может делов натворить и что, из-за пары идиотов делать все ножи тупыми?
Тот же станок в руках у идиота может отрезать ему руку и что, из-за пары идиотов делать раздельные кнопки включения станка и лазерные датчики наличия рук в рабочей зоне?
ни разу не столкнулся с ошибкой что освободил мьютекс из другого потока
Возможно, потому что вы очень опытный разработчик и интуитивно пишете так, чтобы избегать таких ситуаций. А Rust делает это знание доступным даже для новичка, формализуя его в правилах компилятора
А еще бывает, что не сталкиваешься с чем-то, потому что не сталкиваешься. Проблема есть, но просто не у тебя в дев среде, а где-то там, у конечного пользователя, который стесняется зарепортить проблему или не понимает, что она есть... Если я не вижу баг, это не значит, что его нет. Просто компиль Раста говорит о проблеме, а компиль С++ нет.
Ну, на моей практике Rust наоборот теряет в эффективности с ростом проекта. Система владения-заимствования уничтожает архитектуру и системы
При разработке многопоточных проектов, да и многих прочих, borrow checker часто вообще не видно - 99% лайфтаймов выводятся автоматически, а при шаринге между потоками всё равно используешь Arc и подобные вещи.
Это потому что вы пытаетесь передать лайфтаймы через границу модуля. Столкнулся с этим. Так делать нельзя. Разве что случаи, когда вам нужно выжимать последние проценты производительности. Если нет, то просто копируйте, а лучше на границе передавайте DTO. Rust умеет копировать данные быстро.
Если так сделать, то рост программы будет шёлковым)
Правда, некоторые контракты лучше зафиксировать на ранней стадии и не менять. Впрочем, так у всех: контракты фронт - бэк не отследить компилятором, контракты / требования потокобезопасности в ООП вообще не видны в сигнатурах ( почти всегда класс не потокобезопасносен, а крайт безопасен, Rust хотя бы Send/Sync показывает). Причем, переход от непотокобезопасного кода к безопасному может устроить вам стрельбу дробью на половину программы.
Что Rust показывает:
Send - можно передать между потоками
Sync - можно шарить между потоками
!Send - нельзя (Rc, MutexGuard)
Дедлоки не покажет, да.
Но можно так
struct Unlocked;
struct Locked;
struct Resource<State> {
phantom: PhantomData<State>
}
// можно взять лок только в правильном порядке
impl Resource<Unlocked> {
fn lock(self) -> Resource<Locked> { ... }
}
Или так
// вместо mutex - каналы
tx.send(Command::Update(data)).await;
Архитектура явно не учитывала особенности языка. Часто для сложного многомодульного проекта нужно выдохнуть и обмазаться рефселлами / локами на уровне апи, иначе реализация превратится в задачу трех тел.
Вероятно, вы не оптимально ее используете. Если писать в ФП-стиле, без сайдэффектов, вам вообще не придётся передавать владение в функции, к примеру. Хватит заимствования рефки немутабельной. Или клонирования, если передаётся объект, который нельзя прочитать, не изменив, по какой-то причине. Ну а если речь идет о чем-то прям совсем одноразовом и не клонируемом, вроде стрима сокета, то и тут владение проблему не создаст...он же одноразовый, после чтения опустошается. Ну передадим его консьюмеру по мутабельной ссылке, значит таков его путь.
Когда человек пишет на расте так, как привык в других языках, это рождает проблемы и борроучекер выглядит врагом. Это то, о чем я писал с самого начала - на Расте надо писать как на Расте, а не как на другом языке. Ну такой он вот.
Он кажется сиподобным, и это вызывает ложные ассоциации и толкает на применение некорректных паттернов. А на деле там от сиподобности только фигурные скобочки, синтаксис цикла while, и...пожалуй все. Возможно, синтаксис IF, если закрыть глаза на то, что в Расте IF - это выражение. А, ну ссылку можно через звездочку разыменовать.
А может она не уничтожает архитектуру, а просто выявляет ее недостатки? Если у вас постоянно возникают проблемы с borrow checker-ом, это скорее признак того что у вас слишком запутанные и неявные связи владения данными в системе
Согласен про уверенность, но есть и обратная сторона. Иногда борьба с компилятором особенно с лайфтаймами в сложной архитектуре, отнимает столько ментальных сил, что продуктивность падает ниже плинтуса. Rust снижает когнитивную нагрузку на этапе поддержки, но сильно повышает ее на этапе написания. Это трейд-офф
А кто понял почему редирект не происходит всегда, сразу после await? Await же всегда отдает промис, и управление отдается браузеру, который сразу должен сделать редирект…
Присвоение значения «window.location.href» не выполняет перенаправление мгновенно, как я предполагал. Оно просто задаёт значение и планирует перенаправление, как только оно станет возможным.
А при чём тут typescript? Странно предполагать что присвоение значения переменной моментально прервет текущий поток и запустит некоторую магию. У location ещё location.replace() и location.assign() есть. И всё это АПИ браузера, и ни каким образом это не связано с typescript, JavaScript и уж тем более с await.
На расте переписывают gnu coreutils, чтобы в убунту отказаться от gpl лицензии и привлечь корп. пользователей с деньгами, и IBM скорее всего что-то похожее делает со своим RHEL.
Для пользователей конкуренция это всегда хорошо.
Неожиданный скачок продуктивности благодаря Rust