راست یک زبان برنامهنویسی مدرن سیستمها است که برای عملکرد، ایمنی و همزمانی طراحی شده است. این زبان به کاربران ویژگیهای قدرتمند زبانی ارائه میدهد و در عین حال تلاش میکند تا خطاهای رایج برنامهنویسی، مانند ارجاع به اشارهگرهای خالی و رقابتهای دادهای را از بین ببرد. راست بر انتزاعات بدون هزینه تأکید دارد و به توسعهدهندگان این امکان را میدهد که کدهای سطح بالا بنویسند بدون اینکه عملکرد را قربانی کنند. این زبان بهویژه برای کارهایی که نیاز به کنترل سطح پایین بر سختافزار و مدیریت حافظه دارند، مانند برنامهنویسی سیستمها، وباسمبلی و ایجاد برنامههای با عملکرد بالا، مناسب است.
راست در سال 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
در راست، مدیریت خطاهای قوی و پارادایمهای برنامهنویسی ایمن از نظر خالی را فراهم میکنند و به توسعهدهندگان این امکان را میدهند که بهطور صریح امکان عدم وجود یا خطا را بیان کنند.
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
}
راست دارای مجموعهای غنی از ابزارهای توسعهدهنده است، از جمله مدیر بسته آن، Cargo، که مدیریت وابستگیها، ساخت و انتشار کتابخانهها و برنامهها را تسهیل میکند. کتابخانه استاندارد راست پشتیبانی فراوانی برای وظایف مختلف فراهم میکند.
چندین IDE و ویرایشگر از توسعه راست پشتیبانی میکنند، از جمله:
برای ایجاد یک پروژه جدید راست، توسعهدهندگان میتوانند از Cargo با دستور زیر استفاده کنند:
cargo new my_project
این دستور یک دایرکتوری جدید حاوی ساختار پایه پروژه راست ایجاد میکند. برای ساخت پروژه، به سادگی به دایرکتوری پروژه بروید و اجرا کنید:
cargo build
راست به دلیل ویژگیهای عملکرد و ایمنی خود در حوزههای مختلفی مورد استفاده قرار میگیرد. کاربردهای کلیدی شامل:
راست اغلب با دیگر زبانهای برنامهنویسی سیستمها مقایسه میشود به دلیل تأکید بر عملکرد و ایمنی. در اینجا برخی مقایسهها آورده شده است:
ترجمه کد راست به زبانهای دیگر میتواند چالشبرانگیز باشد به دلیل مدل مالکیت منحصر به فرد و ویژگیهای پیشرفته آن. با این حال، برخی ابزارها ترجمههای منبع به منبع را تسهیل میکنند، مانند: