راست (زبان برنامه‌نویسی)

**راست**  یک زبان برنامه‌نویسی ترجمه‌شده، عام منظوره و چند الگویی است که توسط تحقیقات موزیلا توسعه یافته‌است. این زبان طراحی شده‌است تا یک زبان مطمئن، همسو و عملی باشد که مدل‌های تابعی خالص، امری-رویه‌ای و شی گرا را پشتیبانی می‌کند.
زبان از یک پروژهٔ شخصی توسط توسعه‌دهندهٔ Graydon Hoare به‌وجود آمد، که او کار بر روی آن را در سال ۲۰۰۶ آغاز کرد؛ کارفرمای او موزیلا، در سال ۲۰۰۹ درگیر این پروژه شد و رسماً آن را برای اولین بار در سال ۲۰۱۰ پرده برداری کرد. در همان سال، کار از کامپایلرهای اولیه (نوشته شده در OCaml) خود را به کامپایلر خود میزبان نوشته‌شده در Rust تغییر داد. چیزی که به‌عنوان rustc شناخته شد، با موفقیت خود را در سال ۲۰۱۱ کامپایل کرد. کامپایلر خود میزبان از LLVM به عنوان بَک‌اند (backend) استفاده می‌کند.

اولین نسخه از کامپایلر Rust، که آلفا نام گذاری شد در ژانویه ۲۰۱۲ منتشر شد. نسخه فعلی (نسخه 1.91.1)، در نوامبر ۲۰۲۵ منتشر شده‌است.

Rust به‌طور کامل در بازخورد باز و همکاری و کمک از جامعه توسعه یافته‌است. طراحی این زبان از طریق تجربه حاصل از نوشتن موتور چیدمان Servo اصلاح شده و Rust خودش را کامپایل کرده‌است. اگر چه توسعه آن با حمایت مالی موزیلا و سامسونگ بوده‌است، اما یک پروژهٔ اجتماعی است. بخش بزرگی از تصدیقات نسخهٔ فعلی از اعضای جامعه می‌باشد.

## توصیف
هدف Rust این است که یک زبان خوب برای ایجاد مجموعهٔ بزرگی از مشتری‌ها و سرور برنامه‌هایی که بر روی اینترنت اجرا می‌شوند باشد.این امر زبان را به یکی از ویژگی‌های مجموعه با تأکید بر ایمنی، کنترل از طرح حافظه و همزمانی هدایت می‌کند.
اگر عملکرد زبان تنها عامل مورد توجه باشد، عملکرد قابل اطمینان بودن کد همان‌طور که انتظار می‌رود آن را کندتر از ++C می‌کند اما پیشگیری‌های از پیش تعریف شده در Rust با احتساب اقدامات محتاطانه‌ای که زبان ++C به‌طور دستی انجام می‌دهد، از نظر سرعت برابری می‌کند و یا حتی سریعتر است.

نحو زبان Rust مشابه C و ++C است؛ با بلاک‌هایی از کد که بین آکولادها محدود شده‌است و کلمات کلیدی کنترل جریان مانند while ,do ,else ,if و for. البته تمام کلمات کلیدی C و ++C وجود ندارد اما به هر حال دیگران (مانند تطابق واژه کلیدی برای انشعاب چند جهت) برای برنامه‌نویسانی که از این زبان‌ها می‌آیند کمتر آشنا خواهد بود. با وجود شباهت نحوی، Rust از نظر معنایی با C و ++C متفاوت است.

## پروژه‌هایی که از راست استفاده می‌کنند
پروژه‌های توسعه یافته در Rust شامل:[بندانگشتی|پروژه [:en:Rust_for_Linux|Rust برای لینوکس از سال ۲۰۲۲ در هسته لینوکس مورد پشتیبانی قرار گرفته است.]]سیستم عامل: 

* لینوکس از سال ۲۰۲۲ از کرنل ورژن ۶.۱
* ویندوز  از سال ۲۰۲۳
* Fuchsia 

مبتنی بر مرورگر:
* فایرفاکس
** سروو (موتور چیدمان) - موتور جستجوی وب موازی جدید موزیلا که با همکاری سامسونگ توسعه یافته‌است
** '''کوانتوم''' - یک پروژه متشکل از چندین زیرپروژه برای بهبود موتور مرورگر وب Gecko در Firefox توسعه یافته توسط Mozilla
مبتنی بر ابزار ساخت:
* Cargo - سیستم ساخت خودکار Rust
* Habitat - یک ابزار ساخت و استقرار از شرکت Chef Software (وب سایت رسمی)
پروژه‌های دیگر:
* Magic Pocket - سیستم فایل Dropbox که قدرت ماشین‌های حافظهDiskotech petabyte را افزایش می‌دهد
* اوپن‌دی‌ان‌اس - به‌کارگیری زبان Rust در دو مؤلفهOpenDNS
* Redox OS - یک سیستم عامل ریزهسته
* Piston - یک موتور بازی (وب سایت رسمی)
* OnePush - یک سیستم اعلان رسانی توسعه یافته توسطOneSignal
* REmacs - یک پورت از Emacs بهRust
* MAIDsafe - پروژه اینترنتی P2P که در حال حاضر توسط تیم مستقر در Troon, Scotland توسعه یافته
* Lucidscape Mesh - یک موتور شبیه‌سازی توزیع شده بلادرنگ برای واقعیت مجازی
* Tor - یک شبکه ناشناس

## نصب و راه‌اندازی Rust
برای استفاده از زبان Rust، باید ابتدا کامپایلر آن که با نام `rustc` شناخته می‌شود، نصب شود. بهترین و توصیه‌شده‌ترین روش برای نصب Rust استفاده از ابزار خط فرمان `rustup` است. این ابزار مدیریت نسخه‌های مختلف Rust و ابزارهای جانبی آن را بر عهده دارد و امکان به‌روزرسانی، حذف و نصب آسان کامپایلر را فراهم می‌کند.

#### نصب بر روی لینوکس و macOS
در سیستم‌عامل‌های یونیکسی، می‌توان با اجرای دستور زیر در ترمینال، ابزار rustup و کامپایلر Rust را به‌سادگی نصب کرد:
```shell
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```
همچنین برای کامپایل صحیح برخی بسته‌ها که به کدهای C وابسته‌اند، وجود یک **کامپایلر C** مانند `GCC` یا `Clang` ضروری است. در توزیع‌هایی مانند Ubuntu توصیه می‌شود از دستور زیر برای نصب ابزارهای توسعه استفاده شود:
```shell
sudo apt install build-essential
```


#### نصب روی ویندوز
کاربران ویندوز می‌توانند با دانلود فایل نصب از وب‌سایت رسمی Rust یا اجرای دستور زیر در محیط PowerShell (در ویندوز ۱۰ یا ۱۱ که winget پشتیبانی می‌شود) اقدام به نصب کنند:
```shell
winget install rustup
```
در طول فرایند نصب ممکن است نیاز به نصب ابزارهای ساخت مانند **Build Tools for Visual Studio** باشد، مخصوصاً برای پشتیبانی از برخی بسته‌های وابسته به کد ++C.

#### به‌روزرسانی و حذف
ابزار `rustup` امکان به‌روزرسانی نسخه Rust و یا حذف کامل آن را فراهم می‌کند:

* به‌روزرسانی:

```shell
rustup update
```


* حذف:

```shell
rustup self uninstall
```


#### بررسی نصب موفق
برای اطمینان از نصب صحیح Rust، می‌توان دستور زیر را اجرا کرد:
```shell
rustc --version
```
که در صورت موفقیت، شماره نسخه نصب‌شده را نمایش می‌دهد.

#### مستندات محلی
پس از نصب Rust، یک نسخه از مستندات زبان نیز به صورت آفلاین بر روی سیستم قرار می‌گیرد. با اجرای دستور زیر، این مستندات در مرورگر باز می‌شوند:
```shell
rustup doc
```


## نمونه‌ها
نمونه کد زیر برای Rust نسخه ۰٫۸ معتبر می‌باشد. نحو و معناشناسی ممکن است در نسخه‌های بعدی تغییر یابد.برنامه Hello World:


```cpp
fn main() {
    println!("Hello, World");
}
```


دو نمونه از تابع فاکتوریل در ساختارهای بازگشتی و ترتیبی :

```rust
/* 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 recursive_factorial(n: i32) -> i32 {
    if n <= 1 { 1 }
    else { n * recursive_factorial(n - 1) }
}

fn iterative_factorial(n: i32) -> i32 {
    // Variables are declared with `let`.
    // The `mut` keyword allows these variables to be mutated.
    let mut i = 1;
    let mut result = 1;
    while i <= n {
        result *= i;
        i += 1;
    }
    return result; // An explicit return, in contrast to the prior function.
}

fn main() {
    println!("Recursive result: {:?}", recursive_factorial(10));
    println!("Iterative result: {:?}", iterative_factorial(10));
}
```


یک نمایش ساده از قابلیت همزمانی ساده از Rust:


```cpp
/* This function creates ten "tasks" that all execute concurrently. Run it
   several times and observe the irregular output that results as each task
   races on stdout, due to the fact that each task may yield both between
   successive calls to `println` and within the `println` function itself. */
fn main() {
    // This string is immutable, so it can safely be accessed from multiple tasks.
    let message = "Look at me, I'm in a lightweight thread!";
    // `for` loops work with any type that implements the `Iterator` trait.
    for num in range(0, 10) {
        do spawn {
            println(message);
            // `println!` is a macro that statically verifies a format string.
            // Macros are structural (as in Scheme) rather than textual (as in C).
            println!("This message brought to you by task {:?}.", num);
        }
    }
}
```
یک نمایش ساده از اشاره‌گرهای هوشمند یگانی همراه با tagged unions و روش‌ها:
```cpp
use IntList::{Node, Empty};

// This program defines a recursive data structure and implements methods upon it.
// Recursive data structures require a layer of indirection, which is provided here
// by a unique pointer, constructed via the `Box::new` constructor. These are
// analogous to the C++ library type `std::unique_ptr`, though with more static
// safety guarantees.
fn main() {
    let list = IntList::new().prepend(3).prepend(2).prepend(1);
    println!("Sum of all values in the list: {}.", list.sum());
    println!("Sum of all doubled values in the list: {}.", list.multiply_by(2).sum());
}

// `enum` defines a tagged union that may be one of several different kinds of values at runtime.
// The type here will either contain no value, or a value and a pointer to another `IntList`.
enum IntList {
    Node(i32, Box<IntList>),
    Empty
}

// An `impl` block allows methods to be defined on a type.
impl IntList {
    fn new() -> Box<IntList> {
        Box::new(Empty)
    }

    fn prepend(self, value: i32) -> Box<IntList> {
        Box::new(Node(value, Box::new(self)))
    }

    fn sum(&self) -> i32 {
        // `match` expressions are the typical way of employing pattern-matching,
        // and are somewhat analogous to the `switch` statement from C and C++.
        match *self {
            Node(value, ref next) => value + next.sum(),
            Empty => 0
        }
    }

    fn multiply_by(&self, n: i32) -> Box<IntList> {
        match *self {
            Node(value, ref next) => Box::new(Node(value * n, next.multiply_by(n))),
            Empty => Box::new(Empty)
        }
    }
}
```


## بدافزارها
در مواردی، نویسندگان بدافزار نیز از زبان برنامه‌نویسی راست استفاده کرده‌اند. برای مثال، باج‌افزار BlackCat به زبان راست برنامه‌نویسی شده‌است.

## منابع


رده:پروژه‌های نرم‌افزار آزاد
رده:زبان‌های برنامه‌نویسی ایستا
رده:زبان‌های برنامه‌نویسی تطبیق الگو
رده:زبان‌های برنامه‌نویسی رویه‌ای
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۲۰۱۵ (میلادی)
رده:زبان‌های برنامه‌نویسی ساخته‌شده در دهه ۲۰۱۰ (میلادی)
رده:زبان‌های برنامه‌نویسی سطح بالا
رده:زبان‌های برنامه‌نویسی سیستمی
رده:زبان‌های برنامه‌نویسی هم‌روند
رده:زبان‌های تابعی
رده:کامپایلرها و مفسرهای آزاد
رده:موزیلا
رده:نرم‌افزارهای ۲۰۱۰ (میلادی)
رده:نرم‌افزارهای دارای اجازه‌نامه ام‌آی‌تی
رده:نرم‌افزارهایی که از پروانه آپاچی استفاده می‌کنند