Как стать автором
Поиск
Написать публикацию
Обновить
51.18

Rust *

Мультипарадигмальный компилируемый язык

Сначала показывать
Порог рейтинга
Уровень сложности

Битовые поля в Rust

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров2.6K

Привет, Хабр!

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

Читать далее

Рефакторинг вглубь

Время на прочтение9 мин
Количество просмотров2.7K
image

Рефакторинг – это “это контролируемая техника совершенствования структуры существующего кода” [Фаулер]. Сейчас уже написано так много всего о запахах кода и приёмах рефакторинга в микромасштабе (есть, например, книги и целые сайты). А я хочу рассмотреть ситуацию крупным планом и обсудить, как именно и в каком порядке следует применять эти приёмы. В частности, берусь утверждать, что рефакторинг лучше всего выполнять наизнанку, то есть, начинать от границы с внешним API, а далее прорабатывать код вглубь, переходя к классам, методам, алгоритмам, типам, тестам или именам переменных.

Примеры кода в этом посте написаны на Rust, но техника рефакторинга наизнанку также применима и в других языках программирования. Я выбрал для примера Rust, так как рефакторинг тем удобнее, чем сильнее система типов.
Читать дальше →

C++ с точки зрения Rust-разработчика: достоинства и недостатки

Время на прочтение8 мин
Количество просмотров16K

Я профессионально программирую на Rust и, признаться, немного этот язык продвигаю. Поэтому можете себе представить глубину моего расстройства, когда моя младшая сестрёнка, почти не умеющая программировать, обратилась ко мне и попросила научить её C++. Я попытался её отговорить, сказав, что однажды она будет сидеть за отладкой ошибок сегментирования, вооружившись Valgrind и вспоминать этот наш разговор, размышляя, а где же она свернула не туда. Но она оказалась ещё упрямее меня и настаивала: хочу выучить язык программирования, которым действительно пользуются люди.

Я не притрагивался к C++ с тех пор, как ещё в старших классах разрабатывал игры на Cocos2D-X, но решил, что сохранившихся у меня туманных воспоминаний о «правиле трёх» (или сколько там было? Пять? Ноль?) и прочих подобных материях будет более чем достаточно, чтобы решить такую задачу. Оказалось, что и мне требуется кое-что подучить, но я с удовольствием узнал, что существует большая аудитория, с которой можно поделиться этими знаниями. Почти любую концепцию из C++ легко понять, если объяснить её в ключе «о, эта как та штука из Rust».

Притом, что C++ местами несимпатичен, этот язык по-своему красив. Я и так это знал, но, когда взялся заново учиться C++, мне стало только яснее: если Rust в какой-то степени и превосходит C++ (допустим, вы верите, что это так), то лишь потому, что сам Rust стоял на плечах такого гиганта как C++.

Так что мы потратили пару недель, проштудировав серию руководств по OpenGL от ютубера под ником TheCherno (кстати, сама серия отличная). Две недели спустя нам удалось на экране единственный статичный голубой квадратик. Я уже стал опасаться, а не начнёт ли моя сестра сомневаться, стоило ли таким образом изучать разработку игр и пытаться изобразить что-нибудь на C++. Так что тогда я решил, что следует отбросить руководства господина Черно и взяться за разработку игры всерьёз.

Читать далее

Присоединяйтесь к проекту Rustsn: призыв к разработчикам Rust, интересующимся областью ИИ (LLM)

Уровень сложностиСложный
Время на прочтение2 мин
Количество просмотров3.5K

Несколько дней назад я опубликовал статью Создание инструмента генерации кода с помощью Rust и локальных LLM от Ollama.

Проект Rustns призван упростить жизнь разработчикам Rust за счет автоматизации утомительных задач. Мой инструмент генерирует фрагменты кода Rust из объяснений пользователя, компилирует их, разрешает зависимости, генерирует тесты.
Изначально проект задумывался как универсальное решение для генерации кода для самых популярных языков программирования, включая Java, Python и TypeScript. Я стремился создать инструмент, который бы облегчил работу разработчиков, предоставляя возможность генерировать код сразу на нескольких языках. Однако, приступив к реализации мультиязычности, я столкнулся с серьёзными трудностями.

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

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

Вот упрощенная диаграмм работы проекта:

Читать далее

Генерация AST на Rust

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров2K

Сегодня мы рассмотрим одну из тем систем компиляции — генерацию абстрактного синтаксического дерева или просто AST на Rust. Создадим свое собственное AST, разберем, как структурировать синтаксическое дерево, и рассмотрим, как использовать возможности Rust для создания парсеров и обработки узлов дерева.

Читать далее

Создание инструмента генерации кода с помощью Rust и локальных LLM от Ollama

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров4.6K

Это реакция на выпуск ChatGPT o-preview. Попытка добавить логику в LLM с открытым исходным кодом, которые можно запустить дома на скромном GPU или даже на CPU

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

Я хотел бы оптимизировать процесс кодирования функций на основе описаний на естественном языке. Я хотел создать систему, в которой я мог бы ввести объяснение того, что должна делать функция, и чтобы инструмент обрабатывал все остальное от генерации кода до тестирования.

Работа инструмента начинается с того, что запрашивает у пользователя объяснение функции, которую он хочет создать. Затем он взаимодействует с LLM для генерации кода функции, компилирует его и проверяет на наличие ошибок компиляции. Если ошибки обнаружены, инструмент пытается их устранить, возможно, путем добавления зависимостей или переписывания кода. После успешной компиляции кода он генерирует тесты для функции, запускает их и снова обрабатывает любые ошибки, итеративно улучшая код или тесты.

Первый шаг — получить объяснение от пользователя:

Читать далее

Портируем декодер AV1 с С на Rust для повышения быстродействия и безопасности

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров8.9K

AV1 становится всё более значимым видеоформатом, которому требуется безопасный и производительный декодер. Исходя из этой идеи, мы в тандеме с командой из Immutant создали rav1d, портировав на Rust написанный на С декодер dav1d. Перед вами первая из двух статей, посвящённых решению этой задачи.

— Джош Аас, глава проекта Prossimo организации ISRG
Читать дальше →

Оптимизация, которая невозможна в Rust

Уровень сложностиСложный
Время на прочтение15 мин
Количество просмотров18K

В этой статье я опишу, как я реализовывал German string и с какими трудностями столкнулся в Rust. В особенности я рассмотрю, как добавить общее владение для подобной структуры данных.

Читать далее

Как уменьшить образ Docker для работы с устройствами IoT

Уровень сложностиСложный
Время на прочтение10 мин
Количество просмотров5.3K

На устройствах интернета вещей (IoT) зачастую слишком мало ресурсов, и их не хватает, чтобы подтягивать и использовать тяжеловесные образы Docker. В этой статье будет показано, как можно уменьшить образ Docker на 36-91% при помощи инструментов patchelf и strace, не перекомпилируя при этом контейнеризованные приложения. Также рассмотрим, как создавать минимальные образы для собственных приложений, написанных на Rust, Go, C/C++.

Читать далее

WebP — формат сжатия веб-страниц

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров13K

Я хочу, чтобы посетители моего сайта наслаждались им, так что я забочусь об accessibility и проверяю, что даже без JavaScript тут есть, на что смотреть. Я забочусь о том, насколько быстро грузятся страницы, ведь на некоторых из них есть большие иллюстрации, поэтому я минифицирую HTML.

Вот только есть один нюанс, который ставит мне палки в колёса и не даёт сделать блог лёгким как пёрышко.

Читать далее

Булевы операции двумерных тел

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров9.4K

В детстве меня всегда завараживали игры с динамическим ландшафтом: The Castle и Worms Armageddon. В то время я не понимал, как реализована эта удивительная механика разрушения и изменения мира. Позже я узнал, что секрет заключался в использовании растровой графики, но интерес к теме не исчез. В этой статье я хочу рассказать о векторном решении аналогичной задачи.

Читать далее

Rust 1.81.0: Error, новая реализация сортировки, #[expect(lint)]

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров3.1K

Команда Rust рада сообщить о новой версии языка — 1.81.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.81.0 вам достаточно выполнить команду:


$ rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Читать дальше →

Создание DSL на Rust

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров3.5K

Создание домен-специфических языков — это интересная и сложная задача. В этой статье рассмотрим, как с помощью Rust создать интерпретатор и компилятор для DSL на основе абстрактного синтаксического дерева.

Начнем с создания абстрактного синтаксического дерева, которое будет основой для всех дальнейших операций. В контексте создания DSL, AST представляет собой дерево, в котором каждый узел соответствует элементу языка.

Читать далее

Ближайшие события

Магическая система типов Rust

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров3K

Код из КДПВ — кусок дерьма; кошмар, который вот-вот случится. Чтобы понять, почему и как это исправить, сначала нужно понять главный урок, который мне преподал Rust: силу использования системы типов для обеспечения инвариантов.

Давайте разбираться

Фреймворки для работа с данными на Rust. Часть 1

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров2.4K

Привет, Хабр!

Если бы мне сказали, что я однажды заменю привычный Python или Scala для работы с данными на Rust, я бы, пожалуй, ухмыльнулся и продолжил привычное дело. Но времена меняются, и Rust вполне уверенно пробивает себе дорогу в мир больших данных. Сегодня я расскажу вам о трех фреймворках, которые делают Rust конкурентом в обработке данных.

Читать далее

Как я сделал платформу коротких видео в Telegram Mini Apps

Уровень сложностиПростой
Время на прочтение17 мин
Количество просмотров10K

Недавно я поехал на море с другом. Во время пути мы узнали, что YouTube собираются блокировать (или замедлять). Тут в моей голове родилась идея: почему бы не сделать видеохостинг в Telegram? Я поспорил с другом, что сделаю его по дороге, но ноутбук сел. Поэтому мы договорились, что я сделаю это за день (спойлер: получилось, но кривовато).

Читать далее

Воспроизводим гитарные табулатуры на Rust

Время на прочтение11 мин
Количество просмотров12K

Если вы когда-нибудь пробовали учиться гитаре, то есть вероятность, что вы знакомы с гитарными табулатурами.

Это простой способ визуализации музыки для гитары, альтернативный нотам, при котором символами ASCII обозначаются струны и лады.

Например, вот первые четыре такта песни Smoke on the Water группы Deep Purple:

e|-----------------|-----------------|-----------------|-----------------|
B|-----------------|-----------------|-----------------|-----------------|
G|-----3---5-------|---3---6-5-------|-----3---5-----3-|-----------------|
D|-5---3---5-----5-|---3---6-5-------|-5---3---5-----3-|---5-------------|
A|-5-------------5-|-----------------|-5---------------|---5-------------|
E|-----------------|-----------------|-----------------|-----------------| <- верх

Эту песню играют в стандартном строе (EADGBe), обозначенном буквами слева, указывающими строй каждой струны. Цифры же означают, куда нужно ставить пальцы на грифе.

Кроме текстового описания стандартом де-факто стал формат, используемый в ПО Guitar Pro для рендеринга и синтезирования звука табулатуры.

Такие двоичные файлы в зависимости от версии ПО имеют расширение .gp3, .gp4, .gp5 или .gp6, их легко можно найти в Интернете на таких веб-сайтах, как Ultimate Guitar.

Хотя ПО для воспроизведения табулатур проприетарно, некоторые версии формата файлов хорошо задокументированы, и даже существуют опенсорсные проекты, способные их считывать.

Вероятно, лучший опенсорсный плеер табулатур — это TuxGuitar, у него очень много функций, это потрясающий инструмент для обучения гитаре.

Так как TuxGuitar уже не поддерживается и написан на Java, я решил, что будет интересно написать собственный плеер табулатур на Rust.
Читать дальше →

Tower — библиотека для асинхронных middleware

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров2.1K

Привет, Хабр! Ведущий системный программист компании "Криптонит" Михаил Доронин поделился опытом написания промежуточного ПО — middleware. Оно часто используется в веб-разработке. Например, веб-сервер может использовать middleware для обработки запросов до того, как они будут переданы основному приложению. Так удобно выполнять аутентификацию, логирование, сжатие данных и другую обработку запросов. Наша команда разработчиков на Rust использует для создания middleware библиотеку Tower. О ней и пойдёт речь в этой статье.

Ключевым понятием Tower является типаж Service, суть которого на псевдо-Rust некоторого (надеюсь, не столь отдалённого) будущего, сводится к следующей записи:

Читать далее

Linux Pipes – медленные

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров13K

Я пишу программу для сверхбыстрого кодирования/декодирования азбуки Морзе и использую pipe для передачи данных. При этом pipe работает очень медленно. Давайте разберемся почему.

Читать далее

Как я ускорила парсинг строк в serde_json на 20%

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров11K

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

serde — основной фреймворк для сериализации и десериализации в Rust. Его используют как крейт по умолчанию во всей экосистеме. serde_json — это официальный serde-миксин для JSON, так что каждый раз, когда нужно что-то парсить, люди обращаются именно к нему. Конечно, есть и другие библиотеки, специализующиеся на парсинге JSON, например simd-json, но популярность у них, мягко говоря, удручающая. serde_json значительно популярнее: на момент написания от него зависят аж целых 26916 крейта, а от simd-json — всего 66.

Это делает serde_json хорошей мишенью (не как у Jia Tan) для оптимизаций. Велик шанс того, что многим из тысяч пользователей переход на simd-json позволил бы добиться ускорения, но, пока они этого не делают, более мелкие оптимизации — лучше, чем совсем ничего, и такие улучшения — глобальный выигрыш для экосистемы.

Читать далее