Rust (мова програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Rust
144px
Парадигма: компільована, паралельна, функційна, імперативне, об'єктно-орієнтована, структурна
Дата появи: 2010
Творці: Graydon Hoare
Розробник: Rust Project Developers
Останній реліз: 0.11 (2 липня 2014; 30 днів тому)
Система типізації: статична, сувора, вивід типів, структурна
Під впливом від: Alef, C#, C++, Camlp4, Common Lisp, Cyclone, Erlang, Haskell, Hermes, Limbo, Napier, Napier88, Newsqueak, NIL, Ocaml, Ruby, Sather, Standard ML
ОС: Linux, Mac OS X, Windows, FreeBSD
Ліцензія: Apache License 2.0 або MIT License[1]
Звичайні розширення файлів: .rs
Сторінка інтернет: www.rust-lang.org

Rust — експериментальна мова програмування, що розробляється Mozilla Research[2]. Мова має сувору типізацію і сфокусована на безпечній роботі з пам'яттю і забезпеченні високого паралелізму виконання завдань (можливість породжувати тисячі і навіть мільйони підпроцесів).

Сирцеві тексти проекту поширюються під ліцензією MIT.

Історія[ред.ред. код]

Робота над мовою була розпочата Грейдоном Гоаром в 2006 році, в 2009[3] до розробки підключилася Mozilla, і в 2010 році мова була офіційно представлена на Mozilla Summit 2010[4]. Також в 2010 році розробка мови була переведена на використання компілятора, написаного на OCaml, на компілятор, написаний на Rust, з використанням LLVM як бекенду[5]. У 2011 році він успішно скомпілював сам себе[6].

Паралельно з Rust разом з компанією Samsung розвивається експериментальний браузерний рушій Servo, написаний мовою Rust з підтримкою багатонитевового рендеринга веб-сторінок і розпаралелюванням операцій з DOM (Document Object Model).

Огляд[ред.ред. код]

За структурою мова Rust нагадує C++, але істотно відрізняється в деяких деталях реалізації синтаксису і семантики, а також орієнтацією на блокову організацію структури коду, яка дозволяє реалізувати завдання у вигляді легковагих співпрограм. Автоматичне управління пам'яттю позбавляє розробника від маніпулювання вказівниками і захищає від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменовування нульових вказівників, вихід за межі буфера тощо. Rust підтримує суміш імперативних процедурних і об'єктно-орієнтованих методів з такими парадигмами, як функційне програмування і модель акторів, а також узагальнене програмування і метапрограмування, в статичних і динамічних стилях.

Особливості[ред.ред. код]

Базові можливості мови:

Орієнтація на безпеку
  • Акуратна робота з пам'яттю — ніяких нульових і втрачених вказівників. Автоматичне управління пам'яттю;
  • Контроль мінливості. Об'єкти незмінні (Immutable) за умовчанням;
  • Безпека динамічного виконання: обробка збоїв, винятки, ведення логу, RAII/dtors;
  • Typestate: можливість визначення складних інваріантів, що контролюють структури даних.
Орієнтація на паралельність і ефективність коду
  • Явний контроль пам'яті, контролювання схеми розподілу пам'яті;
  • Вкрай легкі завдання, що формуються у вигляді співпрограми. Легкість в породження тисяч і мільйонів підпроцесів;
  • Ітератори стека (фактично лямбда-блоки без розподілу купи);
  • Статична, нативна компіляція із створенням виконуваних файлів ELF, PE, Mach-o;
  • Прямий і простий інтерфейс для коду на мові Сі;
Орієнтація на практичне застосування
  • Мультипарадигмальний, функціональний, імперативно-процедурний, об'єктно-орієнтована, підтримка паралельної actor-моделі;
  • Функції вищого порядку із зв'язуванням (біндінгами);
  • Немає номінальних типів або ієрархії типів;
  • Мульти-платформовий, підтримується Windows, Linux, Mac OS X, *BSD;
  • Зберігання рядків у UTF8, різноманітність низькорівневих типів;
  • Працює з існуючими нативними наборами інструментів: GDB, Valgrind, Shark тощо;
  • Практична можливість порушення правил: можливість ігнорування правил безпеки, якщо чітко вказано, коли і як їх порушувати.

Приклади[ред.ред. код]

Наведені нижче приклади є робочими при складанні за допомогою компілятора Rust від 6 травня 2013 року. У той же час, з урахуванням того, що мова перебуває в стадії активної розробки, код може не працювати в пізніших версіях.

Hello world:

extern mod std;
fn main() {
    let args = os::args();
    io::println(fmt!("hello world from '%s'!", 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,
            result = 1;
    while i <= n {
        result *= i;
        i += 1;
    }
    return result;  // An explicit return, in contrast to the above.
}

Проста демонстрація легковагих можливостей паралелізму Rust:

/* This function creates twenty "tasks" that all execute concurrently. Run it
   several times and observe the irregular linebreaks that result as each task
   races on stdout, due to the fact that `println` may yield to the task
   scheduler between printing its argument and printing a newline. */
fn main() {
    // This string is immutable, so it can safely be accessed from multiple tasks.
    let message = "I'm in a different task!";
    // 'for' loop syntax works with Iterator trait.
    for i in range(0u, 20) {
        do spawn {
            // `fmt!` is a macro that statically verifies a format string.
            // Macros are structural (as in Scheme) rather than textual (as in C).
            println(fmt!("%s", message));
        }
    }
}

Виноски[ред.ред. код]

  1. «COPYRIGHT». Rust compiler source repository. Процитовано 2012-12-17. 
  2. «The Rust Language». Lambda the Ultimate. 2010-07-08. Архів оригіналу за 2012-11-23. Процитовано 2010-10-30. 
  3. «Project FAQ». 2010-09-14. Процитовано 2012-04-17. 
  4. «Future Tense». 2011-04-29. Архів оригіналу за 2012-09-18. Процитовано 2012-04-17. «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.» 
  5. Hoare, Graydon (2010-10-02). «Rust Progress». Архів оригіналу за 2012-09-18. Процитовано 2012-04-17. 
  6. Hoare, Graydon (2011-04-20). «[rust-dev] stage1/rustc builds». Процитовано 2012-04-17. «After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :)» 

Посилання[ред.ред. код]