- PVSM.RU - https://www.pvsm.ru -

На пути к Rust 1.0

Эта статья — перевод первого [1] поста в официальном блоге языка программирования Rust, разрабатываемого Mozilla. Первая стабильная версия Rust совсем не за горами (предварительный прогноз — конец этого/начало следующего года), и авторы языка собираются опубликовать несколько вводных статей о том, что же такое особенное Rust предлагает.

В этих статьях разработчики подробнее расскажут о ключевых особенностях языка — концепциях владения и заимствования данных, зачем они вообще нужны и какие задачи позволяют решать. Я постараюсь переводить их по мере выхода и надеюсь, что язык кого-нибудь заинтересует. Замечания к переводу прошу слать в личку.


Rust 1.0 уже в пути! Мы определились со списком фич и плотно заняты их реализацией. Наш план — выпустить бета-версию 1.0 в конце года. Если всё будет в порядке, то релиз 1.0 состоится вскоре после беты. Будущие версии в ветке 1.x будут обратно совместимыми, то есть существующий код будет ими компилироваться без изменений (естественно, за исключением багов в компиляторе).

Естественно, релиз 1.0 не означает только лишь стабилизацию («ваш код продожит компилироваться»); для нас он значит, что язык стал таким, каким мы хотим его видеть. Если ещё точнее, что он минимален. На данный момент язык выстроен вокруг простых базовых концепций, которые мы называем владением (ownership) и заимствованием (borrowing) (подробнее о них далее). Применяя эти концепции, всё остальное мы смогли вынести в библиотеки. Это очень здорово, потому что вы сами сможете написать аналогичные библиотеки. Из-за этого мы уверены, что Rust не только достигнет своих первоначальных целей, но и пойдёт дальше, применяясь в таких задачах, какие мы даже себе не представляли.

Путь к Rust 1.0

Rust прошёл длинный путь в своём развитии. Если вы не следили за ним некоторое время, то, скорее всего, удивитесь, насколько за последний год мы его упростили. Один из самых выдающихся замечательных примеров — это указатели. Долгое время в Rust были встроены несколько видов указателей, обозначающихся специальными символами. Их больше нет, и в языке остались только ссылочные типы, &T и &mut T. Кроме того, мы смогли объединить и упростить многие другие элементы языка, например, замыкания, которые были ранее представлены во многих формах. Многое продолжает меняться и до сих пор.

Ключом ко всему этому послужило целенаправленное использование основополагающих идей: владения (данными; ownership) и заимствования (borrowing). Сначала мы ввели понятие владения данными в качестве эффективного и безопасного способа передачи данных между задачами (потоками), но с течением времени мы поняли, что за счёт этого же самого механизма мы можем вынести самые разные элементы языка в библиотеки. Получившуюся в результате архитектуру не только проще изучить; она гораздо «ближе к железу», чем мы в принципе могли ожидать. Все конструкции языка Rust непосредственно отображаются на машинные операции, и Rust не требуется специальная среда выполнения или внешние зависимости. В самом минимальном его варианте на Rust можно даже написать ядро [2] операционной [3] системы [4].

Несмотря на все эти изменения, Rust остался верен своей цели — предоставить безопасность и удобство современных языков программирования, не теряя эффективности и низкоуровневых возможностей, которые предлагают C и C++. Другими словами, если вы хотите погрузиться в работу непосредственно с железом, но при этом у вас нет желания отратить огромное количество времени в отладке сегфолтов и гонок данных, Rust вам пригодится.

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

Что ещё осталось сделать

Мы уже далеко продвинулись, но перед первым релизом ещё многое предстоит сделать. Вот список больших изменений, над которыми мы в данный момент работаем:

  1. Типы с динамическим размером (Dynamically sized types). Это расширение системы типов даст возможность единообразно работать с типами, размер которых неизвестен во время компиляции — такими, как массивы. При помощи DST пользователи языка смогут создавать собственные «умные» указатели, которые будут способны содержать массивы объектов. Nicholas Cameron не так давно проделал [5] большую часть необходимой работы.
  2. Unboxed-замыкания (Unboxed closures). Новый дизайн замыканий [6] объединяет замыкания и объектные типы. Большая часть этой спецификации уже реализована.
  3. Ассоциированные типы (Associated types). Мы переводим наш механизм трейтов на использование ассоциированых типов [7], что сильно сократит количество ти́повых переменных, ранее необходимых для создания действительно обобщённых библиотек. Patrick Walton уже сделал предварительный вариант реализации ассоциированных типов.
  4. Where-условия (Where clauses). Мы хотим добавить новую гибкую форму задания ограничений на ти́повые переменные — where-условия [8]. Patrick Walton уже добавил базовую поддержку в синтаксисе, а я сделал оставшуюся функциональность в отдельной ветке, которая скоро будет интегрирована в проект.
  5. Множественная диспетчеризация трейтов (Multidispatch traits). Мы собираемся расширить возможности трейтов так, чтобы компилятор мог выбирать конкретную реализацию трейта на основании нескольких типов [7] сразу. Прототип уже есть в моей ветке.
  6. Деструкторы (Destructors). Мы хотим улучшить семантику деструкторов так, чтобы они не требовали предварительного обнуления памяти. Как следствие, время компиляции уменьшится, а скорость выполнения уже скомпилированного кода повысится. Felix Klock проанализировал, что для этого необходимо, и сейчас занят реализацией.
  7. Легковесные потоки (Green threading). Мы удалим поддержку легковесных потоков из стандартной библиотеки и перенесём её в отдельный пакет. Благодаря этому модель потоков Rust станет ближе к модели операционной системы, что, в свою очередь, приведёт к более эффективным программам. Aaron Turon написал RFC [9] и уже собирается приступить к работе над этим.

Что касается библиотек, то сейчас мы проходимся по libstd, отмечая отдельные её части как стабильные и нестабильные. Вы можете следить за нашим прогрессом здесь [10]. Учтите, что многие «нестабильные» определения на самом деле будут изменяться минимально, например, они могут слегка сменить имя для лучшего соответствия принятым соглашениям.

Cargo и экосистема библиотек

Ранее я писал, что Rust 1.0 — не столько конечная цель, сколько стартовый рубеж. Это на самом деле так. Цель версии 1.0 — стать гибкой основой для создания эффективных библиотек. Но библиотеки хороши ровно настолько, насколько легко их найти и установить.

Встречайте Cargo, пакетный менеджер Rust [11]. Cargo в последнее время очень быстро развивается и уже вполне функционален. К релизу Rust 1.0 мы также планируем запустить центральный репозиторий пакетов, благодаря чему создавать и распространять библиотеки (которые мы называем «ящиками» — «crates») будет очень просто. И конечно, Cargo и сервер с репозиторием оба написаны на Rust.

Процесс релизов

Промежуточные версии Rust долгое время выходили точно по графику, и мы не планируем от этого отказываться. Однако, как только у нас появятся стабильные релизы, мы построим вокруг них дополнительную инфраструктуру. Мы хотим воспользоваться системой «каналов», которая применяется многими проектами, такими, как Firefox [12], Chrome [13] и Ember.js [14].

Главная идея заключается в наличии трёх каналов: Nightly, Beta и Stable. Nightly-канал включает нестабильные фичи и библиотеки, которые могут изменяться без сохранения обратной совместимости. Каждые шесть недель мы будем создавать новую ветку, Beta. В неё больше не будут вноситься изменения, ломающие совместимость, поэтому если вы используете Beta или Stable, вы можете быть уверенными, что ваш код продолжит компилироваться без изменений. В это же время уже существующая Beta-ветка станет Stable-релизом. Мы ожидаем, что пользователи языка будут тестировать свой код под Beta-веткой, а готовые программы собирать с помощью Stable. Ваше тестирование Beta-версией поможет нам узнать заранее, что мы сломали что-то, что вы используете.

Конкретно релиз 1.0 мы планируем выпустить в виде беты и затем использовать вышеописанный процесс для перехода к официальному релизу 1.0. Однако, если мы обнаружим какую-нибудь серьёзную проблему в бете, мы можем отложить релиз и провести ещё один или два бета-периода. В конце концов, лучше чуть-чуть подождать, чем потратить все силы на что-то совершенно нерабочее.

Перспектива

Во многом выпуск Rust 1.0 — не конец, а только начало. Естественно, мы планируем развивать язык и в дальнейшем: у нас есть множество идей, и некоторые из них уже запланированы к реализации. Но больше всего я жду не результатов работы команды Rust; я считаю, что устойчивая основа позволит сообществу Rust и его экосистеме развиваться и расти ещё быстрее, чем сейчас. Не могу дождаться того, что из этого выйдет.

Автор: Googolplex

Источник [15]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/69808

Ссылки в тексте:

[1] первого: http://blog.rust-lang.org/2014/09/15/Rust-1.0.html

[2] ядро: https://github.com/charliesome/rustboot

[3] операционной: https://github.com/ryanra/RustOS

[4] системы: https://github.com/jvns/puddle

[5] не так давно проделал: https://github.com/rust-lang/rust/commit/7932b719ec2b65acfa8c3e74aad29346d47ee992

[6] Новый дизайн замыканий: https://github.com/rust-lang/rfcs/blob/master/active/0044-closures.md

[7] ассоциированых типов: https://github.com/rust-lang/rfcs/pull/195

[8] where-условия: https://github.com/rust-lang/rfcs/pull/135

[9] написал RFC: https://github.com/rust-lang/rfcs/pull/230

[10] здесь: http://doc.rust-lang.org/std/stability.html

[11] Cargo, пакетный менеджер Rust: http://crates.io/

[12] Firefox: https://www.mozilla.org/en-US/firefox/channel/

[13] Chrome: http://www.chromium.org/getting-involved/dev-channel

[14] Ember.js: http://emberjs.com/builds/

[15] Источник: http://habrahabr.ru/post/237199/