انتشار زبان برنامه نویسی همه منظوره Rust 1.60 که توسط پروژه موزیلا تأسیس شده است، اما اکنون تحت نظارت سازمان غیرانتفاعی مستقل Rust Foundation توسعه یافته است، منتشر شده است. این زبان بر ایمنی حافظه تمرکز میکند و ابزاری را برای دستیابی به موازی کاری بالا در عین اجتناب از استفاده از جمعآوری زباله و زمان اجرا فراهم میکند (زمان اجرا به مقدار اولیه اولیه و نگهداری کتابخانه استاندارد کاهش مییابد).
روشهای مدیریت حافظه Rust، توسعهدهنده را از خطا در هنگام دستکاری اشارهگرها نجات میدهد و از مشکلاتی که به دلیل مدیریت سطح پایین حافظه ایجاد میشود، محافظت میکند، مانند دسترسی به یک ناحیه حافظه پس از آزاد شدن، عدم ارجاع اشارهگرهای تهی، بیش از حد بافر و غیره. برای توزیع کتابخانه ها، ارائه ساخت و مدیریت وابستگی ها، این پروژه مدیر بسته Cargo را توسعه می دهد. مخزن crates.io برای میزبانی کتابخانه ها پشتیبانی می شود.
ایمنی حافظه در Rust در زمان کامپایل از طریق بررسی مرجع، پیگیری مالکیت شیء، پیگیری طول عمر شی (scopes) و ارزیابی صحت دسترسی به حافظه در طول اجرای کد ارائه می شود. Rust همچنین محافظت در برابر سرریز اعداد صحیح را فراهم می کند، به متغیرها نیاز دارد که قبل از استفاده مقداردهی اولیه شوند، خطاها را در کتابخانه استاندارد بهتر مدیریت می کند، مفهوم مراجع و متغیرهای غیرقابل تغییر را به طور پیش فرض اعمال می کند، و تایپ ثابت قوی برای به حداقل رساندن خطاهای منطقی ارائه می دهد.
نوآوری های اصلی:
- کامپایلر rustc دارای یک سیستم مبتنی بر LLVM تثبیت شده برای تولید داده های پوششی است که برای ارزیابی پوشش کد در طول آزمایش استفاده می شود. برای فعال کردن دادههای پوشش در طول مونتاژ، باید از پرچم "-Cinstrument-coverage" استفاده کنید، برای مثال، مونتاژ را با دستور "RUSTFLAGS="-C instrument-coverage" cargo build" شروع کنید. پس از اجرای فایل اجرایی که به این روش کامپایل شده است، فایل default.profraw در دایرکتوری فعلی ذخیره می شود که برای پردازش آن می توانید از ابزار llvm-profdata از کامپوننت llvm-tools-preview استفاده کنید. خروجی پردازش شده توسط llvm-profdata سپس می تواند به llvm-cov ارسال شود تا یک گزارش پوشش کد مشروح ایجاد کند. اطلاعات مربوط به پیوند به کد منبع از فایل اجرایی مورد بررسی گرفته شده است که شامل داده های لازم در مورد ارتباط بین شمارنده پوشش و کد است. 1| 1|fn main() { 2| 1| println! ("سلام، دنیا!"); 3| 1|}
- در مدیر بسته محموله، پشتیبانی از پرچم "-timings" تثبیت شده است، که شامل تولید یک گزارش دقیق از پیشرفت ساخت و زمان اجرای هر مرحله است. این گزارش ممکن است برای بهینه سازی عملکرد فرآیند مونتاژ مفید باشد.
- مدیر بسته محموله دستور جدیدی را برای مکانیسم کامپایل شرطی و انتخاب وابستگی های اختیاری ارائه می دهد که در فایل Cargo.toml با فهرست کردن لیستی از ویژگی های نامگذاری شده در بخش [ویژگی ها] پیکربندی شده و با فعال کردن ویژگی ها در طول ساخت بسته فعال می شود. با استفاده از پرچم "--features". نسخه جدید پشتیبانی از وابستگی ها در فضای نام جداگانه و وابستگی های ضعیف را اضافه می کند.
در حالت اول، می توان از عناصر با پیشوند "dep:" در داخل بخش "[ویژگی ها]" برای پیوند صریح به یک وابستگی اختیاری بدون نمایش ضمنی این وابستگی به عنوان یک ویژگی استفاده کرد. در مورد دوم، پشتیبانی برای علامت گذاری با علامت "؟" اضافه شده است. ("package-name?/feature-name") وابستگی های اختیاری که فقط در صورتی باید شامل شوند که برخی ویژگی های دیگر شامل وابستگی اختیاری داده شده باشد. به عنوان مثال، در مثال زیر، فعال کردن ویژگی serde، وابستگی "serde" و همچنین ویژگی "serde" را برای وابستگی "rgb" فعال می کند، اما تنها در صورتی که وابستگی "rgb" در جای دیگری فعال باشد: [وابستگی] serde = { version = " 1.0.133"، optional = true } rgb = { version = "0.8.25", optional = true } [ویژگی ها] serde = ["dep:serde"، "rgb?/serde"]
- پشتیبانی از کامپایل افزایشی، که در آخرین نسخه غیرفعال شده بود، بازگشته است. اشکال کامپایلر که باعث غیرفعال شدن این ویژگی شده بود برطرف شد.
- برخی از مشکلات با ارائه تایمرهای فوری با ضمانت زمان بندی یکنواخت، که زمان صرف شده توسط سیستم در حالت خواب را در نظر می گیرد، برطرف شد. قبلاً هر زمان که امکان داشت برای کار با تایمر از API OS استفاده می شد که موقعیت های مشکل زا که یکنواختی زمان را می شکند، مانند مشکلات سخت افزاری، استفاده از مجازی سازی یا خطاهای سیستم عامل را در نظر نمی گرفت.
- بخش جدیدی از API به دسته پایدار منتقل شده است، از جمله روش ها و اجرای صفات تثبیت شده اند:
- Arc::new_cyclic
- Rc::new_cyclic
- slice::EscapeAscii
- ::escape_ascii
- u8::escape_ascii
- Vec::spare_capacity_mut
- MaybeUninit::assume_init_drop
- MaybeUninit::assume_init_read
- i8::abs_diff
- i16::abs_diff
- i32::abs_diff
- i64::abs_diff
- i128::abs_diff
- isize::abs_diff
- u8::abs_diff
- u16::abs_diff
- u32::abs_diff
- u64::abs_diff
- u128::abs_diff
- usize::abs_diff
- نمایش برای io::ErrorKind
- از برای ExitCode
- نه برای ! (تایپ "هرگز")
- _Op_Assign
- arch::is_aarch64_feature_detected!
- سومین سطح پشتیبانی برای پلتفرم های mips64-openwrt-linux-musl* و armv7-unknown-linux-uclibceabi (softfloat) اجرا شده است. سطح سوم شامل پشتیبانی اولیه است، اما بدون آزمایش خودکار، انتشار بیلدهای رسمی یا بررسی اینکه آیا کد قابل ساخت است یا خیر.
- کامپایلر به استفاده از LLVM 14 تغییر یافته است.
علاوه بر این، می توانید توجه داشته باشید:
- پشتیبانی برای راهاندازی کامپایلر rustc با استفاده از باطن rustc_codegen_gcc، که به شما امکان میدهد از کتابخانه libgccjit از پروژه GCC بهعنوان یک تولیدکننده کد در rustc استفاده کنید، که به rustc اجازه میدهد تا از معماریها و بهینهسازیهای موجود در GCC پشتیبانی کند. ارتقاء کامپایلر به معنای توانایی استفاده از یک مولد کد مبتنی بر GCC در rustc برای ساخت خود کامپایلر rustc است. از جنبه کاربردی، این ویژگی به شما امکان می دهد برنامه های rust را برای معماری هایی بسازید که قبلاً در rustc پشتیبانی نمی شدند.
- انتشار جعبه ابزار uutils coreutils 0.0.13 در دسترس است، که در آن یک آنالوگ از بسته Coreutils گنو، بازنویسی شده به زبان Rust، در حال توسعه است. Coreutils با بیش از صد برنامه کاربردی از جمله sort، cat، chmod، chown، chroot، cp، date، dd، echo، hostname، id، ln و ls عرضه میشود. هدف این پروژه ایجاد یک پیادهسازی جایگزین بین پلتفرمی از Coreutils است که قابلیت اجرا بر روی پلتفرمهای Windows، Redox و Fuchsia و همچنین توزیع تحت مجوز مجاز MIT را به جای مجوز کپیلفت GPL داشته باشد.
نسخه جدید اجرای بسیاری از ابزارها را بهبود بخشیده است، از جمله سازگاری قابل توجهی از ابزارهای cp، dd، df، split و tr با همتایان خود در پروژه گنو. مستندات آنلاین ارائه شده است. تجزیهکننده clap برای تجزیه آرگومانهای خط فرمان استفاده میشود، که خروجی پرچم «--help» را بهبود بخشیده و از اختصارات دستورات طولانی پشتیبانی میکند (برای مثال، میتوانید «ls -col» را به جای «ls -color» مشخص کنید. ”).
منبع: opennet.ru