Рубрика «Rust» - 8

Почему мьютексы в Rust реализованы именно так - 1

Я часто слышу от пробующих работать с Rust системных программистов жалобы на мьютексы и особенно на Rust Mutex API. Жалобы обычно выглядят так:

  • Они не хотят, чтобы мьютекс содержал данные, только блокировку.
  • Они не хотят управлять «защитным» значением, разблокирующим мьютекс при сбросе, в частности, они просто хотят вызывать операцию unlock, потому что им кажется, что это более явное действие.

Такие изменения превратили бы Rust mutex API в эквивалент C/Posix mutex API. Однажды я даже видел, как один разработчик пытался использовать Mutex<()> и разные хитрости, чтобы его имитировать.

Однако у такого стремления есть проблема: эти два аспекта Mutex неразрывно связаны друг с другом, а также с гарантиями безопасности Rust в целом — изменение одного из них или обоих откроет возможности для возникновения незаметных багов и повреждений из-за гонок данных.

Использование API мьютексов в стиле C, состоящего из набора косвенно защищаемых данных и из функций lock и unlock было бы опрометчивым в Rust, потому что это позволяет безопасному коду легко вносить ошибки, нарушающие безопасность памяти и вызывающие гонки данных.

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

В этом посте я разберу типичный C mutex API, сравню его с типичным Rust mutex API, и расскажу о том, что произойдёт, если мы изменим Rust API так, чтобы он напоминал C.
Читать полностью »

Обёртку можно написать вручную, когда API состоит из небольшого количества функций и сигнатура этих функций меняется нечасто. FMOD — звуковой движок с большим количеством функций, точно не тот случай:

Types: 19
Callbacks: 96
Structures: 57
Structure Fields: 352
Enumerations: 77
Enumeration Variants: 693
Functions: 573
Function Arguments: 1590

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

Читать полностью »

Оптическое распознавание символов с помощью Rust и WebAssembly - 1


После переписывания Cyberscore я захотел отправить на сайт какие-нибудь результаты. Последнее, во что я играл, это Pokémon Legends: Arceus, по которой на Cyberscore есть около 3000 таблиц результатов. Я не собирался отправлять столько рекордов вручную, поэтому начал придумывать инструмент для автоматизации этого процесса.

Эта статья посвящена двум вещам: процессу извлечения результатов из JPG с помощью Rust и встраиванию этого функционала во фронтенд Cyberscore.
Читать полностью »

Ошибки, которые не ловит Rust - 1

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

В конечном итоге, возможности того, что можно сделать при помощи языка программирования, редко ограничены самим языком: нет ничего, что можно сделать на C++, но нельзя повторить на C, при наличии бесконечного количества времени.

Если язык полон по Тьюрингу и компилируется в ассемблерный код, каким бы ни был интерфейс, вы общаетесь с одной и той же машиной. Вы ограничены возможностями оборудования, количеством его памяти (и её скоростью), подключенной к нему периферией, и так далее.

На самом деле, достаточно лишь команды mov.

Разумеется, существуют различия в выразительности: для выполнения определённых задач в разных языках может потребоваться больше или меньше кода. Язык Java печально известен своей многословностью: но благодаря другим его преимуществам он и сегодня является привлекательным выбором для многих компаний.

Кроме того, есть такие аспекты, как производительность, отладкопригодность (если такого слова нет, то его стоит придумать) и дюжина других факторов, которые стоит рассмотреть при «выборе языка».
Читать полностью »

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


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


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

rustup update stable

Читать полностью »

Всем привет! Уже столько времени прошло с прошлой статьи, в которой я писал про реализацию своей небольшой версии, написанной на Go, как всегда исходный код доступен на GitHubЧитать полностью »

Как одной строкой сделать 24-ядерный сервер медленнее ноутбука - 1

Лучше учиться на чужих ошибках, поэтому мы в М.Видео-Эльдорадо стремимся изучать зарубежный опыт. Предлагаем и вам посмотреть перевод статьи Петра Колачковского, получившего черный пояс по прокачке производительности своего железа.Читать полностью »

Приветствую, читатели! Сегодня речь пойдёт об одном, на мой взгляд, интересном варианте алгоритма для самообучающейся системы. Идея подобной статьи зрела давно, однако руки всё не доходили.

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

Мотивация

Читать полностью »

Программирование микроконтроллера PIC32 с помощью Rust - 1


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

Пишем с комфортом на Rust в Visual Studio Code - 1

Хочешь писать на Rust, но не знаешь в чём?

Нет денег на CLion или Intellij Ultimate, но тебе нужно отлаживать код?

Очень нравится Visual Studio Code, но при виде десятков плагинов разбегаются глаза?

Если на любой из вопросов выше ты ответил "да", то эта статья для тебя.


Disclaimer

https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js