Rust
2.21K subscribers
142 photos
101 videos
2 files
196 links
Полезный контент по программированию на Rust
Download Telegram
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌

https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌

https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных


Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
💩29👎11🤡6🤣3👍2🤬1🙈1
🥷 Кража во спасение: Work Stealing в Tokio

Если вы используете tokio::main, вы запускаете многопоточный рантайм (Multi-Threaded Scheduler). Под капотом создается пул потоков (воркеров), обычно по числу ядер процессора.

Как честно распределить 100,000 задач между 8 потоками, чтобы никто не простаивал и не было узкого горлышка (bottleneck)?

Если сделать одну Глобальную очередь (Global Queue), куда смотрят все потоки, они передерутся за Мьютекс (Mutex contention). Производительность рухнет.

Поэтому Tokio использует Локальные очереди (Local Queues):

1. У каждого потока-воркера есть своя личная очередь задач (до 256 штук).

2. Воркер берет задачи только из своей очереди. Никаких блокировок! Это невероятно быстро.

3. Новые задачи, порожденные текущей (tokio::spawn), падают в локальную очередь этого же потока.

А что если один поток закончил все задачи, а у другого их еще 200?
Включается Work Stealing (Кража работы):

1. Скучающий воркер смотрит в локальные очереди других потоков.

2. Он находит самую загруженную очередь и втихаря "крадет" ровно половину её задач.

3. Забирает их себе в локальную очередь и начинает молотить.

Это гениальный компромисс: 99% времени потоки работают без блокировок, и лишь изредка (при перекосе баланса) происходит синхронизация для кражи. Именно поэтому Tokio выдерживает миллионы RPS на мощных серверах.

#rust #tokio #architecture #multithreading #work_stealing

👉 @rust_lib
🔥17👍21🥰1🤗1
Wgpu - это безопасная и переносимая графическая библиотека для Rust, основанная на API WebGPU. Она подходит для универсальной графики и вычислений на GPU.

Приложения, использующие wgpu, могут работать нативно на Vulkan, Metal, DirectX 12 и OpenGL ES, а также в браузерах через WebAssembly на WebGPU и WebGL2.

https://wgpu.rs/

https://github.com/gfx-rs/wgpu

👉 @rust_lib
🔥92🥰1🤗1
💻Angular — один из самых строгих и системных инструментов разработки пользовательских интерфейсов. Его выбирают крупные компании, где важны масштабируемость, предсказуемость кода и возможность развивать продукт долгие годы. Мы расскажем вам как работать с этим инструментом. Записывайтесь на открытые уроки в преддверии старта курса «Angular-разработчик»:

📆26 марта в 20:00 МСК на открытом уроке разберём, как LLM ускоряют фронтенд-разработку. Покажем их развитие, подготовим Angular-проект к работе с ИИ, создадим приложение и обсудим, где ИИ реально помогает разработчику.

📆9 апреля в 20:00 МСК на открытом уроке разберём сигналы в Angular: создадим реактивную форму с валидацией, обсудим управление состоянием и сравним с подходом на RxJS.

📆21 апреля в 20:00 МСК разберём архитектуру Angular-приложения: слои, feature-подход, разделение UI, логики и API, а также паттерны и структуру реального проекта.

Подробности об уроках и регистрация: https://vk.cc/cVBvJD

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🤮92🤔1🎉1🐳1🌭1
📦 Иллюзия объектов: Как мы морим процессор голодом

Представьте, что вы пишете симуляцию (или игру). По заветам ООП вы создаете сущность:


struct Particle {
position: [f32; 3], // 12 байт
velocity: [f32; 3], // 12 байт
color: [u8; 4], // 4 байта
life: f32, // 4 байта
name: String, // 24 байта
}
// Итого: 56 байт


Затем складываете их в массив: Vec<Particle>. Это называется Array of Structs (AoS).

Теперь нам нужно в цикле обновить позицию (position += velocity). Нам нужны только 24 байта из 56. Но процессор так не умеет!

Процессор читает память из RAM в свой сверхбыстрый L1 кэш кусками по 64 байта (Cache Line).
Когда он берет первую частицу, он затягивает в кэш её position, velocity, а заодно color, life и половину name.

Результат:

1. Cache Miss: Больше половины кэша забито мусором (color, name), который в данном цикле не нужен. Процессору приходится постоянно бегать в медленную RAM за новыми частицами.

2. Bandwidth: Вы сжигаете пропускную способность памяти впустую.

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

#rust #architecture #dop #performance #cpu

👉 @rust_lib
👍193👎1🔥1💯1
🚄 Struct of Arrays (SoA): Пишем для железа

В прошлом посте мы поняли, что массив жирных структур (Vec<Particle>) забивает кэш процессора ненужными данными.

Решение из Data-Oriented Design - вывернуть структуру наизнанку. Это называется Struct of Arrays (SoA).

Вместо массива структур, мы делаем структуру массивов:


struct Particles {
positions: Vec<[f32; 3]>,
velocities: Vec<[f32; 3]>,
colors: Vec<[u8; 4]>,
lifetimes: Vec<f32>,
}


Теперь, чтобы обновить позиции, мы пишем:

for i in 0..count {
positions[i][0] += velocities[i][0];
positions[i][1] += velocities[i][1];
positions[i][2] += velocities[i][2];
}


Почему процессор плачет от счастья?

1. Идеальный кэш: Когда процессор берет 64 байта из positions, он получает ровно позиции. Никаких имен или цветов. Ни байта не тратится впустую.

2. Hardware Prefetcher: У процессора есть умный блок, который видит: "Ага, он читает память линейно!". И он начинает предзагружать следующие позиции в кэш до того, как они понадобятся циклу.

3. SIMD (Автовекторизация): Компилятору в 100 раз проще применить те самые AVX-инструкции к плоскому однородному массиву.

SoA может ускорить математические циклы в 5-10 раз без изменения алгоритма! Но есть минус: удалять или добавлять одну частицу теперь неудобно (надо менять 4 разных вектора).

#rust #dop #soa #memory #optimization

👉 @rust_lib
👍9🔥51🥰1🤔1
👾 ECS: Data-Oriented Design без боли

Вы скажете: "Struct of Arrays - это круто для процессора, но поддерживать такой код руками - ад! Я хочу просто написать entity.update()".

Вам не нужно писать SoA руками. В экосистеме Rust для этого есть ECS (Entity Component System). Самые известные примеры - Bevy ECS, Hecs, Legion.

ECS абстрагирует работу с памятью. Вы пишете компоненты как маленькие структуры:


struct Position { x: f32, y: f32 }
struct Velocity { dx: f32, dy: f32 }


А затем пишете Системы (функции), которые запрашивают только то, что им нужно:


// Пример из Bevy ECS
fn physics_system(mut query: Query<(&mut Position, &Velocity)>) {
for (mut pos, vel) in query.iter_mut() {
pos.x += vel.dx;
pos.y += vel.dy;
}
}


Что происходит под капотом?
Магия. ECS-фреймворк сам раскладывает компоненты в памяти в виде плотных массивов (почти как SoA, чаще всего используя паттерн Archetypes).
Когда physics_system запрашивает данные, она бежит по памяти линейно, идеально утилизируя кэш.

Итог: Вы получаете красивый, модульный код (почти как в ООП), но с производительностью хардкорного низкоуровневого C. Если вы пишете что-то, где много сущностей (игры, симуляции, HFT, парсеры) - посмотрите в сторону ECS.

#rust #ecs #bevy #architecture #dop

👉 @rust_lib
👍134🥰1🤗1
This media is not supported in your browser
VIEW IN TELEGRAM
Ratatui

Библиотека Rust, предназначенная для создания терминальных пользовательских интерфейсов (TUI).

https://github.com/tui-rs-revival/ratatui

👉 @rust_lib
🔥102👍1🥰1🤗1
Пишем простой драйвер на Rust

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

В своей повседневной работе я по-прежнему придерживаюсь C++, так как основная её часть связана с низкоуровневым программированием систем и ядра, а из этого языка легко задействовать написанный на С Windows API и COM API.

Rust — это язык для системного программирования, то есть он может справляться с теми же задачами, что и C/C++. Основное неудобство при этом создаёт громоздкий синтаксис, необходимый для преобразования типов С в типы Rust. Но это неудобство можно преодолеть, используя подобающие обёртки и макросы.

Короче говоря, я решил попробовать написать простой и полезный драйвер WDM. Это будет Rust-версия драйвера «Booster», о котором я пишу в своей книге (Windows Kernel Programming), позволяющего изменять приоритет любого потока на любое значение.

https://habr.com/ru/companies/ruvds/articles/882474/

👉 @rust_lib
👍7🔥21🥰1🤗1
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌

https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика

Программирование React📌
https://max.ru/react_lib React

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌

https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных


Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
🤮17💩5🤡5👍32
Полный курс Rust от Google 🦀

Это учебный курс по языку программирования Rust, разработанный командой Android в Google.
Он изначально предназначался для внутреннего использования для обучения разработчиков Android, но теперь открыт для всех.

Курс охватывает:

- Основы языка Rust
- Работа с памятью и безопасностью
- Современные концепции (итераторы, async, crate-экосистема и т.д.)
- Использование Rust для Android и WebAssembly
- Конкретные упражнения и практические примеры

Можно использовать как в виде самостоятельного материала, так и для проведения обучающих семинаров.
Подходит для разработчиков, знакомых с системным программированием, например, на C/C++.

https://github.com/google/comprehensive-rust

👉 @rust_lib
🔥10👍32🥰1🤗1
📖 Неофициальное руководство по экосистеме Rust

https://blessed.rs/crates

https://github.com/nicoburns/blessed-rs

👉 @rust_lib
🔥7👍61🥰1
Список ресурсов для изучения Rust — Дорожная карта от новичка до продвинутого уровня.

https://github.com/ImplFerris/LearnRust

👉 @rust_lib
👍6🔥31🥰1😭1🤗1
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика

Программирование React📌
https://max.ru/react_lib React

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных


Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
💩20🤮8👎6🤡3👍2🙈1
🧵 Почему .clone() в Rust — не всегда зло (и когда он действительно вреден)

Многие начинающие разработчики в Rust быстро усваивают: «.clone() — это плохо». И правда, если бросаться клонировать всё подряд, можно получить красивый, но тормозной код. Но важно понимать, почему .clone() вызывает проблемы, и когда его использование оправдано.


📌 Что делает .clone()?

Метод .clone() копирует данные, создавая новое значение в памяти. Это не просто копия указателя — это глубокое копирование. То есть:


let a = String::from("hello");
let b = a.clone(); // теперь у нас два разных `String`


Для простых типов (например, i32, bool, char) .clone() вообще не нужен — они Copy и дублируются автоматически.


🚩 Когда .clone() — сигнал тревоги

Если вы часто пишете .clone(), чтобы «заткнуть компилятор», скорее всего, у вас проблемы с пониманием владения и заимствования. Пример:


fn takes_ownership(s: String) { /* ... */ }

let s = String::from("data");
takes_ownership(s.clone()); // работает, но...
takes_ownership(s); // не работает без `.clone()`


Здесь правильнее задуматься: а нужно ли вообще передавать владение? Или лучше использовать ссылку:


fn takes_reference(s: &str) { /* ... */ }

let s = String::from("data");
takes_reference(&s);



Когда .clone() — нормально

- Вы действительно хотите получить копию, и это оправдано логикой программы.
- Тип дешёв в копировании (Arc, Rc, PathBuf — в разумных пределах).
- Профилировали — и увидели, что это не узкое место.
- Вы работаете с immutability в многопоточном контексте — там клоны часто оправданы.


🧠 Вывод

.clone() — это инструмент. Он не «зло», а просто сигнал: здесь стоит подумать. Если вы клонируете ради того, чтобы компилятор «не ругался», скорее всего, вы пропускаете шанс написать более идиоматичный и эффективный Rust-код.

👉@rust_lib
👍5