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

راست یک زبان برنامه‌نویسی ترجمه شده، عام منظوره و چند الگویی است که توسط تحقیقات موزیلا توسعه یافته است. این زبان طراحی شده است تا یک زبان مطمئن، همسو و عملی باشد که مدل‌های تابعی خالص، امری-رویه‌ای و شی گرا را پشتیبانی می‌کند.
زبان از یک پروژه شخصی توسط توسعه دهنده Graydon Hoare به وجود آمد، که او کار بر روی آن را در سال ۲۰۰۶ آغاز کرد؛ کارفرمای او موزیلا، در سال ۲۰۰۹ درگیر این پروژه شد و رسما آن را برای اولین بار در سال ۲۰۱۰ پرده برداری کرد. در همان سال، کار از کامپایلرهای اولیه (نوشته شده در OCaml) خود را به کامپایلر خود میزبان نوشته شده در Rust تغییر داد. چیزی که به عنوان rustc شناخته شد، با موفقیت خود را در سال ۲۰۱۱ کامپایل کرد. کامپایلر خود میزبان از LLVM به عنوان backend استفاده می‌کند.اولین نسخه از کامپایلر Rust، که آلفا نام گذاری شد در ژانویه ۲۰۱۲ منتشر شد. نسخه فعلی (نسخه ۰٫۸)، در سپتامبر ۲۰۱۳ منتشر شده است. Rust به طور کامل در بازخورد باز و همکاری و کمک از جامعه توسعه یافته است. طراحی این زبان از طریق تجربه حاصل از نوشتن موتور چیدمان Servo اصلاح شده و Rust خودش را کامپایل کرده است. اگر چه توسعه آن با حمایت مالی موزیلا و سامسونگ بوده است، اما یک پروژه اجتماعی است. بخش بزرگی از تصدیقات نسخه فعلی از اعضای جامعه می‌باشد.
توصیف
هدف Rust این است که یک زبان خوب برای ایجاد مجموعه بزرگی از مشتری‌ها و سرور برنامه‌هایی که بر روی اینترنت اجرا می‌شوند باشد. این امر زیان را به یکی از ویژگی‌های مجموعه با تاکید بر ایمنی، کنترل از طرح حافظه و همزمانی هدایت می‌کند.
اگر عملکرد زبان تنها عامل مورد توجه باشد، عملکرد قابل اطمینان بودن کد همان‌طور که انتظار می‌رود آن را کندتر از ++C می‌کند اما پیشگیری‌های از پیش تعریف شده در Rust با احتساب اقدامات محتاطانه‌ای که زبان ++C به طور دستی انجام می‌دهد، از نظر سرعت برابری می‌کند (و یا حتی سریعتر است) نحو زبان Rust مشابه C و ++C است؛ با بلاک‌هایی از کد که بین آکولادها محدود شده است و کلمات کلیدی کنترل جریان مانند while ,do ,else ,if و for. البته تمام کلمات کلیدی C و ++C وجود ندارد اما به هر حال دیگران (مانند تطابق واژه کلیدی برای انشعاب چند جهت) برای برنامه نویسانی که از این زبان‌ها می‌آیند کمتر آشنا خواهد بود. با وجود شباهت نحوی،Rust از نظر معنایی با C و C + + متفاوت است.
پروژه‌هایی که از Rust استفاده می‌کنند
پروژه‌های توسعه یافته در Rust شامل:
مبتنی بر مرورگر:
Firefox
Servo - موتور جستجوی وب موازی جدید موزیلا که با همکاری سامسونگ توسعه یافته است
Quantum - یک پروژه متشکل از چندین زیرپروژه برای بهبود موتور مرورگر وب Gecko در Firefox توسعه یافته توسط Mozilla
مبتنی بر ابزار ساخت:
Cargo - سیستم ساخت خودکار Rust
Habitat - یک ابزار ساخت و استقرار از شرکت Chef Software ( )
پروژه‌های دیگر:
Magic Pocket - سیستم فایل Dropbox که قدرت ماشین‌های حافظه Diskotech petabyte را افزایش می‌دهد
OpenDNS - بکارگیری زبان Rust در دو مولفه OpenDNS
Redox OS - یک سیستم عامل ریزهسته
Piston - یک موتور بازی ( )
OnePush - یک سیستم اعلان رسانی توسعه یافته توسط OneSignal
REmacs - یک پورت از Emacs به Rust
MAIDsafe - پروژه اینترنتی P2P که در حال حاضر توسط تیم مستقر در Troon, Scotland توسعه یافته
- یک موتور شبیه‌سازی توزیع شده بلادرنگ برای واقعیت مجازی
Tor - یک شبکه ناشناس
نمونه‌ها
نمونه کد زیر برای Rust نسخه ۰٫۸ معتبر می‌باشد. نحو و معناشناسی ممکن است در نسخه‌های بعدی را تغییر یابد.برنامه Hello World:
fn main() {
println!("Hello, World");
دو نمونه از تابع فاکتوریل در ساختارهای بازگشتی و ترتیبی :
/* The branches in this function exhibit Rusts optional implicit return
values, which can be utilized where a more "functional" style is preferred.
Unlike C++ and related languages, Rusts `if` construct is an expression
rather than a statement, and thus has a return value of its own. */
fn recursive_factorial(n: int) -> int {
if n int {
// Variables are declared with `let`.
// The `mut` keyword allows these variables to be mutated.
let mut i = 1;
let mut result = 1;
while i
Box {
Box::new(Empty)
fn prepend(self, value: i32) -> Box {
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 {
match *self {
Node(value, ref next) => Box::new(Node(value * n, next.multiply_by(n))),
Empty => Box::new(Empty)