صدأ 1.36.0 الإصدار: سمة المستقبل ، وتخصيص التخصيص و MaybeUninit

أقدم انتباهكم إلى ترجمة المنشور على الإصدار الجديد من لغة البرمجة المفضلة لدى الجميع Rust .


مقدمة


يسر فريق لغة برمجة Rust الإعلان عن إصدار جديد ، 1.36.0. Rust هي لغة برمجة تتيح للجميع تطوير برامج موثوقة وسريعة.


إذا قمت بتثبيت الإصدار السابق من Rust باستخدام rustup ، فلن يكون الحصول على الإصدار الحالي أمرًا صعبًا:


 $ rustup update stable 

إذا كنت لا تزال غير rustup ، فيمكنك الحصول عليها من الصفحة المقابلة على موقعنا. تتوفر مراجعة مفصلة لهذا الإصدار على جيثب.


ما هو مدرج في نسخة مستقرة؟


لقد أجرى هذا الإصدار العديد من التغييرات ، بما في ذلك تثبيت سمة Future طال انتظارها ، MaybeUninit<T> alloc ، و MaybeUninit<T> ، و NLL Rust 2015 ، وتطبيق جديد لـ HashMap<K, V> ودعم علامة --offline في Cargo.


يتم وصف أهم التغييرات أدناه ، ومع ذلك يمكنك أيضًا الاطلاع على قائمة مفصلة بالابتكارات لمزيد من الوعي.


الاستقرار في المستقبل


استقر الصدأ 1.36.0 Future الذي طال انتظاره!


نأمل أن يسمح هذا الابتكار .await والمكتبات والنظام الإيكولوجي بأكمله بالتحضير .await async / .await ، الذي من المقرر أن يستقر في المستقبل القريب.


توزيع رف التثبيت


قبل الإصدار 1.36.0 ، كانت المكتبة القياسية تتألف من proc_macro std و core و proc_macro . كان core الأساسي وظائف أساسية (مثل Iterator و Copy ) ، ويمكن استخدامه في البيئات التي بها #![no_std] ، لأنه لم يفرض أي متطلبات. في هذه الأثناء ، قدم صندوق std أنواعاً مثل Box<T> ، فضلاً عن وظائف نظام التشغيل (المخصص العالمي).


بدءًا من Rust 1.36.0 ، أصبحت مكونات الصندوق std ، التي تعتمد على المُخصص العالمي ، على سبيل المثال ، Vec<T> ، متاحة الآن في alloc التخصيص. وفي الوقت نفسه ، يعيد std تصدير هذه المكونات.


في حين أن برامج #![no_std] تستخدم صندوق alloc ما زالت تحتاج إلى القناة nightly ، #![no_std] c #![no_std] يمكن أن تستخدم alloc في Rust ثابت.


نلاحظ أيضًا أن جميع البرامج "العادية" (بدون #![no_std] ) في #![no_std] قادرة على احتواء المكتبات الموضحة أعلاه #![no_std] . نأمل أن يساعد هذا في تطوير نظام بيئي متوافق مع #![no_std] .


إذا كنت مطورًا لمكتبة تتطلب تخصيص وظائف أولية ، نوصي #![no_std] مكتبتك على أنها متوافقة مع #![no_std] باستخدام بناء الجملة التالي في بداية ملف lib.rs :


 #![no_std] extern crate alloc; use alloc::vec::Vec; 

MaybeUninit place mem :: غير مهيأ


في الإصدارات السابقة من Rust ، سمحت لك الوظيفة mem::uninitialized بإلغاء اختبارات التهيئة لأنها تعتقد أنك تمت تهيئة تهيئتها بالفعل لنوع T دون القيام بأي شيء. أحد استخدامات هذه الوظيفة هو التوزيع "البطيء" للصفائف.


ومع ذلك ، mem::uninitalized هي عملية خطيرة للغاية لا يمكن استخدامها بشكل صحيح مع برنامج التحويل البرمجي Rust ، على افتراض أن جميع القيم تتم تهيئتها بشكل صحيح.


على سبيل المثال ، يؤدي استدعاء mem::uninitialized::<bool>() إلى حدوث سلوك غير محدد على الفور ، نظرًا لأن وجهة النظر من Rust ، تكون البتات غير المهيأة إما صفرية ( false ) أو وحدة ( true ) ، ونوعان فقط من الأنماط المذكورة أعلاه مناسبة لنوع bool .


لحل هذا الموقف ، تم تثبيت النوع MaybeUninit<T> في Rust 1.36.0. المحول البرمجي Rust لم يعد يفترض MaybeUninit<T> هو نوع تهيئة T وبهذه الطريقة ، يمكنك إجراء التهيئة التدريجية بشكل أكثر أمانًا وأخيرًا استخدام .assume_init() عندما تكون متأكدًا من أن maybe_t: MaybeUninit<T> تحتوي على maybe_t: MaybeUninit<T> نوع التهيئة T


نظرًا لأن MaybeUninit<T> هو بديل أكثر أمانًا يبدأ بـ Rust 1.38 ، سيتم تمييز الدالة mem::uninitialized .


لمعرفة المزيد حول الذاكرة غير المهيأة ، mem::uninitialized و MaybeUninit<T> mem::uninitialized MaybeUninit<T> ، اقرأ المقال الذي كتبه Alexis Bessessner . تحتوي المكتبة القياسية أيضًا على وثائق كافية حول MaybeUninit<T> .


NLL for Rust 2015


في الإعلان عن Rust 1.31.0 ، أخبرناك عن NLL (الجداول الزمنية للحياة غير المعجمية) ، وهو ابتكار في اللغة يجعل وحدة التحكم في الارتباط (مدقق الاقتراض) أكثر ذكاءً وودية. على سبيل المثال ، يمكنك الآن كتابة مثل هذا:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; //     1.31.0 } 

عند 1.31.0 ، تم تثبيت NLL فقط في Rust 2018 ، وكان من المفترض أننا سننقله إلى Rust 2015 في المستقبل. تم ذلك في Rust 1.36.0 ، وأصبح NLL متاحًا في Rust 2015.


مع دعم NLL في كلا الإصدارين ، نقترب من إزالة وحدة تحكم الرابط القديم. ومع ذلك ، وحدة تحكم الارتباط القديمة ، للأسف ، قبلت رمز غير صحيح ، والتي ينبغي أن لا يكون مقبولا.


ونتيجة لذلك ، أصبحت NLL الآن في مرحلة "الترحيل" ، حيث سنصدر تحذيرات بدلاً من الأخطاء إذا لم توافق وحدة التحكم في ارتباط NLL على رمز من شأنه الموافقة على وحدة تحكم الارتباط القديمة المستندة إلى AST . ننصحك بالاطلاع على قائمة الصناديق العامة المتأثرة .


لمعرفة المزيد حول NLL ، MIR ، وكيفية حل مشكلات النزاهة ذات الصلة ، وما الذي يمكن عمله بتحذيرات برنامج التحويل البرمجي التي تظهر ، اقرأ مقالة Felix Klok .


تطبيق HashMap الجديد


في Rust 1.36.0 ، تم استبدال التطبيق السابق لـ HashMap<K, V> hashbrown hashbrown يعتمد على SwissTable design. تظل الواجهة كما هي ، لكن التنفيذ الحالي أسرع في المتوسط ويستهلك ذاكرة أقل. ومع ذلك ، لاحظ أن التطبيق القياسي لا يزال يستخدم خوارزمية SipHash 1-3 .


- دعم حاليا في البضائع


أثناء معظم عمليات الإنشاء ، لا يستخدم Cargo شبكتك. ومع ذلك ، في بعض النقاط ، على سبيل المثال ، عند إضافة تبعية جديدة ، ستظل Cargo تحاول الوصول إلى الشبكة. في بعض الأحيان يكون هذا السلوك غير مقبول (في نظام معزول أو في طائرة).


1.36.0 الصدأ قد استقر العلم الجديد - غير --offline . تتجاوز هذه العلامة خوارزمية دقة التبعية ، بدلاً من ذلك باستخدام التبعيات المخزنة مؤقتًا المحلية.


إذا لم تكن الصناديق المطلوبة متوفرة دون وجود شبكة تم قطع اتصالها ، فسيتم إنهاء الشحن مع وجود خطأ. لتعبئة ذاكرة التخزين المؤقت المحلية مسبقًا قبل مغادرة الشبكة ، استخدم الأمر cargo fetch ، الذي يقوم بتحميل جميع التبعيات اللازمة لمشروع معين.


لمعرفة المزيد حول - cargo fetch ، اقرأ مقال نيك كاميرون . يتم وصف التغييرات الأخرى على البضائع بالتفصيل هنا .


تغييرات المكتبة



تغييرات أخرى


تتوفر أوصاف التغيير المفصلة في الإصدار 1.36.0 في Rust والمكتبة القياسية والشحن والبضائع .


الأعضاء 1.36.0


اجتمع الكثير من الأشخاص لإنشاء Rust 1.36.0. لا يمكن أن نفعل هذا بدونك جميعًا ، شكرًا !


من المترجم


مع أي أسئلة حول لغة Rust ، سيتمكنون من مساعدتك في دردشة Telegram باللغة الروسية أو في دردشة مماثلة للوافدين الجدد .


Source: https://habr.com/ru/post/ar458848/


All Articles