פרסום שפת התכנות למטרות כלליות Rust 1.82, שנוסדה על ידי פרויקט מוזילה, אך פותחה כעת בחסות העמותה העצמאית Rust Foundation. השפה מתמקדת בבטיחות זיכרון ומספקת את האמצעים להשגת מקביליות עבודה גבוהה תוך הימנעות משימוש באספן אשפה וזמן ריצה (זמן הריצה מצטמצם לאתחול ותחזוקה בסיסיים של הספרייה הסטנדרטית).
שיטות הטיפול בזיכרון של Rust חוסכות מהמפתח שגיאות בעת מניפולציה של מצביעים ומגינות מפני בעיות המתעוררות עקב טיפול בזיכרון ברמה נמוכה, כגון גישה לאזור זיכרון לאחר שחרורו, זיהוי מצביעי null, חריגות מאגר וכו'. כדי להפיץ ספריות, לספק בנייה ולנהל תלות, הפרויקט מפתח את מנהל החבילות Cargo. מאגר crates.io נתמך לאירוח ספריות.
בטיחות זיכרון מסופקת ב-Rust בזמן הקומפילציה באמצעות בדיקת הפניות, מעקב אחר בעלות על אובייקט, מעקב אחר משך חיים של אובייקט (סקופים), והערכת נכונות הגישה לזיכרון במהלך ביצוע קוד. Rust מספקת גם הגנה מפני הצפת מספרים שלמים, דורשת אתחול חובה של ערכי משתנים לפני השימוש, מטפלת בשגיאות טוב יותר בספרייה הסטנדרטית, מיישמת את הרעיון של הפניות ומשתנים בלתי ניתנים לשינוי כברירת מחדל, מציעה הקלדה סטטית חזקה כדי למזער שגיאות לוגיות.
חידושים עיקריים:
- הפקודה "מידע" נוספה למנהל חבילות המטען כדי להציג מידע על חבילה במאגר.
- נוספה תמיכה בתחביר "שימוש<..>" ב-"impl Trait", המציין מידע על סוגים נסתרים. לדוגמה, "impl Trait + use<'x, T>" מציין שרק הפרמטרים "x" ו-"T" מותרים לשימוש בסוג מוסתר.
- הוצע תחביר נפרד ליצירת מצביעים גולמיים, המחליף פקודות מאקרו שהיו בשימוש בעבר: המאקרו "addr_of!(expr)" הוחלף באופרטור "&raw const expr", והמאקרו "addr_of_mut!(expr)" הוחלף. על ידי האופרטור "&raw mut" expr". struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // דרך ישנה ליצור מצביע גולמי תן ptr = std::ptr::addr_of!(p.not_aligned_field); // דרך חדשה ליצור מצביע גולמי תן ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
- כעת ניתן להגדיר פונקציות בטוחות וקבועים עם אורך חיים 'סטטי' בתוך בלוקים חיצוניים עם התכונה "לא בטוח" (בעבר, כל האלמנטים בתכונה "לא בטוחה" יכלו לקבל רק את התכונה "לא בטוחה"): לא בטוח חיצוני { פאב בטוח סטטי TAU : f64; פאב בטוח fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
- התכונות no_mangle, link_section ו-export_name, שעלולות להוביל להתנהגות לא מוגדרת, נחשבות כעת לא בטוחות ודורשות דגל מפורש "לא בטוח", לדוגמה: #[unsafe(no_mangle)] pub fn my_global_function() { }
- התאמת דפוסים מאפשרת לדלג על סוגים ריקים, כגון "enum Void {}" או מבנים עם שדה ריק גלוי. השתמש ב-std::convert::Infallible; pub fn unwrap_without_panic (x: תוצאה ) -> T { let Ok(x) = x; // ניתן לדלג על "שגיאה" x }
- לסוגים של מספרי נקודה צפה (f32 ו-f64) יש התנהגות סטנדרטית בעת עיבוד ערכי NaN שאינם מספריים (0.0/0.0), ומאפשרים גם שימוש בפעולות נקודה צפה ב-const fn.
- תוספות הרכבה מספקות את היכולת להשתמש באופרנדים עם התכונה "const" כדי להשתמש ישירות בערכים מספריים שלמים מבלי לאחסן אותם תחילה באוגר. const MSG: &str = "שלום עולם!\n"; unsafe { core::arch::asm!( "mov rdx, {LEN} // תיווצר ההוראה 'mov rdx, 14′", LEN = const MSG.len(), … ); }
- התייחסות לביטויים עם התכונה "static" מותרת בהקשר בטוח מבלי להגדיר בלוק לא בטוח (האופרטורים "&raw mut" ו-"&raw const" אינם משפיעים על הערך של האופרנד ורק יוצרים מצביע אליו): static mut STATIC_MUT: Type = Type::new( ); extern "C" { סטטי EXTERN_STATIC: סוג; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; תן extern_static_ptr = &raw const EXTERN_STATIC; }
- חלק חדש של ה-API הועבר לקטגוריה של יציב, כולל השיטות והיישום של תכונות התייצבו:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::offset
- std::option::Option::is_none_or
- [T]:: מסודר
- [T]::ממוין_לפי
- [T]::ממוין_לפי_מפתח
- Iterator::is_sorted
- Iterator::is_sorted_by
- Iterator::is_sorted_by_key
- std::future::Ready::into_inner
- std::iter::repeat_n
- impl DoubleEndedIterator for Take
מקור: OpenNet.ru
