|
Опубликован релиз языка программирования Rust 1.93, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Встроенная в поставку Rust стандартная си-библиотека Musl, используемая при статической компоновке для целевых платформ "*-linux-musl" (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl и т.п.) на системах без Musl, обновлена до версии 1.2.5. Минимально поддерживаемая версия Musl при динамической компоновке также поднята до выпуска 1.2.5. Ранее в Rust использовалась версия Musl 1.2.3, в которой имелись проблемы в реализации DNS-резолвера. В версии Musl 1.2.4 в DNS-резолвер была добавлена возможность отправки запроса по TCP в случае неудачного обращения по UDP, что решило проблему с запросом больших DNS-записей и наладило совместимость с рекурсивными DNS-серверами, не поддерживающими отдачу части результата в обрезанных UDP-ответах. В версии Musl 1.2.5 в DNS-резолвере реализована обработка ответов с длинными последовательностями CNAME и решена проблема, из-за которой отбрасывались некоторые большие ответы, передаваемые через TCP.
- Стандартная библиотека переработана для решения проблем с
реентерабельностью при использовании в глобальных аллокаторах памяти, написанных на Rust, макроса std::thread_local! и функции std::thread::current, приводивших к бесконечной рекурсии. Для исключения ситуации, когда std::thread_local! и std::thread::current при попытке выделения памяти вызывали тот же аллокатор в котором используются, в них теперь напрямую применяется системный механизм выделения памяти.
- Внутри блоков "asm!" с ассемблерным кодом разрешено использование атрибутов "cfg", что, например, позволяет управлять задействованием расширенных наборов команд CPU в контексте отдельных выражений внутри asm-блока (ранее атрибуты "cfg" могли задаваться только для asm-блока целиком).
asm!( // или global_asm! или naked_asm!
"nop",
#[cfg(target_feature = "sse2")]
"nop",
// ...
#[cfg(target_feature = "sse2")]
a = const 123, // only used on sse2
);
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- Целевая платформа "riscv64a23-unknown-linux-gnu" переведена на второй уровень поддержки, который подразумевает гарантию сборки, но отсутствие гарантий при прохождении тестового набора.
Дополнительно можно отметить несколько связанных с Rust проектов:
- Для ядра Linux развивается фреймворк Rex, позволяющий создавать дополнения для ядра Linux на языке Rust, которые можно использовать для расширения функциональности ядра вместо eBPF. Rex предоставляет те же гарантии безопасности, что и eBPF, но использует для изоляции и обеспечения безопасности возможности языка Rust и легковесный Runtime.
Для подобных программ не применяется верификатор, а программы компилируются в нативный код компилятором Rust.
В Rex-программах допускается использование подмножества языка Rust, предоставляющего гарантии безопасности. В текущем виде поддерживается 5 типов программ
eBPF: kprobe, perf_event, tracepoint, xdp и tc. Имеется возможность вызывать вспомогательные функции eBPF, взаимодействовать с map-структурами eBPF, управлять ресурсами ядра, обрабатывать исключения и использовать обвязки и абстракции над структурами ядра.
- Доступен выпуск Fjall 3, написанного на Rust встраиваемого хранилища, работающего с данными в формате ключ-значение. Хранение данных производится в форме лога c использованием LSM-дерева (Log-Structured-Merge), как в RocksDB, при котором изменения записываются через добавление данных в конец файла. Для обращения к БД предлагается API в стиле BTreeMap. Поддерживаются такие возможности, как пространства имён, прямой и обратный поиск по диапазонам, встроенное сжатие, сериализируемые транзакции, раздельное хранение ключей и связанных с ними очень больших значений, автоматическое фоновое обслуживание БД. Код открыт под лицензией Apache 2.0.
- Проект Tor опубликовал выпуск Arti 1.9.0, реализации инструментария Tor, написанной на языке Rust. Когда код Arti достигнет уровня, способного полностью заменить вариант на Си, разработчики Tor намерены придать Arti статус основной реализации Tor и постепенно прекратить сопровождение реализации на Си. В новой версии продолжена реализация функциональности для релеев и серверов директорий (Directory Authority), улучшена поддержка работы с динамически назначаемыми портами (proxy.socks_listen = "auto"), добавлен экспериментальный API для управления ключами для onion-сервисов.
|