Rust 1.98 расширяет оптимизацию вычислений с плавающей точкой и набор стабильных API
Команда Rust выпустила очередную стабильную версию языка - Rust 1.98. Обновление ориентировано прежде всего на разработчиков системного и высокопроизводительного программного обеспечения: в него вошли новые алгебраические методы для типов `f32` и `f64`, ускоренное форматирование целых чисел, а также несколько важных изменений в стандартной библиотеке.
Главным нововведением стали специальные методы для арифметики с плавающей точкой. Они охватывают сложение, вычитание, умножение, деление и вычисление остатка. В отличие от обычных операторов, такие методы позволяют компилятору рассматривать операции с точки зрения алгебраических свойств вещественных чисел, даже если в реальной арифметике с плавающей точкой эти свойства выполняются не всегда.
Именно поэтому оптимизация вычислений с плавающей точкой Rust теперь может быть более агрессивной. Компилятор получает право переставлять операции, объединять их и эффективнее векторизовать циклы. По своему эффекту подход напоминает оптимизации, которые в других языках активируются с помощью флагов вроде `-ffast-math`, однако Rust не фиксирует конкретный набор преобразований: итоговое поведение зависит от возможностей компилятора и выбранной архитектуры.
Разница особенно заметна на примере последовательного сложения. Выражение `a + b + c + d` обычно вычисляется слева направо, поскольку сложение чисел с плавающей точкой не является строго ассоциативным. Если же разработчик явно использует новые алгебраические методы, компилятор получает возможность изменить порядок вычислений - например, разделить сумму на частичные группы и обрабатывать их параллельно. Это может повысить производительность численных алгоритмов, но требует осознанного отношения к возможным различиям в результате округления.
Подробный разбор изменений, включая примеры применения новых методов, опубликован в материале о том, как Rust 1.98 добавляет возможности оптимизации вычислений с плавающей точкой. Нововведение в первую очередь рассчитано на математические библиотеки, обработку сигналов, графику, моделирование и другие задачи, где важна скорость больших массивов вычислений.
Еще одна заметная функция релиза - метод `format_into`, доступный для всех встроенных целочисленных типов. Он работает совместно с типом `NumBuffer`, который недавно получил статус стабильного API. Буфер заранее содержит достаточно места для десятичного представления значения соответствующего типа, а результат форматирования возвращается в виде строкового среза, заимствующего память из этого буфера.
Такой механизм особенно полезен в коде, где создание временных строк становится ощутимой нагрузкой. Разработчик может избежать лишних выделений памяти при подготовке логов, сетевых сообщений, метрик или текстовых ответов. Это делает форматирование целых чисел более предсказуемым и потенциально снижает давление на сборку мусора - хотя сам Rust не использует автоматический сборщик мусора, а проблема здесь связана с частыми аллокациями и работой распределителя памяти.
В Rust 1.98 также уточнена документация, связанная с взаимодействием `ManuallyDrop` и `Box`. Ранее существовала проблема компилятора: перемещение `ManuallyDrop
Заметные изменения затронули и обработку строк. В стандартной библиотеке стабилизированы методы `String::from_utf16le` и `String::from_utf16be`, предназначенные для преобразования данных UTF-16 с явно заданным порядком байтов - little-endian или big-endian. Для ситуаций, когда вход может содержать некорректные последовательности, предусмотрены и lossy-варианты преобразования: они заменяют неподдерживаемые фрагменты специальным символом вместо возврата ошибки.
Кроме того, стабильным стал метод `strip_circumfix`, доступный для строк и срезов. Он позволяет убрать заданную комбинацию префикса и суффикса, если оба элемента присутствуют одновременно. Это удобнее и безопаснее, чем вручную проверять начало и конец строки отдельными операциями, особенно при обработке идентификаторов, маркеров и форматов с обрамляющими символами.
В совокупности новые возможности Rust 1.98 демонстрируют сразу несколько направлений развития языка. С одной стороны, разработчики получают больше контроля над производительностью численных вычислений. С другой - стандартная библиотека постепенно закрывает распространенные практические сценарии: эффективное форматирование, преобразование кодировок и работу с памятью. При этом большинство изменений не требует сторонних зависимостей и доступно в рамках стабильных компонентов Rust.
Для пользователей, которые уже работают со стабильным каналом, обновление устанавливается обычной командой:
```bash
rustup update stable
```
После перехода на новую версию становятся доступны все перечисленные стабилизированные API Rust, а также улучшения компилятора и стандартной библиотеки. Перед обновлением крупных проектов стоит запустить тестовый набор и проверить участки, где используются небезопасный код, ручное управление временем жизни объектов или чувствительные к порядку операций вычисления с плавающей точкой.


