أقدم انتباهكم إلى ترجمة المنشور على الإصدار الجديد من لغة البرمجة المفضلة لدى الجميع 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 ، تم تثبيت 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
، اقرأ مقال نيك كاميرون . يتم وصف التغييرات الأخرى على البضائع بالتفصيل هنا .
تغييرات المكتبة
ماكرو dbg!
بدأت لدعم الحجج متعددة.
أصبحت بعض الأساليب ثابتة:
يتم تثبيت بعض واجهات برمجة التطبيقات ، بما في ذلك:
تغييرات أخرى
تتوفر أوصاف التغيير المفصلة في الإصدار 1.36.0 في Rust والمكتبة القياسية والشحن والبضائع .
الأعضاء 1.36.0
اجتمع الكثير من الأشخاص لإنشاء Rust 1.36.0. لا يمكن أن نفعل هذا بدونك جميعًا ، شكرًا !
من المترجم
مع أي أسئلة حول لغة Rust ، سيتمكنون من مساعدتك في دردشة Telegram باللغة الروسية أو في دردشة مماثلة للوافدين الجدد .