انتشار زبان برنامه نویسی همه منظوره Rust 1.61 که توسط پروژه موزیلا تأسیس شده است، اما اکنون تحت نظارت سازمان غیرانتفاعی مستقل Rust Foundation توسعه یافته است، منتشر شده است. این زبان بر ایمنی حافظه تمرکز میکند و ابزاری را برای دستیابی به موازی کاری بالا در عین اجتناب از استفاده از جمعآوری زباله و زمان اجرا فراهم میکند (زمان اجرا به مقدار اولیه اولیه و نگهداری کتابخانه استاندارد کاهش مییابد).
روشهای مدیریت حافظه Rust، توسعهدهنده را از خطا در هنگام دستکاری اشارهگرها نجات میدهد و از مشکلاتی که به دلیل مدیریت سطح پایین حافظه ایجاد میشود، محافظت میکند، مانند دسترسی به یک ناحیه حافظه پس از آزاد شدن، عدم ارجاع اشارهگرهای تهی، بیش از حد بافر و غیره. برای توزیع کتابخانه ها، ارائه ساخت و مدیریت وابستگی ها، این پروژه مدیر بسته Cargo را توسعه می دهد. مخزن crates.io برای میزبانی کتابخانه ها پشتیبانی می شود.
ایمنی حافظه در Rust در زمان کامپایل از طریق بررسی مرجع، پیگیری مالکیت شیء، پیگیری طول عمر شی (scopes) و ارزیابی صحت دسترسی به حافظه در طول اجرای کد ارائه می شود. Rust همچنین محافظت در برابر سرریز اعداد صحیح را فراهم می کند، به متغیرها نیاز دارد که قبل از استفاده مقداردهی اولیه شوند، خطاها را در کتابخانه استاندارد بهتر مدیریت می کند، مفهوم مراجع و متغیرهای غیرقابل تغییر را به طور پیش فرض اعمال می کند، و تایپ ثابت قوی برای به حداقل رساندن خطاهای منطقی ارائه می دهد.
نوآوری های اصلی:
- این امکان وجود دارد که کدهای بازگشتی خود را از تابع اصلی تعریف کنید. در اصل، تابع اصلی Rust فقط میتوانست نوع "()" (واحد) را برگرداند، که همیشه وضعیت خروج موفقیتآمیز را نشان میدهد، مگر اینکه توسعهدهنده به صراحت تابع "process::exit(code)" را فراخوانی کند. در Rust 1.26، با استفاده از ویژگی پایان ناپایدار در تابع اصلی، می توان مقادیر "Ok" و "Err" را که مربوط به کدهای EXIT_SUCCESS و EXIT_FAILURE در برنامه های C است، برگرداند. در Rust 1.61، صفت Termination پایدار شده است، و یک نوع ExitCode جداگانه برای نشان دادن یک کد بازگشتی خاص پیشنهاد شده است، که با ارائه هر دو ثابت از پیش تعریف شده SUCCESS و FAILURE، و روش From، انواع بازگشتی خاص پلت فرم را انتزاع می کند. برای بازگرداندن کد بازگشت سفارشی استفاده از std::process::ExitCode. fn main() -> ExitCode { if !check_foo() { return ExitCode::from(8); } ExitCode::SUCCESS }
- قابلیت های اضافی توابع تعریف شده با استفاده از عبارت "const fn" تثبیت شده است، که می تواند نه تنها به عنوان توابع منظم نامیده شود، بلکه در هر زمینه ای به جای ثابت استفاده می شود. این توابع در زمان کامپایل محاسبه میشوند، نه در زمان اجرا، بنابراین در معرض محدودیتهای خاصی هستند، مانند توانایی خواندن فقط از روی ثابتها. در نسخه جدید، عملیات پایه با اشاره گرهای تابع در داخل توابع const مجاز است (ایجاد، ارسال و ارسال اشاره گر مجاز است، اما فراخوانی یک تابع به نشانگر مجاز نیست). مرزهای صفت برای پارامترهای عمومی توابع const مانند T: Copy; صفات قابل توزیع پویا (dyn Trait); impl انواع Trait برای آرگومان های تابع و مقادیر بازگشتی.
- این استریم Stdin، Stdout و Stderr را در std::io کنترل میکند و اکنون زمانی که قفل است، یک عمر ثابت ("static") دارند، و ساختارهایی مانند "let out = std::io::stdout().lock();" با گرفتن یک دسته و تنظیم قفل در یک عبارت.
- بخش جدیدی از API به دسته پایدار منتقل شده است، از جمله روش ها و اجرای صفات تثبیت شده اند:
- پین::static_mut
- پین::static_ref
- Vec::retain_mut
- VecDeque::retain_mut
- برای مکان نما بنویسید<[u8; N]>
- std::os::unix::net::SocketAddr::from_pathname
- std::process::ExitCode
- std::process::خاتمه
- std::thread::JoinHandle::is_finished
- ویژگی "const" که امکان استفاده از آن را در هر زمینه ای به جای ثابت ها تعیین می کند، در توابع استفاده می شود:
- <*const T>::offset و <*mut T>::offset
- <*const T>::wrapping_offset و <*mut T>::wrapping_offset
- <*const T>::add و <*mut T>::add
- <*const T>::sub و <*mut T>::sub
- <*const T>::wrapping_add و <*mut T>::wrapping_add
- <*const T>::wrapping_sub و <*mut T>::wrapping_sub
- <[T]>::as_mut_ptr
- <[T]>::as_ptr_range
- <[T]>::as_mut_ptr_range
علاوه بر این، می توانید مقاله "Rust: A Critical Retrospective" را با خلاصه ای از برداشت های زبان Rust پس از نوشتن 100 هزار خط کد در آن در طول توسعه سیستم عامل میکروکرنل Xous مورد استفاده در سیستم عامل توجه کنید. معایب آن عبارتند از درک سینتکس دشوار، ناقص بودن و توسعه مداوم زبان، فقدان ساختهای قابل تکرار، مشکلات معمولی با اعتماد به وابستگی در Crates.io، و نیاز به حفظ نظم خاصی برای نوشتن کد امن. ویژگیهایی که فراتر از انتظارات هستند شامل ابزارهایی برای بازآفرینی کد و کار مجدد «هکهایی» است که در طول نمونهسازی سریع اضافه شدهاند.
منبع: opennet.ru