يسر فريق تطوير 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);  
ليست هذه هي العقبة الكبرى التي تؤدي إلى إبطاء عملية التطوير ، ولكن الأمر يتطلب الكثير من الجهد لتصحيح أخطاء إخراج القيمة 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 لمساعدتهما في الترجمة والتدقيق اللغوي.