Выпуск языка программирования Rust 0.12, развиваемого проектом Mozilla

В преддверии начала подготовки стабильного выпуска языка программирования Rust 1.0, переход к бета-тестированию которого ожидается в конце года, представлен очередной экспериментальный выпуск Rust 0.12.0, продолжающий развитие функциональности и оттачивание языковых конструкций. Язык Rust развивается проектом Mozilla и сфокусирован на безопасной работе с памятью и обеспечении высокого параллелизма выполнения заданий (возможность порождать тысячи и даже миллионы подпроцессов). Исходные тексты проекта распространяются под лицензией MIT. Параллельно с Rust совместно с компанией Samsung развивается экспериментальный браузерный движок Servo, написанный на языке Rust и отличающийся поддержкой многопоточного рендеринга web-страниц и распараллеливанием операций с DOM (Document Object Model).

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

С момента прошлого выпуска внесено около 1900 изменений, среди которых:

Большое внимание уделено подготовке документации. Полностью переписано руководство разработчика (The Rust Guide); Продолжено развитие пакетного менеджера Cargo, который в некоторых ситуациях уже вполне доведён до готовности; Переписаны и приведены в соответствие к требованиям по написанию кода реализации многих API в области std; Вторичные библиотеки вынесены из основного дерева исходных текстов и теперь должны быть установлены через пакетный менеджер Cargo. Среди таких библиотек: uuid, semver, glob, num, hexfloat, fourcc; Возможность определения lifetime-аннотаций в определении функции; Поддержка работы в 64-разрядных версиях Windows; В компиляторе rustc реализована эксперментальная поддержка распараллеливания при указания опции »-C codegen-units»; Практически доведена до готовности реализация типов с динамически изменяемым размером (Dynamically-sized), для управления данными типами представлено новое свойство «Sized»; Свойство «Share» переименовано в «Sync» для избежания ассоциаций с типом «shared reference»; Добавлено новое ключевое слово «move» для индикации замыканий, захватывающих значения; Добавлено новый более эффективный тип замыканий — «unboxed closures»; Для переименования выражений теперь следует использовать «use foo as bar» вместо «use bar = foo», а также «extern crate foo as bar» вместо «extern crate bar = foo»; Изменён синтаксис (например,»[0…4]»,»[a, b, c…]») определения блоков в «Slice» и «SliceMut». Для определения входящих диапазонов теперь следует использовать три точки вместо двух, т.е.»0…4» вместо »0…4»; Расширены возможности стандартной библиотеки. Переработаны библиотеки Bit-vectors, collections: bitv и collections: btree. Проведена оптимизация в работе компонентов, связанных с вводом/выводом. Базовые возможности языка:

Ориентация на безопасность: Аккуратная работа с памятью — никаких нулевых и потерянных указателей. Автоматическое управление памятью; Контроль изменчивости. Объекты неизменяемы (Immutable) по умолчанию; Безопасность динамического выполнения: обработка сбоев, исключения, ведение лога, RAII / dtors; Typestate: возможность определения сложных инвариантов, контролирующих структуры данных. Ориентация на параллельность и эффективность кода: Явный контроль памяти, контролирование схемы распределения памяти; Крайне лёгкие задачи, формируемые в виде сопрограмм. Лёгкость в порождении тысяч и миллионов подпроцессов; Итераторы в стэке (фактически лямбда-блоки без распределения кучи); Статическая, нативная компиляция с созданием исполняемых файлов ELF, PE, Mach-o; Прямой и простой интерфейс для кода на языке Си; Ориентация на практическое применение: Мультипарадигмальный, функциональный, императивно-процедурный, объектно-ориентированный, поддерживающий параллельную actor-модель; Функции высшего порядка с биндингами; Нет номинальных типов или иерархии типов; Мультиплатформенный, поддерживается Windows, Linux, Mac OS X, *BSD; Хранение строк в UTF-8, разнообразие низкоуровневых типов; Работает с существующими нативными наборами инструментов: GDB, Valgrind, Shark и т.д.; Практическая возможность нарушения правил: возможность игнорирования правил безопасности, если чётко указано, когда и как их нарушать.

© OpenNet