Rust
1.27K subscribers
74 photos
43 videos
11 files
105 links
Полезный контент по программированию на Rust
Download Telegram
Rust: параметризуем мутабельность через маркеры и ассоциированные типы

Borrow-checker — отличный секюрити, который очень эффективен, если мы находимся в безопасном Rust. Его поведение отлично описано в RustBook, и, по крайней мере, я почти никогда не сталкиваюсь с придирками, которым я бы не был благодарен.


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

https://habr.com/ru/articles/703018/

👉 @rust_lib
Я написал одну из самых быстрых библиотек датафреймов

У меня в портфолио есть несколько готовых пет-проектов на Rust, и я заметил, что позиция «а у нас уже получилась DataFrame?» нисколько меня не устраивает. Поэтому я подумал, не сделать ли мне элементарный контейнер, который решал бы мою конкретную задачу. Но этот проект вышел из-под контроля.

Год спустя, написав немало кода, я создал одну из самых быстрых библиотек датафреймов, применимую в Rust и Python. Вот мой первый официальный «Hello World» на polars, размещённый у меня в блоге. Надеюсь, что с помощью этого поста я смогу пояснить читателю некоторые решения, которые мне довелось принять при проектировании, и вам станет понятнее, как Polars работает под капотом.

https://habr.com/ru/companies/timeweb/articles/737808/

👉 @rust_lib
Это слишком опасно для C++

Некоторые паттерны стало возможно использовать на практике только благодаря безопасности Rust по памяти, а на C++ они слишком опасны. В статье приведён один такой пример.

Работая над внутренней библиотекой, написанной на Rust, я создал тип ошибок для парсера, у которых должна быть возможность сделать Clone без дублирования внутренних данных. В Rust для этого требуется указатель с подсчётом ссылок (reference-counted pointer) наподобие Rc.

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

https://habr.com/ru/articles/793868/

👉 @rust_lib
Как IndVarSimplification применяет математику в вашем коде

Хочу поделиться своей историей расследования одной довольно необычной компиляторной оптимизации. Необычна она в том плане, что для нее производятся довольно нетривиальные математические вычисления. Приступим!

https://habr.com/ru/articles/738272/

👉 @rust_lib
Глубокая нейронная сеть с нуля на Rust 🦀

Часть 1. Основы нейронных сетей
https://www.akshaymakes.com/blogs/rust_dnn_part1

Часть 2. Загрузка данных и инициализация модели NN
https://www.akshaymakes.com/blogs/rust_dnn_part2

Часть 3. Прямое распространение
https://www.akshaymakes.com/blogs/rust_dnn_part3

Часть 4. Функция потерь и обратное распространение
https://www.akshaymakes.com/blogs/rust_dnn_part4

Часть 5. Обучение и выводы
https://www.akshaymakes.com/blogs/rust_dnn_part_5

👉 @rust_lib
Joshuto

ranger-подобный терминальный файловый менеджер, написанный на Rust

https://github.com/kamiyaa/joshuto

👉 @rust_lib
Пишем калькулятор на Rust с GUI

Зачем еще один калькулятор? Да не зачем, просто как тестовый проект для рассмотрения GUI-библиотеки.

Изначально я хотел попробовать такие крейты, как GPUI, Floem и Xilem, но первая, кажется, пока работает только под MacOS и Linux, вторая не позволяет установить иконку окну и кушает оперативы побольше Webview в Tauri, а до третьей я так и не добрался, узнав об Slint.

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

https://habr.com/ru/articles/804655/

👉 @rust_lib
This media is not supported in your browser
VIEW IN TELEGRAM
Как я снизил время инкрементных сборок Rust на 40%

Я форкнул и модифицировал компилятор Rust rustc. Одна фича — кэширование расширения процедурных макросов — привела к снижению времени инкрементных сборок на 11-40% в различных реальных крейтах. Благодаря этому ускорились dev-сборки и меньше стал тормозить rust-analyzer (IDE IntelliSense).

Если вы специалист в повышении производительности компилятора Rust, то можете сразу перейти к разделу «Кэширование расширения макросов: ускорение инкрементных сборок Rust на 40%».

https://habr.com/ru/articles/807791/

👉 @rust_lib
Сколько памяти нужно для запуска 1 миллиона конкурирующих задач?

В этой статье я углублённо сравню потребление памяти между асинхронными и многопоточными программами популярных языков вроде Rust, Go, Java, C#, Python, Node.js и Elixir.

Недавно я проводил сравнение производительности нескольких программ, предназначенных для обработки большого количества сетевых подключений. В итоге я увидел огромную разницу в потреблении этими программами памяти, порой в 20 раз и больше. Некоторые потребляли при 10К подключений чуть более 100 МБ в то время, как другие занимали почти 3 ГБ. К сожалению, эти программы были довольно сложными и также отличались своим функционалом, поэтому было бы трудно сравнить их непосредственно и сделать какие-то осмысленные выводы. Тут то у меня и возникла идея создать специальный синтетический бенчмарк.

Rus https://habr.com/ru/companies/ruvds/articles/739054/

Eng https://pkolaczk.github.io/memory-consumption-of-async/

👉 @rust_lib
Почему я отказался от разработки игр на Rust, часть 1

Предисловие: этот пост представляет собой очень длинный перечень мыслей и проблем, возникавших у меня за годы работы; также в нём рассматриваются некоторые из аргументов, которые мне часто говорили. В посте выражено моё мнение, сформировавшееся у меня в процессе разработки игр на Rust в течение многих тысяч часов на протяжении многих лет и после множества завершённых игр. Это не хвастовство и не показатель успеха, я просто хочу сказать, что вложил достаточно много усилий в Rust; здесь не получится сказать «когда наберёшься опыта, тебе всё станет понятно».

https://habr.com/ru/articles/811163/

👉 @rust_lib
Оптимизируем кодирование u128 в base62

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

По некоторым причинам использовать uuid мне не очень нравилось:
это довольно длинная строка из 32 символов, а мне надо будет иногда показывать ее пользователям
6 бит в uuid4 не используются, это константы, расточительно

константные биты в uuid4:
uuid.uuid4().bytes[6] & 0b11110000 # == 64
uuid.uuid4().bytes[8] & 0b11000000 # == 128


https://habr.com/ru/articles/739936/

👉 @rust_lib
Список ресурсов для изучения Rust - дорожная карта от начинающего до продвинутого уровня

https://github.com/ImplFerris/LearnRust

👉 @rust_lib
Есть ли какая-нибудь ошибка в этом коде?

👉 @rust_lib
Книга рецептов Rust

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

Часть 1
https://habr.com/ru/companies/timeweb/articles/811915/

Часть 2
https://habr.com/ru/companies/timeweb/articles/813791/

👉 @rust_lib
Любите ли вы Rust, как люблю его я?

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

Он безопасный. Это, правда, не совсем так, но если взять условного новичка, который напишет программу на C и условного новичка, который напишет программу на Rust - шанс, что вторая выйдет более безопасной окажется существенно выше. По крайней мере, атака через переполнение буфера, почти гарантировано, провалится (не станем отрицать наличие дарований, которые даже там, где это почти невозможно, смогут заложить уязвимость).

Он необычный. Уверен, вы сталкивались со странными языками программирования. Такими, которые ломают привычную парадигму и заставляют мыслить иначе. Например, люди, всю жизнь работающие с объектно-ориентированным подходом, нередко, теряются, когда сталкиваются с функциональным программированием, т.к. там иной подход. Да даже далеко ходить не надо; столкновение с попыткой воспользоваться OpenGL из привычного C++, в какой-то момент, рвёт все шаблоны и в воздухе повисает лишь два вопроса: "какого..." и "зачем вы так со мной". Это, разумеется, проходит, но не сразу.

Простите, отвлёкся. Так вот, Rust заставит вас взглянуть на программирование по-другому, то есть совсем иначе. Он заставит вас писать код так, как вы до него не писали, потому что все старые парадигмы просто не работают. "Хотите отправить структуру в функцию, а потом ещё поработать с ней? Только не в мою смену!". Это существенно развивает воображение.

От отлично документирован. Нет, я несправедлив к Rust. Он великолепно документирован. Почти про любой аспект работы с ним вы найдёте отдельную книгу, где вам от "а" до "я" всё разжуют. Но, вполне вероятно, вы всё равно не поймёте, т.к. чтобы понять это, неплохо бы прочитать ещё несколько книг, где разжёвывается что-то ещё. Зато через несколько месяцев мозг вырастет на размер, а то и на все два!

Он неисчерпаем. Да, порой мне именно так и кажется. Есть множество способов сделать то, что я только что сделал, только по-другому; есть своя std библиотека и я не могу даже представить, чего в ней нет, потому что создаётся ощущение, что в ней есть чуть менее, чем всё.

Он дружелюбен. Компилятор всегда подскажет, где вы ошиблись и даже предложит решение, как сделать так, чтобы проблему исправить, а также добавит ссылку на справку. И иногда его рекомендация даже сработает. Но в целом, журнал из 30 ошибок на 3 строчки кода, в какой-то момент, уже перестаёт пугать и даже удивлять.

Он поддерживается и развивается. У него "из коробки" есть свой собственный менеджер пакетов (вроде npm или pip), а также реестр самих пакетов. Из недостатков - не всегда можно получить исходники устанавливаемого пакета или библиотеки (поправьте, если это не так).

Его можно использовать для web. Через webassembly. Именно по этой причине, собственно, я с ним и связался. Пробовал делать эмуляции роста плесени, а последнее - пробовал на нём реализовать параллакс эффект на веб-странице не прибегая к js (если интересно, про это можно почитать тут). wasm-pack позволяет собирать webassembly пакеты и встраивать в своё приложение. Ещё можно делать и при помощи ecmascripten для C++, но, почему-то, C++ не так интересен для меня.

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

👉 @rust_lib
Ржавое наследование реализаций

В моей первой статье речь пойдет о комбинации примитивных конструкций, позволяющих организовать наследование реализаций и композицию состояний. Поочередно разберу, от простых в использовании конструкций, до комплексных prod-ready решений, которые могут найти повсеместного применения в разработке и публичных контейнерах. Здесь не будет зависимостей, макросов, Rc, Box и тд. - исключительноno_std.

https://habr.com/ru/articles/741458/

👉 @rust_lib
Интероперабельность между С++ и Rust

Этот пост основан на презентации, с которой автор выступил на конференции EuroRust 2022 в Берлине. Доступны слайды и видеозапись.

Автор, работающий в компании Slint, участвует в создании UI-инструментария, написанного на Rust. Этот UI-инструментарий может использоваться и с другими языками и экосистемами, кроме той, для которой был написан, поэтому в Slint предусмотрены API для C++ и даже для Javascript. Естественно, эти API должны восприниматься как совершенно нативные для разработчиков, имеющих дело с этими языками. Именно поэтому ребром стоит вопрос о том, как создать нативно воспринимаемые API к коду Rust для пользователей, привыкших работать с C++.

https://habr.com/ru/companies/timeweb/articles/743540/

original https://slint.dev/blog/rust-and-cpp

👉 @rust_lib
This media is not supported in your browser
VIEW IN TELEGRAM
Быстрое извлечение доминирующих цветов CLI

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

Он построен на Rust и по сути основан на реализации алгоритма Colors Thief, написанного
Евгением Рейзнером.

https://github.com/AbdoulMa/copycolors

👉 @rust_lib
Ловим спутники без поворотного устройства

Полагаю, все любители поймать сигнал со спутников начинают с использования простых и легких направленных антенн, подключённых к портативке. Затраты минимальные, а удовлетворение от удачи услышать сигнал из космоса – максимальное. Но со временем надоедает руками держать и направлять на спутник антенну, хочется чего-то удобного. В век компьютеров логично всё автоматизировать. Об одном из возможных вариантов я хочу рассказать далее.

https://habr.com/ru/articles/820145/

👉 @rust_lib
Gabriel2 — Open Source асинхронная библиотека для модели Акторов на Rust с использованием Tokio

В целом мне очень нравится концепция Акторов в асинхронном программировании. Низкоуровневое программирование с использованием очередей сообщений и обработчиков сообщений не позволяет мыслить в терминах высокоуровневых абстракций. Акторы позволяют абстрагироваться от низкоуровневых деталей. Другими словами, Акторы посылают сообщения друг другу. А то, что Акторы на самом деле работают на очередях сообщений, нам не важно. Это скрыто 'под капотом'

Во время изучения Tokio, я решил написать свой проект для модели Акторов. Как раз низкоуровневая часть Tokio позволила это сделать. Так появилась библиотека Gabriel2.

https://habr.com/ru/articles/821267/

👉 @rust_lib