Релиз языка программирования Rust 1.32

Состоялся релиз языка системного программирования Rust 1.32, развиваемого проектом Mozilla. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime.

Автоматическое управление памятью в Rust избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo, позволяющий получить нужные для программы библиотеки в один клик. Для размещения библиотек поддерживается репозиторий crates.io.

В подготовке нового выпуска приняли участие 152 разработчика. Основные новшества:

  • Добавлен новый макрос «dbg!», позволяющий упростить наблюдение за состоянием переменных в отладочных целях. Кроме непосредственного значения переменной, предложенный макрос также показывает имя файла, номер строки и название переменной, что делает его более удобным инструментом для отладки, чем вывод при помощи «println». Информация выводится в поток «stderr». Макрос также можно применять для анализа вычисления выражений и условных операторов, например, можно указывать «if dbg!(n <= 1) {" или "dbg!(n*f(n-1))";
  • Прекращено использование по умолчанию библиотеки распределения памяти jemalloc в пользу штатных системных функций выделения и освобождения блоков памяти. Несмотря на то, что jemalloc обеспечивает более высокую производительность, его применение приводит к увеличению размера исполняемого файла приблизительно на 300 Кб. Кроме того, jemalloc специфичен для Unix-подобных систем и в некоторых ситуациях приводит к возникновению проблем. При необходимости продолжения использования jemalloc теперь нужно явно подключать пакет jemallocator;
  • Пути к модулям в выражении «use», не начинающиеся с ключевых слов «super», «self» и «crate», теперь приводят к извлечению определённого в модуле элемента (структуры, перечисления и т.п.), до попытки определения внешнего пакета. Например, указание «use Color::*;» при наличии определения «enum Color { Red, Green, Blue };» до выражения «use», приведёт к импорту вариантов значений перечисления «Color»;
  • В макросы добавлен новый проверочный признак «literal», позволяющий определить является ли переменная литералом, независимо от типа (строковым, числовым, символьным);
  • В определениях макросов теперь можно использовать оператор »?», позволяющий определить, что шаблон встречается 0 или 1 раз, по аналогии с тем как операторы »*» и »+» проверяют наличие шаблона 0 и более раз или один и более раз;
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы to_be_bytes (big endian), to_le_bytes (little endian) и to_ne_bytes (native) в модулях i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128 и usize;
  • 19 различных функций определены с признаком «const» и могут применяться не только как обычные функции, но и использоваться в любом контексте вместо констант;
  • В пакетном менеджере Cargo обеспечена возможность указания имени пользователя внутри URL реестра и добавлена команда «cargo c», которая является сокращённым псевдонимом команды «cargo check».

© OpenNet