يسر فريق تطوير 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 لمساعدتهما في الترجمة والتدقيق اللغوي.