زبان برنامه نویسی Rust

مرور کلی

راست یک زبان برنامه‌نویسی مدرن سیستم‌ها است که برای عملکرد، ایمنی و همزمانی طراحی شده است. این زبان به کاربران ویژگی‌های قدرتمند زبانی ارائه می‌دهد و در عین حال تلاش می‌کند تا خطاهای رایج برنامه‌نویسی، مانند ارجاع به اشاره‌گرهای خالی و رقابت‌های داده‌ای را از بین ببرد. راست بر انتزاعات بدون هزینه تأکید دارد و به توسعه‌دهندگان این امکان را می‌دهد که کدهای سطح بالا بنویسند بدون اینکه عملکرد را قربانی کنند. این زبان به‌ویژه برای کارهایی که نیاز به کنترل سطح پایین بر سخت‌افزار و مدیریت حافظه دارند، مانند برنامه‌نویسی سیستم‌ها، وب‌اسمبلی و ایجاد برنامه‌های با عملکرد بالا، مناسب است.

جنبه‌های تاریخی

ایجاد و توسعه اولیه

راست در سال 2006 توسط گریتون هور در موزیلا ریسرچ تصور شد. هدف اولیه این زبان، پرداختن به چالش‌های توسعه نرم‌افزارهای ایمن و همزمان و ایجاد یک جایگزین قابل اعتمادتر برای زبان‌های برنامه‌نویسی سیستم‌های موجود بود. در سال 2010، اولین نسخه عمومی راست منتشر شد و به سرعت به خاطر رویکرد نوآورانه‌اش در زمینه ایمنی حافظه و همزمانی توجه‌ها را جلب کرد.

رابطه با زبان‌های دیگر

راست از چندین زبان برنامه‌نویسی الهام گرفته است، مانند C++ برای طراحی متمرکز بر عملکرد و زبان‌های برنامه‌نویسی تابعی برای تأکید بر عدم تغییرپذیری و انتزاعات قدرتمند. طراحی آن همچنین اصولی از زبان‌هایی مانند هسکل را منعکس می‌کند، به‌ویژه در سیستم نوع قوی و قابلیت‌های تطبیق الگو.

وضعیت کنونی

از زمان تأسیس، راست به یک زبان شناخته‌شده تبدیل شده است، با یک جامعه توسعه‌دهنده قوی و اکوسیستم کتابخانه‌ای در حال رشد. این زبان به‌طور رسمی توسط موزیلا پشتیبانی شده و در حوزه‌های مختلفی از جمله توسعه وب، سیستم‌های توکار و توسعه بازی‌ها به محبوبیت رسیده است. انتشار راست 1.0 در سال 2015 یک نقطه عطف مهم بود که ثبات و آمادگی آن برای استفاده در تولید را تثبیت کرد. بنیاد راست، که در سال 2021 تأسیس شد، از توسعه و مدیریت مستمر آن حمایت می‌کند.

ویژگی‌های نحوی

مالکیت و قرض‌گیری

مدل مالکیت منحصر به فرد راست به توسعه‌دهندگان این امکان را می‌دهد که حافظه را بدون یک جمع‌آوری‌کننده زباله مدیریت کنند. هر متغیر در راست یک مالک واحد دارد و مالکیت می‌تواند از طریق ارجاعات منتقل یا "قرض" گرفته شود. این ویژگی به تضمین ایمنی حافظه کمک می‌کند و قوانین سخت‌گیرانه‌ای برای قرض‌گیری را اعمال می‌کند.

fn main() {
    let s1 = String::from("سلام");
    let s2 = &s1; // قرض‌گیری از s1
    println!("{}", s2);
}

تطبیق الگو

تطبیق الگو در راست به توسعه‌دهندگان این امکان را می‌دهد که انواع داده‌ها را تجزیه کنند و جریان کنترل پیچیده را به‌طور یکپارچه مدیریت کنند. دستور match یک روش قدرتمند برای انشعاب منطق بر اساس الگوهای مقدار ارائه می‌دهد.

fn main() {
    let number = 4;
    match number {
        1 => println!("یک"),
        2 => println!("دو"),
        _ => println!("دیگر"),
    }
}

استنتاج نوع

راست از استنتاج نوع استفاده می‌کند و به کامپایلر این امکان را می‌دهد که به‌طور خودکار نوع متغیرها را استنباط کند، که کد را ساده‌تر و خوانایی را افزایش می‌دهد.

fn main() {
    let x = 5; // کامپایلر استنباط می‌کند که x از نوع i32 است
}

ویژگی‌ها

ویژگی‌ها مشابه رابط‌ها در زبان‌های دیگر هستند و اجازه می‌دهند تا چندریختی (پلی‌مورفیسم) ایجاد شود. آن‌ها رفتار مشترکی را تعریف می‌کنند که انواع می‌توانند پیاده‌سازی کنند.

trait Speak {
    fn speak(&self);
}

struct Dog;
impl Speak for Dog {
    fn speak(&self) {
        println!("ها ها!");
    }
}

انواع Option و Result

انواع Option و Result در راست، مدیریت خطاهای قوی و پارادایم‌های برنامه‌نویسی ایمن از نظر خالی را فراهم می‌کنند و به توسعه‌دهندگان این امکان را می‌دهند که به‌طور صریح امکان عدم وجود یا خطا را بیان کنند.

fn divide(x: f64, y: f64) -> Option<f64> {
    if y == 0.0 {
        None
    } else {
        Some(x / y)
    }
}

همزمانی

راست از همزمانی بدون ترس از طریق سیستم مالکیت خود پشتیبانی می‌کند و به چندین رشته اجازه می‌دهد تا بر روی داده‌ها با حداقل خطر رقابت داده‌ای عمل کنند.

use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("سلام از یک رشته!");
    });
    handle.join().unwrap();
}

ماکروها

سیستم ماکرو راست اجازه تولید کد را می‌دهد و این امکان را فراهم می‌کند که ساختارهای نحوی سفارشی نوشته شوند که می‌توانند در سراسر کد پایه دوباره استفاده شوند.

macro_rules! say_hello {
    () => {
        println!("سلام!");
    };
}

fn main() {
    say_hello!();
}

بستن

بستن‌ها در راست توابع ناشناخته‌ای هستند که می‌توانند متغیرها را از محیط خود بگیرند و آن‌ها را برای پارادایم‌های برنامه‌نویسی تابعی انعطاف‌پذیر می‌سازند.

fn main() {
    let add = |a, b| a + b;
    println!("{}", add(5, 7));
}

ماژول‌ها و کرت‌ها

راست از یک سیستم ماژول برای سازماندهی کد و کنترل دید استفاده می‌کند. کرت‌ها بسته‌های کد راست هستند که می‌توانند به اشتراک گذاشته و دوباره استفاده شوند.

mod my_module {
    pub fn hello() {
        println!("سلام از my_module!");
    }
}

fn main() {
    my_module::hello();
}

مستندسازی

راست دارای ویژگی‌های مستندسازی داخلی است و ابزار Rustdoc به‌طور خودکار مستندات را از نظرات در کد منبع تولید می‌کند.

/// این تابع دو عدد را جمع می‌کند.
/// 
/// # مثال‌ها
///
/// ```
/// let result = add(2, 3);
/// assert_eq!(result, 5);
/// ```
fn add(a: i32, b: i32) -> i32 {
    a + b
}

ابزارهای توسعه‌دهنده، زمان‌های اجرا و IDEها

ابزارها و زمان‌های اجرا

راست دارای مجموعه‌ای غنی از ابزارهای توسعه‌دهنده است، از جمله مدیر بسته آن، Cargo، که مدیریت وابستگی‌ها، ساخت و انتشار کتابخانه‌ها و برنامه‌ها را تسهیل می‌کند. کتابخانه استاندارد راست پشتیبانی فراوانی برای وظایف مختلف فراهم می‌کند.

IDEهای محبوب

چندین IDE و ویرایشگر از توسعه راست پشتیبانی می‌کنند، از جمله:

ساخت یک پروژه

برای ایجاد یک پروژه جدید راست، توسعه‌دهندگان می‌توانند از Cargo با دستور زیر استفاده کنند:

cargo new my_project

این دستور یک دایرکتوری جدید حاوی ساختار پایه پروژه راست ایجاد می‌کند. برای ساخت پروژه، به سادگی به دایرکتوری پروژه بروید و اجرا کنید:

cargo build

کاربردهای راست

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

مقایسه با زبان‌های دیگر

راست اغلب با دیگر زبان‌های برنامه‌نویسی سیستم‌ها مقایسه می‌شود به دلیل تأکید بر عملکرد و ایمنی. در اینجا برخی مقایسه‌ها آورده شده است:

نکات ترجمه منبع به منبع

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