Разработчики: | Rust Foundation |
Дата последнего релиза: | 2023/08/24 |
Отрасли: | Информационные технологии |
Технологии: | Средства разработки приложений |
Содержание |
Основные статьи:
- Логическое программирование
- Доказательное программирование
- Методология программирования
- Технология программирования
- Программист
2023
Rust - самый популярный язык программирования среди хакеров
Мультипарадигменный компилируемый язык программирования общего назначения Rust, на котором чаще всего пишут хакеры, набирает популярность. Об этом говорится в исследовании, результаты которого обнародованы в начале августа 2023 года рабочей группой Rust Survey Working Group и независимой некоммерческой организацией Rust Foundation.
Опрос проведен в декабре 2022 года среди пользователей по всему миру, включая Россию. В исследовании приняли участие более 9400 респондентов, а на все вопросы смогли ответить 82% участников (76% годом ранее). Зафиксирован значительный рост числа людей, которые просматривали опрос, но не участвовали в нем: с 16 457 в 2021 году до 25 581 в 2022-м, то есть, более чем на 55%.
Говорится, что свыше 90% респондентов идентифицировали себя в качестве пользователей Rust. Из них 47% применяют данный язык программирования ежедневно, что на 4% больше, чем в 2021 году. Около трети опрошенных (30%) могут писать на Rust простые программы, 27% — создавать готовый к использованию код. Примерно 42% респондентов говорят о своем высоком уровне владения Rust. Среди тех, кто отказался от Rust, 30% в качестве основной причины назвали сложность языка. На это же обстоятельство указали 26% тех, кто не использует Rust в работе.
В отчете отмечается, что существует несколько факторов, способствующих росту популярности Rust в профессиональной среде. Это возможность создавать программное обеспечение без ошибок (86%), высокая эффективность языка (84%) и безопасность (69%). Из тех респондентов, которые применяют Rust в работе, 72% сообщили, что язык помог их командам достичь поставленных целей (на 4% больше, чем в 2021 году). Около 75% участников опроса заявили, что планируют продолжать использовать Rust в своих будущих проектах.[1]
Rust 1.72
24 августа 2023 года стало известно о том, что опубликован релиз языка программирования общего назначения Rust 1.72, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения оптимального параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Как сообщалось, методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.Геннадий Попов, PathVision.ai: Как искусственный интеллект помогает медицине и бизнесу
Основные изменения:
- В сообщениях об ошибках обеспечено отображение сведений об элементах, отключённых через атрибуты условной компиляции "cfg", позволяющие активировать выполнение Rust-кода в зависимости от наличия поддержки определённых возможностей crate или запуска на отдельных платформах. Ранее, элементы, отключённые через cfg, были не видны компилятору, но теперь компилятор запоминает их имена и условия скрытия, и отображает эту информацию в сообщениях об ошибках, что, например, позволяет понять, что какая-то функция недоступна из-за отключения определённых feature-свойств в crate.
- Убраны ограничения на время вычисления выражений const. Ранее, для предотвращения зацикливаний во время компиляции, Rust ограничивал максимальное число выражений, выполняемых в процессе вычисления констант. Данная особенность приводила к выводу ошибок при компиляции кода, не вписывающегося в ограничения, поэтому в данном выпуске решено заменить жёсткие ограничения на вывод предупреждения, информирующего о длительно выполняемых вычислениях констант. Также по умолчанию применена lint-проверка const_eval_long_running, выявляющая зацикливания.
- В компилятор rustc перенесена серия lint-проверок из Clippy: undropped_manually_drops, invalid_utf8_in_unchecked, invalid_nan_comparisons и invalid_reference_casting.
- В разряд стабильных переведена порция API, в том числе стабилизированы методы и реализации типажей:
impl<T: Send> Sync for mpsc::Sender<T>
impl TryFrom<&OsStr> for &str
String::leak
- Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
CStr::from_bytes_with_nul
CStr::to_bytes
CStr::to_bytes_with_nul
CStr::to_str
- Реализован третий уровень поддержки для платформ loongarch64-unknown-none. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
- В будущем выпуске Rust 1.76 планируется прекратить поддержку платформ Windows 7, 8 и 8.1, и сделать Windows 10 минимальной версией как для самого компилятора, так и для целей компиляции.
Дополнительно можно упомянуть разногласия в сообществе, возникшие из-за перехода разработчиков фреймворка Serde на поставку crate-пакета serde_derive с макросом derive только в уже скомпилированном бинарном виде. Пакет serde_derive применяется для сериализации и десериализации данных и используется в качестве зависимости в 5495 других пакетах, среди которых 10 имеют более 50 млн загрузок. Общее число загрузок serde_derive оценивается в 172 млн (до 400 тысяч загрузок в день).
Опасение вызывает то, что поставка в бинарном виде затруднит аудит целостности пакета и повысит опасность компрометации зависимых проектов в случае успешной атаки на разработчиков фреймворка Serde. По мнению участвующих в дискуссии пользователей, повышение скорости сборки из-за поставки в предкомпилированном виде не оправдывает возникающих рисков, связанных с безопасностью. Поставка в бинарном виде также затруднит сопровождение Rust-пакетов в проектах и дистрибутивах, таких как Fedora Linux, запрещающих поставку сторонних бинарных компонентов.
В качестве одного из решений представителями сообщества предложено продолжить поставку serde_derive как раньше в исходных текстах, а для бинарной сборки создать отдельный пакет, который можно будет использовать по желанию, без навязывания существующим пользователям. Мэйнтейнер проекта Serde отказался идти на компромисс и заявил, что предкомпилированная реализация макроса будет единственным вариантом поставки пакета serde_derive.
Код Serde продолжает быть открытым и распространяется под лицензиями MIT и Apache 2.0, а несогласным с политикой разработчикам предложено создать и поддерживать собственный форк пакета. В ответ на критику, связанную с потерей возможности анализа кода пакета перед использованием, мэйнтейнер Serde указал, что даже на бросающийся в глаза перевод serde_derive в бинарную форму обратили внимание только спустя 4 недели и 12 релизов. При таком отношении профессионально обфусцированная вредоносная вставка в исходных текстах, вероятно, может годами оставаться незамеченной.
Для подтверждения корректности сборок и выявления возможной подмены содержимого после успешной атаки рассматривается возможность задействования проверки на основе повторяемых сборок, позволяющих удостовериться, что бинарный файл собран из исходных текстов, размещённых в репозитории, без внесения изменений.
В выпуске 1.0.184 разработчики вернулись к поставке пакета serde_derive в исходных текстах, решив отложить переход на поставку в бинарном виде до принятия в пакетный менеджер crate изменений для полноценной поддержки верификации предкомпилированных макросов. Разработчиками Serde подготовлен RFC с предложением реализовать в Crate верификацию предкомпилированных пакетов, проводимую на сервере репозитория crates.io через сверку бинарного файла с повторяемой сборкой из исходных текстов[2].
Rust 1.71
14 июля 2023 года стало известно о том, что опубликован релиз языка программирования общего назначения Rust 1.71, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Как сообщалось, методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные изменения:
- Стабилизирован ABI C-unwind ('extern "C-unwind"'), который отличается от ABI без суффикса "-unwind" ('extern "C"') сохранением безопасного поведения (safe), если процесс "размотки" (unwinding), инициируемый при аварийном завершении программы или генерации исключения в стиле C++, пересекает границу ABI (например, когда исключение, возникшее в коде на одном языке программирования, при размотке затрагивает стек, связанный с кодом на другом языке программирования).
- Стабилизирована поддержка атрибутов '#[debug_visualizer(natvis_file = "...")]' и '#[debug_visualizer(gdb_script_file = "...")]', позволяющих встраивать в Rust-библиотеки метаданные Microsoft Natviz и скрипты GDB для оптимизации отладочного вывода при инспектировании структур данных, создаваемых библиотеками. Подобные скрипты уже включаются для стандартной библиотеки, а теперь появилась возможность их включения и для сторонних библиотек.
- На платформе Windows реализована возможность использования функций из динамических библиотек, которые недоступны во время сборки (например, чтобы не устанавливать лишние библиотеки в сборочное окружение и упростить кросс-компиляцию). Для связывания с отсутствующими библиотеками в атрибуте "#[link]" предложена опция 'kind="raw-dylib"'.
- Целевые платформы, использующие Си-библиотеку Musl ("*-linux-musl"), переведены на выпуск Musl 1.2.3 (ранее использовалась версия 1.1.24), что позволяет использовать тип time64 на 32-разрядных системах.
- В стандартной библиотеке предложен вариант макроса thread_local, инициализируемый с признаком "const", допускающим использование в контексте вместо констант, что позволяет генерировать более оптимальный код.
use std::cell::Cell;
thread_local! { pub static FOO: Cell = const { Cell::new(1) }; }
- В разряд стабильных переведена порция API, в том числе стабилизированы методы и реализации типажей:
CStr::is_empty
BuildHasher::hash_one
NonZeroI*::is_positive
NonZeroI*::is_negative
NonZeroI*::checked_neg
NonZeroI*::overflowing_neg
NonZeroI*::saturating_neg
NonZeroI*::wrapping_neg
Neg for NonZeroI*
Neg for &NonZeroI*
From<[T; N]> for (T...)
From<(T...)> for [T; N]
windows::io::AsHandle for Box<T>
windows::io::AsHandle for Rc<T>
windows::io::AsHandle for Arc<T>
windows::io::AsSocket for Box<T>
windows::io::AsSocket for Rc<T>
windows::io::AsSocket for Arc<T>
Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
<*const T>::read
<*const T>::read_unaligned
<*mut T>::read
<*mut T>::read_unaligned
ptr::read
ptr::read_unaligned
<[T]>::split_at
- В пакетном менеджере Cargo разрешено указание именованных опций debuginfo в файле Cargo.toml. В метаданные добавлена опция workspace_default_members. При выполнении команд "cargo new" и "cargo init" обеспечено автоматическое наследование полей рабочих пространств (workspace).
- Реализован второй уровень поддержки целевой платформы loongarch64-unknown-linux-gnu. Второй уровень поддержки подразумевает гарантию сборки.
- Реализован третий уровень поддержки для платформы x86_64h-apple-darwin. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода[3].
Rust 1.68
10 марта 2023 года стало известно о том, что опубликован релиз языка программирования общего назначения Rust 1.68, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Как сообщалось, методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные изменения:
- В пакетном менеджере Cargo и репозитории crates.io стабилизирована поддержка протокола Sparse, определяющего способ работы с индексом, в котором отражены доступные версии всех существующих в репозитории пакетов. Обновленный протокол позволяет оптимизировать скорость работы с crates.io и решить проблемы с масштабированием при дальнейшем росте числа пакетов в репозитории.
- Для сокращения задержек, возникающих из-за загрузки полного индекса, в Sparse вместо доступа к индексу с использованием Git задействована прямая загрузка по HTTPS только необходимых индексных данных, охватывающих зависимости конкретного проекта. Для отдачи индексных данных задействован сервис index.crates.io. По умолчанию протокол планируют задействовать в ветке Rust 1.70, а до этого для его включения можно установить переменную окружения "CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse" или добавить в секцию "registries.crates-io" файла .cargo/config.toml параметр 'protocol = "sparse"'.
- Добавлен макрос "pin!", позволяющий создать структуру Pin<&mut T> из выражения "T" с локальным закреплением его состояния (в отличие от Box::pin не выделяет память в куче, а выполняет привязку на уровне стека).
- Предложен применяемый по умолчанию обработчик ошибок распределения памяти, применяемый при использовании штатного пакета alloc. Приложения в которых включается только alloc (без std) при сбоях выделения памяти отныне будут вызывать обработчик "panic!", который при желании может быть перехвачен при помощи "#panic_handler". Программы, использующие библиотеку std, как и раньше будут выводить информацию об ошибке в stderr и аварийно завершать выполнение.
- В разряд стабильных переведена следующая порция API, в том числе стабилизированы методы и реализации типажей:
- {core,std}::pin::pin!
- impl From<bool> for {f32,f64}
- std::path::MAIN_SEPARATOR_STR
- impl DerefMut for PathBuf
- Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функции VecDeque::new.
- Для работы на платформе Android теперь требуется как минимум NDK r25 (API 19), т.е. минимальная поддерживаемая версия Android повышена до 4.4 (KitKat).
- Реализован третий уровень поддержки для платформы Sony PlayStation Vita (armv7-sony-vita-newlibeabihf). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода[4].
Rust 1.67
26 января 2023 года стало известно о том, что публикован релиз языка программирования общего назначения Rust 1.67, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Как сообщалось, методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает статическую типизацию для минимизации логических ошибок.
Основные изменения:
- Для функций async с Future::Output реализована возможность указания аннотаций "#[must_use]", включающих вывод предупреждения в случае игнорирования возвращаемого значения, что помогает выявить ошибки, вызванные предположением, что функция изменит значения, а не вернёт новое значение.
- Обновлена реализация FIFO-очередей std::sync::mpsc (multi-producer single-consumer), которая переведена на использование модуля crossbeam-channel с сохранением прежнего API. Данная реализация отличается решением ряда проблем, более оптимальной производительностью и оптимизацией сопровождения кода.
- В разряд стабильных переведена порция API, в том числе стабилизированы методы и реализации типажей.
- Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
- char::from_u32
- char::from_digit
- char::to_digit
- core::char::from_u32
- core::char::from_digit
- Реализован третий уровень поддержки для использования Rust в ядре Linux (linuxkernel), а также для платформ Sony PlayStation 1 (mipsel-sony-psx), PowerPC с AIX (powerpc64-ibm-aix), QNX Neutrino RTOS (aarch64-unknown-nto-qnx710, x86_64-pc-nto-qnx710). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
Дополнительно можно отметить публикацию компанией ARM патчей, позволяющих использовать язык Rust для разработки драйверов и модулей ядра Linux, собираемых для систем на базе архитектуры AArch64[5].
2022
Rust 1.63
11 августа 2022 года стало известно о том, что опубликован релиз языка программирования общего назначения Rust 1.63, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения надлежащего параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Как сообщалось, методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные изменения:
- Добавлен API std::thread::scope, позволяющий создавать потоки в привязке к области видимости (Scoped threads). В отличие от ранее доступных потоков данный API std::thread::scope допускает передачу заимствованных (borrowing) нестатических данных, в то время как потоки, создаваемые при помощи классического API std::thread::spawn, должны были владеть всеми передаваемыми аргументами и не могли получать заимствованные переменные. API std::thread::scope обеспечивает, что любые порождённые потоки будут завершены до возвращения данных, обеспечивая должный уровень безопасности для механизма заимствования.
- Предложены дополнительные типы-обвязки для файловых дескрипторов - BorrowedFd и OwnedFd, обеспечивающие заимствование и владение. Типы помечены при помощи "#[repr(transparent)]", что позволяет напрямую использовать их во внешних Си-привязках с учётом владения.
- Предоставлена возможность вызова Condvar::new, Mutex::new и RwLock::new в контексте констант для создания глобальных статических значений Mutex, RwLock и Condvar без применения пакетов типа lazy_static.
- Для функций типа fn foo<T>(value: T, f: impl Copy) разрешено использование синтаксиса вида "foo::<u32>(3, 3)", явно указывая тип дженерика.
- Завершён переход на использование техники NLL (Non-Lexical Lifetimes) для выявления проблем с заимствованием переменных. NLL осуществляет учёт на уровне набора указателей в графе потока выполнения, что позволяет оптимизировать качество проверки заимствования переменных (borrow checker) и допустить выполнение некоторых видов корректного кода, использование которого ранее приводило к выводу ошибки. Поддержка старого механизма, использовавшего привязку времени жизни на лексическом уровне, теперь полностью удалена из rustc, а использование другого NLL внедрено повсеместно.
- В разряд стабильных переведена очередная порция API, в том числе стабилизированы методы и реализации типажей:
- array::from_fn
- Box::into_pin
- BinaryHeap::try_reserve
- BinaryHeap::try_reserve_exact
- OsString::try_reserve
- OsString::try_reserve_exact
- PathBuf::try_reserve
- PathBuf::try_reserve_exact
- Path::try_exists
- Ref::filter_map
- RefMut::filter_map
- NonNull::<[T]>::len
- ToOwned::clone_into
- Ipv6Addr::to_ipv4_mapped
- unix::io::AsFd
- unix::io::BorrowedFd<'fd>
- unix::io::OwnedFd
- windows::io::AsHandle
- windows::io::BorrowedHandle<'handle>
- windows::io::OwnedHandle
- windows::io::HandleOrInvalid
- windows::io::HandleOrNull
- windows::io::InvalidHandleError
- windows::io::NullHandleError
- windows::io::AsSocket
- windows::io::BorrowedSocket<'handle>
- windows::io::OwnedSocket
- thread::scope
- thread::Scope
- thread::ScopedJoinHandle
- Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
- array::from_ref
- slice::from_ref
- intrinsics::copy
- intrinsics::copy_nonoverlapping
- <*const T>::copy_to
- <*const T>::copy_to_nonoverlapping
- <*mut T>::copy_to
- <*mut T>::copy_to_nonoverlapping
- <*mut T>::copy_from
- <*mut T>::copy_from_nonoverlapping
- str::from_utf8
- Utf8Error::error_len
- Utf8Error::valid_up_to
- Condvar::new
- Mutex::new
- RwLock::new
- Дополнительно можно отметить инициативу по использованию языка Rust для написания работающего на уровне ядра Linux драйвера для GPU Apple AGX, используемого в чипах Apple M1 и M2. Отмечается, что GPU Apple AGX выполняет прошивку и использует достаточно сложные совместно используемые структуры данных. Реализация управления прошивками и структурами на Rust позволила бы оптимизировать разработку и добиться более высокой безопасности. Рассматриваются два варианта разработки: написание основой части на Си, но использование компонентов на Rust для взаимодействия с прошивкой и управления структурами данных в разделяемой памяти, или написание всего драйвера на Rust и создание Rust-обвязки для подсистемы DRM.
Rust 1.62
30 июня 2022 года стало известно о том, что опубликован релиз языка программирования общего назначения Rust 1.62, основанного проектом Mozilla, развиваемого на июль 2022 года под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные изменения:
- В пакетном менеджере "cargo" предложена команда "add", позволяющая из командной строки добавлять в манифест Cargo.toml новые зависимости или изменять имеющиеся зависимости. Команда также позволяет указывать отдельные свойства (feature) и версии, например:
cargo add serde --features derive
cargo add nom@5 - Добавлена возможность использования "#[derive(Default)]" с перечислениями (enum), в которых при помощи атрибута "#[default]" определён вариант по умолчанию.
#[derive(Default)]
enum Maybe<T> {
#[default]
Nothing,
Something(T),
} - На платформе Linux задействована более компактная и быстрая реализация механизма синхронизации Mutex, основанная на применении фьютексов, предоставляемых ядром Linux. В отличие от ранее используемой реализации на базе библиотеки pthreads, для хранения состояния Mutex в новом варианте расходуется всего 5 байт вместо 40. Аналогично на futex переведены механизмы блокировок Condvar и RwLock.
- Реализован второй уровень поддержки целевой платформы x86_64-unknown-none, предназначенной для формирования исполняемых файлов, способных работать без операционной системы. Например, указанная целевая платформа может использоваться при написании компонентов ядра. Второй уровень поддержки подразумевает гарантию сборки.
Реализован третий уровень поддержки для платформ aarch64-pc-windows-gnullvm и x86_64-pc-windows-gnullvm. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
- В разряд стабильных переведена добавленная порция API, в том числе стабилизированы методы и реализации типажей:
bool::then_some
f32::total_cmp
f64::total_cmp
Stdin::lines
windows::CommandExt::raw_arg
impl<T: Default> значение по умолчанию для AssertUnwindSafe<T>
From<Rc<str>> для Rc<[u8]>
From<Arc<str>> для Arc<[u8]>
FusedIterator для EncodeWide[6]
Rust 1.60
7 апреля 2022 года стало известно о том, что опубликован релиз языка программирования общего назначения Rust 1.60, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Как сообщалось, методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные возможности:
- В компиляторе rustc стабилизирована основанная на LLVM система для генерации coverage-данных, используемых для оценки охвата кода при тестировании. Для включения coverage-данных при сборке необходимо использовать флаг "-Cinstrument-coverage", например, запуская сборку командой "RUSTFLAGS="-C instrument-coverage" cargo build". После запуска собранного таким образом исполняемого файла в текущем каталоге будет сохранён файл default.profraw, для обработки которого можно использовать утилиту llvm-profdata из компонента llvm-tools-preview. Обработанный утилитой llvm-profdata вывод затем можно передать программе llvm-cov для генерации аннотированного отчёта со сведениями об охвате кода. Информация о привязке к исходным текстам берётся из исследуемого исполняемого файла, в который включаются необходимые данные о связи coverage-счётчиков с кодом.
- В пакетном менеджере cargo стабилизирована поддержка флага "--timings", включающего формирование детального отчёта о ходе сборки и времени выполнения каждого шага. Отчёт может оказаться полезен для оптимизации производительности сборочного процесса.
- В пакетном менеджере cargo предложен дополнительный синтаксис для механизма условной компиляции и выбора необязательных зависимостей, настраиваемого в файле Cargo.toml через перечисление списка именованных свойств в секции features и активируемого через включение свойств во время сборки пакета при помощи флага "--features". В данной версии добавлена поддержка зависимостей в отдельных пространствах имён и слабых (weak) зависимостей.
- В первом случае реализована возможность использования внутри секции "features" элементов с префиксом "dep:" для явной привязки к необязательной зависимости без неявного представления этой зависимости как свойства (feature). Во втором случае добавлена поддержка пометки знаком "?" ("package-name?/feature-name") необязательных зависимостей, которые следует включить только, если какое-то другое свойство включает данную необязательную зависимость.
- Возвращена отключённая в прошлом выпуске поддержка инкрементальной компиляции. Ошибка в компиляторе, из-за которой функция была отключена, устранена.
- Решены некоторые проблемы с предоставлением для таймеров Instant гарантии монотонного расчёта времени, при котором учитывается время, проведённое системой в спящем режиме. Ранее для работы таймера по возможности использовался OS API, который не учитывал проблемные ситуации, нарушающие монотонность времени, такие как проблемы с оборудованием, применение виртуализации или ошибки в операционной системе.
- В разряд стабильных переведена порция API, в том числе стабилизированы методы и реализации типажей.
- Реализован третий уровень поддержки для платформ mips64-openwrt-linux-musl и armv7-unknown-linux-uclibceabi (softfloat). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
- Компилятор переведён на использование LLVM 14.
Дополнительно можно отметить:
- Добавлена поддержка раскрутки компилятора (bootstrapping) rustc при помощи бэкенда rustc_codegen_gcc, позволяющего использовать библиотеку libgccjit от проекта GCC в качестве генератора кода в rustc, что позволяет обеспечить в rustc поддержку доступных в GCC архитектур и оптимизаций. Под раскруткой компилятора понимается возможность использования в rustc генератора кода на основе GCC для сборки самого компилятора rustc. С практической стороны подобная возможность позволяет собирать rust-программы для архитектур, ранее не поддерживаемых в rustc.
- Доступен выпуск инструментария uutils coreutils 0.0.13, в рамках которого развивается аналог пакета GNU Coreutils, переписанный на языке Rust. В состав coreutils входит более ста утилит, включая sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln и ls. Целью проекта является создание кроссплатформенной альтернативной реализации Coreutils, способной работать в том числе на платформах Windows, Redox и Fuchsia, а также распространение под пермиссивной лицензией MIT, вместо копилефт-лицензии GPL.
В данной версии оптимизированы реализации многих утилит, в том числе совместимость утилит cp, dd, df, split и tr с аналогами от проекта GNU. Предоставлена online-документация. Для разбора аргументов командной строки задействован парсер clap, что позволило оптимизировать вывод для флага "--help" и добавить поддержку аббревиатур длинных команд (например, можно указывать "ls --col" вместо "ls --color")[7].
2021: Google включила Rust в число основных языков для разработки Android
В начале апреля 2021 года Google сообщила о включении языка программирования Rust в число языков, которые допускаются для разработки Android. Поддержка Rust реализована в рамках проекта по усилению защищенности, продвижению методов безопасного программирования и повышению эффективности обнаружения проблем при работе с памятью в Android.
По сообщению Google, несмотря на то, что команда разработчиков вкладывает много усилий и ресурсов в обнаружение, исправление и смягчение последствий данного класса багов, все же около 70% из всех опасных уязвимостей, выявленных в Android, по-прежнему вызваны ошибками при работе с операционной системой. Использование языка Rust, который ориентирован на безопасную работу с памятью и обеспечивает автоматическое управление памятью, позволит снизить риск возникновения уязвимостей, вызванных ошибками при взаимодействии с памятью.
Безопасное взаимодействие с памятью обеспечивается в Rust посредством компиляции через проверку ссылок, отслеживание владения объектами и учет времени жизни объектов, через оценку корректности доступа к памяти во время выполнения кода. Это язык программирования также обеспечивается функционал для защиты от целочисленных переполнений, Rust требует обязательной инициализации значений переменных перед применением, а также обеспечивает лучшие возможности для управления ошибками в стандартной библиотеке. Rust использует концепцию неизменяемости ссылок и переменных по умолчанию, а также поддерживает эффективную статическую типизацию для минимизации логических ошибок.
В Google отметили, что перезаписи существующего кода C/C++ на Rust не будет, язык будет использован для написания нового кода. Это связано с тем, что большинство ошибок обнаруживается в новом или недавно измененном коде - около 50% выявляемых ошибок работы с памятью в Android определяются в коде, написанном менее года назад.[8]
Языки программирования
Примечания
- ↑ 2022 Annual Rust Survey Results
- ↑ Выпуск Rust 1.72. Поставка пакета serde_derive только в скомпилированном виде
- ↑ Выпуск языка программирования Rust 1.71
- ↑ Выпуск языка программирования Rust 1.68
- ↑ Выпуск языка программирования Rust 1.67
- ↑ Выпуск языка программирования Rust 1.62
- ↑ Вышла версия 1.60 языка программирования Rust
- ↑ Google now supports Rust for underlying Android OS development
Подрядчики-лидеры по количеству проектов
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
Распределение вендоров по количеству проектов внедрений (систем, проектов) с учётом партнёров
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
Распределение систем по количеству проектов, не включая партнерские решения
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)