انتشار زبان برنامه نویسی همه منظوره Rust 1.75 که توسط پروژه موزیلا تأسیس شده است، اما اکنون تحت نظارت سازمان غیرانتفاعی مستقل Rust Foundation توسعه یافته است، منتشر شده است. این زبان بر ایمنی حافظه تمرکز میکند و ابزاری را برای دستیابی به موازی کاری بالا در عین اجتناب از استفاده از جمعآوری زباله و زمان اجرا فراهم میکند (زمان اجرا به مقدار اولیه اولیه و نگهداری کتابخانه استاندارد کاهش مییابد).
روشهای مدیریت حافظه Rust، توسعهدهنده را از خطا در هنگام دستکاری اشارهگرها نجات میدهد و از مشکلاتی که به دلیل مدیریت سطح پایین حافظه ایجاد میشود، محافظت میکند، مانند دسترسی به یک ناحیه حافظه پس از آزاد شدن، عدم ارجاع اشارهگرهای تهی، بیش از حد بافر و غیره. برای توزیع کتابخانه ها، ارائه ساخت و مدیریت وابستگی ها، این پروژه مدیر بسته Cargo را توسعه می دهد. مخزن crates.io برای میزبانی کتابخانه ها پشتیبانی می شود.
ایمنی حافظه در Rust در زمان کامپایل از طریق بررسی مرجع، پیگیری مالکیت شیء، پیگیری طول عمر شی (scopes) و ارزیابی صحت دسترسی به حافظه در طول اجرای کد ارائه می شود. Rust همچنین محافظت در برابر سرریز اعداد صحیح را فراهم می کند، به متغیرها نیاز دارد که قبل از استفاده مقداردهی اولیه شوند، خطاها را در کتابخانه استاندارد بهتر مدیریت می کند، مفهوم مراجع و متغیرهای غیرقابل تغییر را به طور پیش فرض اعمال می کند، و تایپ ثابت قوی برای به حداقل رساندن خطاهای منطقی ارائه می دهد.
نوآوری های اصلی:
- قابلیت استفاده از "async fn" و نماد "->impl Trait" در صفات خصوصی اضافه شده است. به عنوان مثال، با استفاده از "->impl Trait" می توانید یک متد ویژگی بنویسید که یک تکرار کننده را برمی گرداند: trait Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator {self.items.iter().cloned() } }
شما همچنین می توانید با استفاده از "async fn" صفات ایجاد کنید: trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // به: // fn fetch(&self, url: Url) -> impl Future; }
- API برای محاسبه افست بایت نسبت به اشاره گرها اضافه شده است. هنگام کار با نشانگرهای خالی ("*const T" و "*mut T")، ممکن است عملیاتی برای اضافه کردن یک افست به اشاره گر مورد نیاز باشد. قبلاً، برای این کار، میتوان از ساختاری مانند «::add(1)» استفاده کرد و تعداد بایتهای مربوط به اندازه «size_of::()» را اضافه کرد. API جدید این عملیات را ساده می کند و امکان دستکاری افست بایت ها را بدون فرستادن انواع به "*const u8" یا "*mut u8" ممکن می سازد.
- اشاره گر::byte_add
- اشاره گر::byte_offset
- اشاره گر::byte_offset_from
- اشاره گر::byte_sub
- اشاره گر::wrapping_byte_add
- اشاره گر::wrapping_byte_offset
- اشاره گر::wrapping_byte_sub
- کار برای افزایش عملکرد کامپایلر rustc ادامه یافت. بهینه ساز BOLT اضافه شد که در مرحله پس از پیوند اجرا می شود و از اطلاعات یک نمایه اجرایی از پیش آماده شده استفاده می کند. استفاده از BOLT به شما امکان می دهد تا با تغییر طرح کد کتابخانه librustc_driver.so برای استفاده کارآمدتر از حافظه نهان پردازنده، سرعت اجرای کامپایلر را حدود 2% افزایش دهید.
شامل ساخت کامپایلر rustc با گزینه "-Ccodegen-units=1" برای بهبود کیفیت بهینه سازی در LLVM. تست های انجام شده افزایش عملکرد را در مورد ساخت "-Ccodegen-units=1" تقریباً 1.5٪ نشان می دهد. بهینه سازی های اضافه شده به طور پیش فرض فقط برای پلتفرم x86_64-unknown-linux-gnu فعال هستند.
بهینهسازیهایی که قبلاً ذکر شد توسط Google برای کاهش زمان ساخت اجزای پلتفرم اندروید نوشته شده در Rust آزمایش شدند. استفاده از "-C codegen-units=1" در هنگام ساخت اندروید به ما این امکان را داد که اندازه جعبه ابزار را 5.5٪ کاهش دهیم و عملکرد آن را 1.8٪ افزایش دهیم، در حالی که زمان ساخت خود جعبه ابزار تقریباً دو برابر شد.
فعال کردن جمعآوری زباله در زمان پیوند ("--gc-sections") افزایش عملکرد را تا 1.9٪، فعال کردن بهینهسازی زمان پیوند (LTO) تا 7.7٪، و بهینهسازی مبتنی بر پروفایل (PGO) را تا 19.8٪ افزایش داد. در پایان، بهینهسازیهایی با استفاده از ابزار BOLT اعمال شد که امکان افزایش سرعت ساخت تا 24.7٪ را فراهم کرد، اما اندازه جعبه ابزار 10.9٪ افزایش یافت.
- بخش جدیدی از API به دسته پایدار منتقل شده است، از جمله روش ها و اجرای صفات تثبیت شده اند:
- اتمی*::from_ptr
- فایل تایمز
- FileTimesExt
- فایل::set_modified
- فایل::set_times
- IPAddr::to_canonical
- Ipv6Addr::to_canonical
- گزینه::as_slice
- گزینه::as_mut_slice
- اشاره گر::byte_add
- اشاره گر::byte_offset
- اشاره گر::byte_offset_from
- اشاره گر::byte_sub
- اشاره گر::wrapping_byte_add
- اشاره گر::wrapping_byte_offset
- اشاره گر::wrapping_byte_sub
- ویژگی "const" که امکان استفاده از آن را در هر زمینه ای به جای ثابت ها تعیین می کند، در توابع استفاده می شود:
- Ipv6Addr::to_ipv4_mapped
- MaybeUninit::assume_init_read
- MaybeUninit::zeroed
- mem::متمیز
- mem:: صفر شد
- سطح سوم پشتیبانی برای پلتفرم های csky-unknown-linux-gnuabiv2hf، i586-unknown-netbsd و mipsel-unknown-netbsd اجرا شده است. سطح سوم شامل پشتیبانی اولیه است، اما بدون آزمایش خودکار، انتشار بیلدهای رسمی و تأیید قابلیت ساخت کد.
علاوه بر این، میتوان به نسخه جدیدی از پروژه Hermit اشاره کرد که یک هسته تخصصی (unikernel) را ایجاد میکند که به زبان Rust نوشته شده است و ابزارهایی را برای ساختن برنامههای کاربردی مستقلی ارائه میکند که میتوانند در بالای یک Hypervisor یا سختافزار بدون لایههای اضافی اجرا شوند. و بدون سیستم عامل هنگامی که برنامه ساخته می شود، به طور ایستا به یک کتابخانه مرتبط می شود، که به طور مستقل تمام عملکردهای لازم را بدون اتصال به هسته سیستم عامل و کتابخانه های سیستم اجرا می کند. کد پروژه تحت مجوزهای Apache 2.0 و MIT توزیع شده است. اسمبلی برای اجرای مستقل برنامه های نوشته شده در Rust، Go، Fortran، C و C++ پشتیبانی می شود. این پروژه همچنین در حال توسعه بوت لودر خود است که به شما امکان می دهد Hermit را با استفاده از QEMU و KVM راه اندازی کنید.
منبع: opennet.ru