रस्ट 1.96 प्रोग्रामिंग भाषा, जिसकी स्थापना मोज़िला परियोजना द्वारा की गई थी, लेकिन अब स्वतंत्र गैर-लाभकारी संस्था रस्ट फ़ाउंडेशन के तत्वावधान में विकसित की गई है, जारी कर दी गई है। यह भाषा मेमोरी सुरक्षा पर केंद्रित है और कार्य निष्पादन की उच्च समानांतरता प्राप्त करने के लिए उपकरण प्रदान करती है, जबकि यह गार्बेज कलेक्टर और रनटाइम (रनटाइम को मानक लाइब्रेरी के बुनियादी आरंभीकरण और रखरखाव तक सीमित कर दिया गया है) के उपयोग के बिना कार्य करती है।
रस्ट की मेमोरी प्रबंधन विधियाँ पॉइंटर हेरफेर में त्रुटियों को दूर करने और निम्न-स्तरीय मेमोरी प्रबंधन से उत्पन्न होने वाली समस्याओं, जैसे कि मेमोरी को मुक्त करने के बाद उस तक पहुँचना, नल पॉइंटर को डीरेफरेंस करना, बफर ओवररन आदि से सुरक्षा प्रदान करने के लिए डिज़ाइन की गई हैं। यह प्रोजेक्ट लाइब्रेरी वितरित करने, बिल्ड को सुगम बनाने और निर्भरताओं को प्रबंधित करने के लिए कार्गो पैकेज मैनेजर विकसित कर रहा है। लाइब्रेरी को होस्ट करने के लिए crates.io रिपॉजिटरी का रखरखाव किया जाता है।
संदर्भ जाँच, वस्तु के स्वामित्व पर नज़र रखने, वस्तु के जीवनकाल (स्कोप) का ट्रैक रखने और कोड निष्पादन के दौरान मेमोरी एक्सेस की शुद्धता का आकलन करने के माध्यम से रस्ट में मेमोरी सुरक्षा प्रदान की जाती है। जंग भी पूर्णांक अतिप्रवाह के खिलाफ सुरक्षा प्रदान करता है, उपयोग से पहले चर मूल्यों के अनिवार्य आरंभीकरण की आवश्यकता होती है, मानक पुस्तकालय में त्रुटियों को बेहतर तरीके से संभालता है, अपरिवर्तनीय संदर्भों की अवधारणा को लागू करता है और डिफ़ॉल्ट रूप से चर, तार्किक त्रुटियों को कम करने के लिए मजबूत स्थिर टाइपिंग प्रदान करता है।
मुख्य नवाचार:
- Добавлен модуль range с реализацией новых типов, развиваемых для замены устаревших типов Range, RangeInclusive, RangeToInclusive и RangeFrom, и позволяющих хранить диапазоны в Copy-структурах. Тип Range определяет диапазоны, ограниченные минимальным и максимальным допустимым значением (но не входящим в него), тип RangeFrom определяет числа начиная с указанного значения, а тип RangeInclusive — значения указанного диапазона с обеими его границами. В будущих выпусках дополнительно появятся типы RangeFull и RangeTo, старая реализация будет перенесена в core::range::legacy::*, а синтаксис «N..M» переведут на новый вариант типов.
Новые типы отличаются тем, что вместо типажа Iterator реализуют типаж IntoIterator, т.е. вместо встроенного итератора определяют то, как преобразовать тип в итератор. Подобный подход позволяет использовать с новыми типами операцию копирования (типаж Copy, показывающий, что значения типа можно дублировать через простое копирование), которая ранее была недоступна из-за несовместимости с типами со встроенными итераторами.
Например, новые типы дают возможность сохранить границы среза в структуру, которая полностью копируется без раздельного сохранения начального и конечного значений:use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range<usize>);impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
} - Добавлены макросы «assert_matches!» и «debug_assert_matches!», проверяющие соответствие значения указанному шаблону и аварийно завершающие выполнение при расхождении. От выражений «assert!(matches!(..))» и «debug_assert!(matches!(..))» новые макросы отличаются выводом отладочной информации со значениями, вызвавшими сбой. Для избежания пересечений со сторонними макросами, поставляемыми с аналогичными именами, новые макросы требую явного импорта библиотеки «core::assert_matches».
use core::assert_matches;
fn get_random_number() -> u32 {
4
}एफएन मुख्य() {
assert_matches!(get_random_number(), 1..=6);
} - При сборке для целевой платформы WebAssembly прекращена передача компоновщику опции «—allow-undefined», разрешавшей связывание при наличии неопределённых символов, которые преобразовывались в импорт из модуля «env». При сборке для WebAssembly все связанные с компоновкой символы теперь по умолчанию обязательно должны быть определены. Для возвращения старого поведения можно использовать переменную окружения «RUSTFLAGS=-Clink-arg=—allow-undefined» или выражение ‘#[link(wasm_import_module = «env»)]» в коде.
- एपीआई के एक नए हिस्से को स्थिर की श्रेणी में ले जाया गया है, जिसमें विधियों और लक्षणों के कार्यान्वयन को स्थिर किया गया है:
- assert_matches!
- debug_assert_matches!
- From<T> for AssertUnwindSafe<T>
- From<T> for LazyCell<T, F>
- From<T> for LazyLock<T, F>
- core::range::RangeToInclusive
- core::range::RangeToInclusiveIter
- core::range::RangeFrom
- core::range::RangeFromIter
- core::range::Range
- core::range::RangeIter
- В пакетном менеджере Cargo устранена уязвимость CVE-2026-5223, которая может использоваться для перезаписи исходного кода другого crate-пакета в локальном кэше пакетов из того же репозитория через манипуляции с символическими ссылками внутри crate-а пакетов. Уязвимость проявляется только при работе со сторонними репозиториями пакетов и не затрагивает пользователей репозитория crates.io, так как в crates.io запрещена загрузка пакетов с символическими ссылками.
Дополнительно можно отметить публикацию (PDF) результатов анализа пригодности языка Rust для разработки прошивок для микроконтроллеров и встраиваемых систем с ограниченными ресурсами.
Исследование проведено компанией STMicroelectronics при участии нескольких европейских университетов. Двум изолированным командам разработчиков была поставлена задача по реализации одной и той же прошивки для микроконтроллеров STM32U585AI с ядром Arm Cortex-M33. Первая команда создавала прошивку на Си, а вторая на Rust.
Тестирование выполненной работы не выявило заметных преимуществ в использовании языка Си вместо Rust при разработке прошивок для микроконтроллеров при сравнении потребления памяти и производительности. Более того, задействование написанного на Rust системного runtime от открытого проекта Ariel OS позволило добиться потребления памяти в проекте на Rust ниже, чем в реализации на языке Си, использующей традиционный стек для разработки прошивок на базе библиотеки newlib.
Размер результирующей прошивки составил 84100 байт в проекте на Rust и 76744 байта в проекте на Си (на 10% меньше), но потребление оперативной памяти в прошивке на Rust оказалось значительно ниже — 24640 байтов против 42608 байтов. Что касается производительности, то при тестировании начальных прототипов, разработанных за 6 недель, реализация на Rust в два раза опережала, реализацию на Си, но обе реализации значительно отставали от расчётной максимальной производительности. После 4 недель, выделенных на оптимизацию, обе реализации достигли примерно одинакового результата, близкого к расчётному максимуму.

स्रोत: opennet.ru
