Rust (язык программирования)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Rust
Семантика:

мультипарадигмальный: параллельное, функциональное, объектно-ориентированное, императивное, структурное программирование

Тип исполнения:

компилируемый

Появился в:

2010

Автор(ы):

Грэйдон Хор

Расширение файлов:

.rs .rc

Релиз:

0.11.0 (2 июля 2014)

Система типов:

статическая, строгая, с выводом типов, опционально динамическая

Основные реализации:

rustc

Испытал влияние:

Alef, C++, Camlp4, Common Lisp, Erlang, Haskell, Hermes, Limbo, Napier, Napier88, Newsqueak, NIL, Sather, OCaml, Standard ML

Лицензия

MIT

Сайт:

http://www.rust-lang.org/

Rust — экспериментальный язык программирования, разрабатываемый Mozilla Research[1]. Работа над языком была начата Грэйдоном Хоаром в 2006 году, в 2009[2] к разработке подключилась Mozilla, и в 2010 году язык был официально представлен на Mozilla Summit 2010[3]. Также в 2010 году разработка языка была переведена с использования компилятора, написанного на OCaml, на компилятор, написанный на Rust, с использованием LLVM в качестве back-end[4]. В следующем году он успешно скомпилировал сам себя[5].

Описание[править | править вики-текст]

Основная задача Rust — быть удобным языком для написания больших клиент-серверных приложений, работающих в сети Интернет. Такое позиционирование привело к выбору функциональных возможностей с акцентом на безопасность, контроль за использованием памяти и параллельное выполнение задач. Разработчиками языка ставится задача достичь производительности приложений на Rust сравнимой с производительностью C++-приложений[6]. Rust намеренно не включает в себя каких-то новых и непроверенных идей. Проект нацелен на сбор лучших возможностей из уже существующих языков и решений.

Основные отличия от других языков[править | править вики-текст]

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

В Rust существует несколько типов указателей, адресующих объекты, размещенные в разных типах памяти, и подчиняющихся разным правилам:

  • Разделяемые указатели (Managed boxes). Указывают на данные, размещенные в локальной куче (local heap) задачи; несколько разделяемых указателей могут адресовать один и тот же объект.
  • Уникальные указатели (Owned boxes). Указывают на данные, размещенные в куче обмена (exchange heap), общей для всех задач; в одну единицу времени доступ к объекту может адресовать только один указатель (см. исключения из правила в разделе "Модуль ARC").
  • Временные указатели (Borrowed pointers). Универсальные указатели, имеющие возможность указывать на любой тип объекта: стековый, размещенный в локальной или обменной куче. В основном используются для написания универсального кода, работающего с данными в функциях, когда тип размещения объекта не важен.
  • Немного сбоку находятся объекты, размещенные на стеке. Для их адресации не существует какого-либо выделенного типа указателя.

Примеры[править | править вики-текст]

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

Hello world:

use std::{os};
 
fn main() {
    let args = os::args();
    println!("hello world from '{}'!", args[0]);
}

Пара примеров реализации функции поиска факториала, в рекурсивном и итеративном стилях:

/* The branches in this function exhibit Rust's optional implicit return values,
   which can be utilized where a more "functional" style is preferred.
   Unlike C++ and related languages, Rust's `if` construct is an expression
   rather than a statement, and thus has a return value of its own. */
fn fac_recur(n: int) -> int {
    if n <= 1 { 1 }
    else { n * fac_recur(n-1) }
}
 
fn fac_iter(n: int) -> int {
    // Variables must be declared with the `mut` keyword in order to be mutable.
    let mut i = 1;
    let mut result = 1;
    while i <= n {
        result *= i;
        i += 1;
    }
    return result;  // An explicit return, in contrast to the above.
}

Примечания[править | править вики-текст]

  1. The Rust Language. Lambda the Ultimate (8 июля 2010). Проверено 30 октября 2010. Архивировано из первоисточника 23 ноября 2012.
  2. Project FAQ (14 сентября 2010). Проверено 17 апреля 2012.
  3. Future Tense (29 апреля 2011). — «At Mozilla Summit 2010, we launched Rust, a new programming language motivated by safety and concurrency for parallel hardware, the “manycore” future which is upon us.»  Проверено 17 апреля 2012. Архивировано из первоисточника 18 сентября 2012.
  4. Hoare, Graydon Rust Progress (2 октября 2010). Проверено 17 апреля 2012. Архивировано из первоисточника 18 сентября 2012.
  5. Hoare, Graydon [rust-dev] stage1/rustc builds (20 апреля 2011). — «After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :)»  Проверено 17 апреля 2012.
  6. Walton, Patrick C++ Design Goals in the Context of Rust (5 декабря 2010). — «… It’s impossible to be “as fast as C” in all cases while remaining safe… C++ allows all sorts of low-level tricks, mostly involving circumventing the type system, that offer practically unlimited avenues for optimization. In practice, though, C++ programmers restrict themselves to a few tools for the vast majority of the code they write, including stack-allocated variables owned by one function and passed by alias, uniquely owned objects (often used with auto_ptr or the C++0x unique_ptr), and reference counting via shared_ptr or COM. One of the goals of Rust’s type system is to support these patterns exactly as C++ does, but to enforce their safe usage. In this way, the goal is to be competitive with the vast majority of idiomatic C++ in performance, while remaining memory-safe…»  Проверено 17 апреля 2012. Архивировано из первоисточника 18 сентября 2012.

Ссылки[править | править вики-текст]