1.32 الصدأ الإصدار

يسر فريق تطوير Rust الإعلان عن إصدار نسخة جديدة من Rust ، 1.32.0. Rust هي لغة برمجة تمكن الجميع من إنشاء برامج موثوقة وفعالة.


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


 $ rustup update stable 

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


ملاحظة rustup : تم rustup العديد من إصدارات rustup الجديدة rustup ! لتحديث rustup نفسه ، هل rustup self update .

ما هو مدرج في الإصدار المستقر 1.32.0


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


ديسيبل ماكرو


لنبدأ بتحسين معزز للحياة. هل تستخدم تصحيح الطباعة؟ إذا كان الأمر كذلك ، وتريد طباعة بعض القيمة أثناء العمل على الكود ، فأنت مضطر للقيام بذلك:


 let x = 5; println!("{:?}", x); //    println!("{:#?}", x); 

ليست هذه هي العقبة الكبرى التي تؤدي إلى إبطاء عملية التطوير ، ولكن الأمر يتطلب الكثير من الجهد لتصحيح أخطاء إخراج القيمة x . بالإضافة إلى ذلك ، لا يتم أخذ السياق في الاعتبار هنا. إذا كان لديك العديد من هذه println! s ، يصبح من الصعب تحديد ما يشير إليه الإخراج ، حتى تضيف بنفسك معلومات السياق إلى كل مكالمة ، مما يتطلب المزيد من العمل.


لهذه الأغراض ، في Rust 1.32.0 أضفنا dbg ماكرو جديد! :


 fn main() { let x = 5; dbg!(x); } 

بعد بدء هذا البرنامج ، سترى:


 [src/main.rs:4] x = 5 

جنبا إلى جنب مع اسم المتغير وقيمته ، سيتم عرض اسم الملف ورقم السطر حيث تم إجراء مكالمة dbg! .


بالإضافة إلى ذلك ، println! الطباعة إلى الإخراج القياسي ، لذلك من الأفضل استخدام eprintln! للطباعة إلى دفق الخطأ القياسي. ماكرو dbg! مخرجات stderr ، وهي محقة في ذلك.


هذا يعمل حتى في الحالات الصعبة. فكر في مثال على التنفيذ الفعلي:


 fn factorial(n: u32) -> u32 { if n <= 1 { n } else { n * factorial(n - 1) } } 

من أجل تصحيحه ، يمكننا استخدام eprintln! :


 fn factorial(n: u32) -> u32 { eprintln!("n: {}", n); if n <= 1 { eprintln!("n <= 1"); n } else { let n = n * factorial(n - 1); eprintln!("n: {}", n); n } } 

نريد أن n في كل تكرار ونرى سياق كل فرع من الفروع. factorial(4) سيتم إخراج:


 n: 4 n: 3 n: 2 n: 1 n <= 1 n: 2 n: 6 n: 24 

هذا مقبول ، لكن ليس جيدًا بشكل خاص. ربما يمكننا العمل على تحسين إخراج معلومات السياق لجعل الاستنتاج أكثر وضوحًا. ولكن بعد ذلك ، بدلاً من تصحيح التعليمات البرمجية الخاصة بنا ، سنقوم بتحسين رمز التصحيح.


النظر في المثال نفسه باستخدام dbg! :


 fn factorial(n: u32) -> u32 { if dbg!(n <= 1) { dbg!(1) } else { dbg!(n * factorial(n - 1)) } } 

نحن ببساطة لف ماكرو بكل تعبيرات نريد إخراجها. نتيجة لذلك ، نحصل على:


 [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = true [src/main.rs:4] 1 = 1 [src/main.rs:5] n * factorial(n - 1) = 2 [src/main.rs:5] n * factorial(n - 1) = 6 [src/main.rs:5] n * factorial(n - 1) = 24 [src/main.rs:11] factorial(4) = 24 

منذ الماكرو dbg! إرجاع قيمة التصحيح نفسها ، على عكس eprintln! ، التي تُرجع () ، فنحن لسنا بحاجة إلى إجراء أي تغييرات على هيكل الكود الخاص بنا. بالإضافة إلى ذلك ، نحصل على استنتاج أكثر فائدة.


لقد أولينا الكثير من الاهتمام لمثل هذا الماكرو الصغير ، حيث نأمل أن يؤدي ذلك إلى تبسيط عملية تصحيح الأخطاء. بالطبع ، نواصل العمل على دعم gdb and Co.


jemalloc إزالتها jemalloc


ذات مرة ، كان لدى Rust وقت تشغيل كبير مماثل لـ Erlang. بالنسبة له ، تم اختيار jemalloc بدلاً من مخصص النظام ، لأنه غالبًا ما يكون أكثر إنتاجية. تدريجيا ، تخلصنا من وقت التشغيل أكثر وأكثر وفي النهاية ، تم حذف كل ذلك تقريبًا ، لكن jemalloc بقي. لم يكن لدينا أي وسيلة لاختيار مخصص مخصص ، وبالتالي لم نتمكن من إزالة jemalloc بالكامل ، حتى لا نؤذي أولئك الذين يحتاجون إليها.


بالإضافة إلى ذلك ، كان التأكيد على أن jemalloc هو دائمًا jemalloc الافتراضي كان مرتبطًا بشكل أساسي بعالم UNIX ، لأنه كان افتراضيًا في بعض الأنظمة الأساسية فقط. على وجه الخصوص ، كان هدف MSVC على نظام Windows يستخدم منذ فترة طويلة مخصص النظام.


أخيرًا ، رغم أن أداء jemalloc عادةً ما يكون جيدًا ، إلا أن هذا ليس هو الحال دائمًا. بالإضافة إلى ذلك ، فإنه يضيف حوالي 300 كيلو بايت إلى كل قابل للتنفيذ. أيضا ، تراكمت لدينا العديد من المشاكل الأخرى مع jemalloc. بشكل عام ، من الغريب أن لغة النظام لا تستخدم مخصص النظام بشكل افتراضي.


لهذه الأسباب ، بمجرد أن قدم Rust 1.28 طريقة لاختيار مُخصص عالمي ، بدأنا في التخطيط للتبديل إلى مُخصص النظام الافتراضي وتوفير jemalloc كمكتبة خارجية. في الإصدار 1.32 من Rust ، انتهينا أخيرًا من هذا العمل ، والآن سيستخدم البرنامج افتراضيًا مُخصص النظام.


إذا كنت ترغب في متابعة استخدام jemalloc ، فاستخدم مكتبة jemallocator . للقيام بذلك ، حدد في Cargo.toml :


 jemallocator = "0.1.8" 

وفي الملف الجذر لمشروعك:


 #[global_allocator] static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; 

هذا كل شئ! إذا لم تكن بحاجة إلى jemalloc ، فلم تعد مضطرًا لاستخدامه ، ولكن إذا كنت بحاجة إليه ، فيتم حل المشكلة ببضعة سطور من التعليمات البرمجية.


تحسينات نظام الوحدة النهائية


في الإصدارين الأخيرين ، تحدثنا عن العديد من التحسينات لنظام الوحدة النمطية. في الإصدار 1.32.0 و 2018 ، أضفنا أحدث تغيير. يطلق عليه "مسارات موحدة" ويتيح لك العمل مع مسارات الاستيراد بنفس الطريقة التي تتبعها مع المسارات الأخرى ، والتي سبق أن عملت بشكل غير صحيح. على سبيل المثال:


 enum Color { Red, Green, Blue } use Color::*; 

لم يتم تجميع هذا الرمز من قبل ، نظرًا لأن المسارات use يجب أن تبدأ بـ super أو self أو crate . الآن ، بفضل المحول البرمجي الذي يدعم المسارات المتسقة ، سيعمل هذا الرمز ويفعل ما تتوقعه: استيراد متغيرات تعداد Color المحدد أعلاه.


هذا التغيير يكمل مراجعة نظام الوحدة لدينا. نأمل أن تستمتع باستخدام نظام مبسط!


تحسينات الماكرو


صدأ 1.32.0 أصدرت العديد من التحسينات الكلية. أولاً ، تمت إضافة محدد جزء حرفي جديد :


 macro_rules! m { ($lt:literal) => {}; } fn main() { m!("some string literal"); } 

يتم تعيين الجزء literal إلى القيم الحرفية من أي نوع: سلسلة ، رقمية ، وحرف.


في macro_rules 2018 macro_rules هل يمكنك استخدام macro_rules أيضًا ? :


 macro_rules! bar { ($(a)?) => {} } 

شظية مع ? ستتم مطابقة حدوث صفر أو واحد ، تمامًا مثل تطابق جزء مع * بالفعل "صفر أو أكثر" ، مع + ، حدث واحد أو أكثر.


استقرار المكتبة القياسية


ماكرو dbg! ، التي وصفناها بالفعل أعلاه ، أصبحت إضافة مهمة إلى المكتبة القياسية. بالإضافة إلى ذلك ، تم إجراء 19 وظيفة ثابتة واستقبلت جميع الأنواع البدائية الرقمية وظائف تحويل إلى صفيف بايت والعكس بالعكس مع ترتيب البايت المحدد. هناك ست وظائف بأسماء to_<endian>_bytes و to_<endian>_bytes from_<endian>_bytes ، حيث <endian> هي:


  • النظام المحلي الأصلي (endianness الأصلي)
  • le - ترتيب من المبتدئين إلى كبار (endian قليلا)
  • be - ترتيب من الأقدم إلى الأصغر (endian كبير)

انظر ملاحظات الإصدار لمزيد من التفاصيل.


تحسينات البضائع


تلقى Cargo الاسم المستعار للبضائع c لأمر فحص الشحن ، ويسمح الآن باستخدام أسماء المستخدمين في عناوين URL الخاصة بالمستودع .


انظر ملاحظات الإصدار لمزيد من التفاصيل.


المطورين 1.32.0


خلق الكثير من الناس سويًا 1.32.0. لم نتمكن من إكمال العمل بدون كل واحد منكم. شكرا لك


من أحد المترجمين: أعرب عن شكر خاص لأعضاء مجتمع Rustycrate وشخصي @ dashhadee و ozkriff لمساعدتهما في الترجمة والتدقيق اللغوي.

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


All Articles