Обновить
129.66

Rust *

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

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

Да кто такой этот ваш impl Trait

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

В преддверии выхода Rust 1.75.0, наполненным async trait-ами и return-position impl Trait in trait, надо разобраться, что такое impl Trait и с чем его едят.

После прочтения статьи вы сможете битбоксить с помощью новых акронимов понимать, что за наборы символов RPIT, RPITIT и т.д. используют в Rust сообществе.

Читать далее

Есть ли Undefined Behavior в Rust?

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

Если вы никогда не сталкивались с Rust-ом, а слышали, что он помогает избежать Undefined Behavior (UB), то отчасти это так. Некоторые делят язык Rust на 2 части: safe и unsafe. Я бы поделил на 4 части: safe, unsafe, const и async. Но нас интересуют safe и unsafe.

Получить UB в Rust-е не сложно - нужно открыть документацию и найти любой метод, помеченный unsafe, например, get_unchecked у Vec. Метод позволяет без проверки границ получить значение из динамического массива. А есть ли UB в safe-подмножестве языка? Есть. Он возможен из-за бага (проблемы) в компиляторе Rust, который живет с 2015 года.

Читать далее

Выбор варианта возврата значения из функций в Rust

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

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

Читать далее

О JavaScript и WebAssembly

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


Hello world!


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


Хорошо, если вы знаете JS/Node.js и хотя бы слышали о WASM и Rust.

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

Мягкое знакомство с дополнительным кодом

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

Недавно, общаясь по видеосвязи с другом, я рассказывал ему о своих идеях по реализации нового продукта. В разговоре я упомянул добавление больших знаковых чисел в ассемблере с использованием дополнительного кода, на что получил от собеседника вопрос: «Что такое дополнительный код?» Меня немного удивила его неосведомлённость. Он уже больше 30 лет программирует на Java. Java и Python программисты (а также другие, работающие с языками *с придыханием* вроде Commodore / MicroSoft BASIC) не сталкиваются с нативным типом беззнакового целого числа. В этих языках подобные тонкости реализуются за них.

Всё это круто, но компьютер, за которым вы сидите, внутренне обрабатывает такие числа довольно простым способом, и хорошо бы знать, как именно это происходит.

Плюс это всё же наука. Так что давайте разбираться.
Читать дальше →

Увлекательный лексический анализ языка Rust

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

Давайте поговорим о лексическом анализе. Сначала я собирался назвать этот пост «Реализуем токенайзер», но ветер переменился, времена изменились… и, чтобы не утонуть в потоке комментариев вида «фыр, а где мой BPE-токенизатор LLama, который вы мне обещали», ограничимся пока лексическим анализом.

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

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

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

Довольно слов, приступим.

Читать далее

Go (fiber) vs Rust (axum) JWT&DB

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

На medium.com есть ряд статей со сравнением простых web-сервисов, написанных на разных языках. Одна из них Go vs Rust: Performance comparison for JWT verify and MySQL query и судя по ней, Go на 42% быстрее чем Rust. Я решил перепроверить и заодно поменять Gin на Fiber, Axis на Axum и MySQL на PostgreSQL.

Web-сервис будет принимать запрос с авторизацией по токену JWT, искать в БД пользователя с данными email из JWT и возвращать его в виде json. Так как подобная авторизация используется повсеместно, то тест актуальный.

Читать далее

Четыре способа оптимизации ПО

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

Преждевременная оптимизация может оказаться корнем всех зол, а запоздалая — корнем безысходности. Каким бы быстрым ни становилось аппаратное обеспечение, мы находим способы писать медленные программы. И зачастую проявляется это не сразу. Пользователи могут годами не обращать внимания на проблему в производительности ПО, пока она не становится очевидной, что порой происходит в течение одного дня.
Читать дальше →

Из Go в Rust или ад generics

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

В Go ввели generics и он потерял одно из своих основных преимуществ: легкую читаемость.

Как же обходились без шаблонов в Go 13 лет? Это не помешало выпустить отличные библиотеки и сделать хорошую стандартную библиотеку! При этом сохранялась лаконичность и легкость языка. А теперь...

Читать далее

Rust 1.74.0: конфигурация проверки в Cargo, авторизация для приватных реестров, проекции возвращаемых типов

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

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


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


rustup update stable

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


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

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

Чем хорош Rust для продакшена?

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

За последние годы интерес к Rust значительно вырос. Отчасти этому способствовало то, что ведущие участники технологической индустрии, такие как Microsoft, Google и Amazon рассказали о своём опыте использования этого языка в реализации критических систем.

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

Будучи консультантом по Rust, я имел возможность работать со многими компаниями: как крупными, так и малыми. В итоге я понял, что организации в первую очередь ценят продуктивность, стабильность и удобство при долгосрочной поддержке, а не производительность.
Читать дальше →

Пишем интеграционные тесты для Actix Web

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

Модульные и Интеграционные тесты являются неотъемлемой частью жизни современного разработчика. И если с написанием простейших тестов описанных в различных обучающих статьях проблем обычно не возникает, то ситуация коренным образом меняется, когда нам необходимо написать интеграционные тесты для чего-то более сложного, чем 3 + 2 = 5.

В данной статье я хочу поделиться своим подходом к написанию интеграционных тестов для приложения, использующего Actix Web (API-тестирование).

Писать что-то абстрактное скучно, поэтому давайте напишем интеграционный тест для своего маленького AWS STS.

Note: Статья будет интересна тем, кому по какой-либо причине не подходят стандартные средства Actix Web для написания интеграционных тестов.

Читать далее

Как итераторы в Rust могут ухудшить производительность: разбираемся в проблеме

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

Недавно в сообществе разработчиков, где я состою, кто-то представил интересную проблему. Программа этого человека была спроектирована так, что она использовала как многопоточность для выполнения некоторых задач, и циклы for для повторения определенных операций в этих потоках. Однако когда были внесены изменения в код программы и циклы поменяли на итераторы, производительность программы резко ухудшилась. Почему это произошло?

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

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

Читать далее

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

SQLx: raw SQL в Rust

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

Когда речь заходит об использовании SQL, экосистеме Rust есть что нам предложить: к счастью, нам доступны несколько отличных готовых к использованию решений. SQLx — это чисто асинхронный, независящий от рантайма SQL-крейт, позволяющий использовать проверяемые во время компиляции запросы без какого-либо DSL.

Читать далее

Мнение три года спустя: стоил ли того переход с JavaScript на Rust?

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

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

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

Спустя три года, выполнив несколько развёртываний в продакшен, написав электронную книгу и выпустив примерно сто пакетов на crates.io, я решил, что настало время поделиться своими мыслями о Rust.

Читать далее

Как в 180 000 раз ускорить анализ данных с помощью Rust

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

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

Интеграция Axum с S3-хранилищем

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

Недавно столкнулся с проблемой подружить веб-фреймворк Axum и библиотеку rust-s3. Собственно, задача сделать 2 эндпойнта:

Загрузка файла в хранилище и получение ссылки

Скачка файла из хранилища по ссылке

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

Читать далее

Конкурентный отказ

Время на прочтение11 мин
Количество просмотров4.5K
Любая задача может быть завершена несколькими способами:
  1. Нормальное завершение, после которого мы получаем результат (например, Ничего/Единица).
  2. Сообщение об ошибке.
  3. Принудительное завершение, после которого программа может остаться в неопределённом состоянии.

В корутинах Python есть известные точки для безопасной приостановки выполнения. Пользуясь ими, можно автоматически подводить программу к результатам #1 и #2. Поскольку приостановка потоков происходит по принципу вытеснения, именно программист, реализующий потоки, отвечает за достижение результатов #1 и #2. При работе с потоками всегда сохраняется вероятность исхода #3 – поток может быть уничтожен извне, а задача этого даже не заметит, и не получит ни одного шанса осуществить очистку после выполнения и аккуратно завершиться. С потоками существуют две фундаментальные проблемы: (A) невозможно узнать, когда их работа может быть прервана из-за переключения контекста в операционной системе и (B) никогда не угадаешь, когда поток может быть принудительно завершён. Поэтому при работе с потоками принято писать код так, чтобы A и B не имели значения. При конкурентной обработке это неприемлемо, поэтому, если речь идёт о конкурентности, то вариант #3 мы должны полностью исключить.
Читать дальше →

Как Rust меняет мышление разработчика

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров51K
Я страшно ненавижу C++. Обычно я люблю программирование, но каждый проект, с которым я имел дело на C++, ощущался как монотонная рутина. В январе 2023 года я пошёл по пути изучения Rust, поэтому теперь могу сказать, что знаю язык системного программирования, который действительно люблю использовать.

Первый стабильный релиз Rust появился в 2015 году, и каждый год, начиная с 2016, он признаётся в Stack Overflow’s Annual Developer Survey самым любимым языком (в 2023 году эта категория называется «обожаемый»). Почему же разработчики, ощутившие вкус Rust, не могут отказаться от его использования? Похоже, в мире прогремевших наследников C/C++ репутация растёт только у Rust. Как же этот язык, появившийся на сцене меньше десятка лет назад, стал настолько популярным?

Ржавый красный краб Феррис по версии Midjourney

Кривая обучения оказалась крутой. Я нашёл многое, что мне нравится в Rust, но постоянно попадал в его ловушки. Однако в конечном счёте именно препятствия и проблемы, с которыми столкнулся, я научился любить больше всего.

Я начну историю с разговора о том, что легко полюбить — со среды Rust, управления пакетами и документации. Затем я расскажу о системе типов и типажах (trait). Далее я поведаю о тех возможностях тестирования и test driven development, которые становятся возможными благодаря Rust. Наконец, мы обсудим самую запутанную и сбивающую с толку часть — одержимость Rust тем, кто какой переменной владеет.
Читать дальше →

Тест производительности Web-фреймворков для Rust

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

В этой статье мы сравним производительность 3 наиболее популярных бекэнд-фреймворков для Rust: AxumActix и Rocket.

Сравним основные особенности, качество документации и самое главное - проведём тест производительности. Для этого напишем с помощью каждого фреймворка простой REST-сервис с тремя эндпоинтами - один будет просто возвращать отформатированную строку, второй засыпать на 20 миллисекунд имитируя небольшую работу с БД или запрос к внешнему сервису, а третий будет выполнять тяжёлую работу вычисляя хеш bcrypt, имитируя какую-нибудь сложную бизнес-логику.

Читать далее