صدأ 1.31 وصدأ 2018

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


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


 $ rustup update stable 

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


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


يعتبر 1.31 Rust هو الإصدار الأكثر أهمية منذ Rust 1.0! يتم تضمين التكرار الأول من "Rust 2018" في هذا الإصدار ، ولكن هذا ليس هو الابتكار الوحيد! ستكون مراجعة التحسينات طويلة ، لذلك يوجد هنا جدول المحتويات:


  • الصدأ 2018
    • الأوقات غير المعجمية للحياة
    • تغييرات نظام الوحدات
  • قواعد إضافية لعرض العمر
  • const fn
  • أدوات جديدة
  • الشيكات جودة رمز مفيدة
  • الوثائق
  • مجموعات العمل
  • موقع جديد
  • استقرار المكتبة القياسية
  • تحسينات البضائع
  • الافراج عن المطورين

الصدأ 2018


كتبنا عن Rust 2018 لأول مرة في مارس ، ثم في يوليو . للحصول على تفاصيل لماذا تحتاج إلى Rust 2018 ، راجع هذه المنشورات. في هذا الاستعراض ، يوجد الكثير لإخبارنا به ، لذلك سنركز فقط على ما يدور حوله Rust 2018. يمكنك أيضًا القراءة عنه في منشور على Mozilla Hacks ( الترجمة ).


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


  • مجموعة أدوات (الدعم في IDE ، rustfmt ، rustfmt )
  • الوثائق
  • مجموعات العمل المعنية
  • موقع جديد

علاوة على ذلك سنتحدث عن كل هذا بمزيد من التفصيل وعن الابتكارات الأخرى.


لنقم بإنشاء مشروع جديد باستخدام Cargo:


 $ cargo new foo 

هنا محتويات Cargo.toml :


 [package] name = "foo" version = "0.1.0" authors = ["Your Name <you@example.com>"] edition = "2018" [dependencies] 

تمت إضافة مفتاح جديد إلى المقطع [package] : edition . يرجى ملاحظة أنه مثبت في 2018 . يمكنك أيضًا تثبيته في عام 2015 - سيتم تعيين هذه القيمة افتراضيًا في حالة فقد المفتاح.


سيؤدي استخدام Rust 2018 إلى فتح بعض الميزات الجديدة غير المسموح بها في Rust 2015.


من المهم ملاحظة أن كل حزمة يمكن أن تكون في وضع 2015 أو 2018 ، وسوف تعمل معًا. يمكن أن يستخدم مشروع طبعة 2018 تبعيات إصدار 2015 ، ويمكن أن يستخدم مشروع طبعة عام 2015 تبعيات إصدار 2018. هذا يضمن سلامة النظام الإيكولوجي وأن جميع الميزات الجديدة ستكون اختيارية ، مع الحفاظ على التوافق مع الشفرة الحالية. بالإضافة إلى ذلك ، عندما تقرر تحويل رمز Rust 2015 إلى Rust 2018 ، يمكن إجراء التغييرات تلقائيًا من خلال cargo fix .


قد تسأل: ماذا عن الميزات الجديدة نفسها؟ أولاً ، تتم إضافتها أيضًا في Rust 2015 ، إذا كانت متوافقة مع ميزات هذه الطبعة. وبالتالي ، فإن معظم اللغة لا تزال هي نفسها في كل مكان. يمكنك الاطلاع على دليل التحرير لمعرفة الحد الأدنى من إصدار rustc لكل ميزة جديدة ومتطلباتها الأخرى. ومع ذلك ، هناك العديد من الابتكارات الكبيرة التي يجب ذكرها بشكل منفصل: الأعمار غير المعجمية وبعض التغييرات في نظام الوحدة.


الأوقات غير المعجمية للحياة


إذا كنت قد تابعت الصدأ على مدار السنوات القليلة الماضية ، فقد تصادف أحيانًا مصطلح "NLL" أو "العمر غير المعجمي". هذا هو المصطلح ، الذي يعني ، بعبارات بسيطة ، ما يلي: أصبح المقترض أكثر ذكاءً والآن يقبل بعض الأكواد الصحيحة التي رفضها من قبل. النظر في مثال:


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

الصدأ تستخدم لرمي خطأ تجميع:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | 6 | let z = &mut x; | ^ mutable borrow occurs here 7 | } | - immutable borrow ends here 

هذا لأنه تم تعريف مجال حياة الروابط "معجميًا" ؛ أي أن الاقتراض y اعتبر نشطًا حتى خرج y من النطاق في نهاية main ، حتى لو لم نستخدم y مطلقًا داخل النطاق مرة أخرى. كل شيء على ما يرام مع الكود أعلاه ، ولكن محلل التبعية لم يستطع فهم هذا.


الآن هذا الرمز يجمع جيد.


ولكن ماذا لو استخدمنا y ؟ على سبيل المثال ، مثل هذا:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; println!("y: {}", y); } 

الصدأ تستخدم لتعطيك هذا الخطأ:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | let z = &mut x; | ^ mutable borrow occurs here ... 8 | } | - immutable borrow ends here 

في Rust 2018 ، تم تحسين رسالة الخطأ هذه:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:13 | 4 | let y = &x; | -- immutable borrow occurs here 5 | let z = &mut x; | ^^^^^^ mutable borrow occurs here 6 | 7 | println!("y: {}", y); | - borrow later used here 

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


في Rust 1.31 ، يعد هذا تحسينًا حصريًا لبرنامج Rust 2018. نخطط لإضافته إلى Rust 2015 لاحقًا.


تغييرات نظام الوحدات


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


لذلك ، تُجري نسخة 2018 بعض التغييرات على طريقة عمل المسارات ، وتبسيط نظام الوحدة النمطية وجعله أكثر قابلية للفهم.


فيما يلي ملخص موجز:


  • لم يعد مطلوبا extern crate أي مكان آخر تقريبا.
  • يمكنك استيراد وحدات الماكرو باستخدام use ، بدلاً من استخدام السمة #[macro_use] .
  • تبدأ المسارات المطلقة باسم الحاوية ، حيث تشير الكلمة الرئيسية للصندوق إلى الحاوية الحالية.
  • foo.rs الفرعي foo/ يمكن أن يتعايشا ؛ لم يعد mod.rs مطلوبًا عند وضع وحدات فرعية في دليل فرعي.

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


لا يزال هناك الكثير من التفاصيل ، يرجى الرجوع إلى دليل التحرير لجميع التفاصيل.


قواعد إضافية لعرض العمر


دعنا نتحدث عن التحسينات المتاحة في كلا الإصدارين: لقد أضفنا بعض قواعد الاستدلال الإضافية لكتل impl وتعريفات الوظائف. رمز مثل هذا:


 impl<'a> Reader for BufReader<'a> { //   } 

يمكن الآن كتابة مثل هذا:


 impl Reader for BufReader<'_> { //   } 

لا يزال يظهر مدى الحياة '_ أن BufReader يأخذها كمعلمة ، لكننا لم نعد بحاجة إلى منحها اسمًا.


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


 // Rust 2015 struct Ref<'a, T: 'a> { field: &'a T } // Rust 2018 struct Ref<'a, T> { field: &'a T } 

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


const fn


لدى Rust العديد من الطرق لإعلان الوظيفة: fn للوظائف العادية ، unsafe fn غير الآمنة للوظائف غير الآمنة ، و extern fn الخارجية للوظائف الخارجية. يضيف هذا الإصدار طريقة جديدة لإعلان الوظيفة: const fn . يستخدم مثل هذا:


 const fn foo(x: i32) -> i32 { x + 1 } 

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


 const SIX: i32 = foo(5); 

سيتم تنفيذ وظيفة foo في وقت الترجمة وسيتم تعيين SIX إلى 6 .


لا يمكن للوظائف الثابتة أن تفعل كل ما يمكن أن تفعله الوظائف العادية: يجب أن يكون لها نتيجة حتمية. هذا مهم لأسباب الموثوقية. في النموذج الحالي ، يمكن أن تؤدي الوظائف الثابتة مجموعة فرعية من العمليات بحد أدنى. فيما يلي بعض الأمثلة لما يمكنك القيام به فيها:


  • استخدام عدد صحيح العمليات الحسابية والمقارنة
  • استخدم أي عمليات منطقية باستثناء && و ||
  • مصفوفات التصميم والهياكل والتعدادات والتلاميذ
  • استدعاء وظائف ثابتة أخرى
  • الوصول بواسطة الفهرس في المصفوفات والشرائح
  • الوصول إلى مجالات الهياكل و tuples
  • استخدم الثوابت (ولكن ليس القيم الثابتة ، ولا حتى الإشارات إليها)
  • استخدام & * الروابط
  • يلقي أنواع باستثناء يلقي مؤشر الخام إلى قيمة عدد صحيح

سنوسع قدرات الوظائف الثابتة ، لكن المجموعة المذكورة أعلاه كافية بالفعل لاستخدام const fn في الممارسة.


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


أدوات جديدة


يمثل إصدار 2018 بداية مستوى جديد من النضج للنظام البيئي لأداة الصدأ. كانت Cargo و Rustdoc و Rustup هي الأدوات الرئيسية منذ الإصدار 1.0؛ مع إصدار 2018 ، سيأتي جيل جديد من الأدوات التي يمكن للجميع استخدامها الآن: دعم Clippy و Rustfmt و IDE.


محلل الشفرة الثابتة clippy متوفر الآن في صدأ ثابت. يمكنك تثبيته من خلال rustup component add clippy وتشغيله باستخدام cargo clippy . تلقى Clippy الآن الإصدار 1.0 ولديه نفس ضمانات الاستقرار لعمليات الفحص الثابتة مثل rustc. يمكن إضافة الشيكات الجديدة ، أو يمكن توسيع وظائف الشيكات القديمة ، ولكن لا يمكن حذف الشيكات القديمة (يمكن تمييزها فقط على أنها قديمة). هذا يعني أن الشفرة التي تجمع برمجية clippy ستستمر في ترجمة برمجية clippy (على افتراض أنه لم يتم تعيين عمليات فحص لإنشاء
خطأ عبر deny ) ، ولكن قد يولد تحذيرات جديدة.


Rustfmt هي أداة لتنسيق التعليمات البرمجية في Rust. سيوفر لك التنسيق التلقائي للرمز الوقت ، بالإضافة إلى أنه سيجعل الكود أقرب إلى أسلوب الصدأ الرسمي . يمكنك تثبيته من خلال rustup component add rustfmt واستخدام الأمر cargo fmt .


الإصدار الحالي يتضمن Rustfmt 1.0. من الآن فصاعدًا ، نحن نضمن التوافق مع الإصدارات السابقة لـ Rustfmt: إذا قمت بتنسيق الكود الخاص بك اليوم ، فلن يتغير التنسيق في المستقبل (فقط للإعدادات الافتراضية). يعني التوافق مع الإصدارات السابقة أنه من العملي الآن تشغيل Rustfmt على CI (استخدم cargo fmt --check ). جرب هذا مع "التنسيق عند الحفظ" في المحرر ، وسيتم إحداث ثورة في سير عملك.


يعد دعم IDE أحد أكثر الميزات المطلوبة لبرنامج Rust. الآن هناك العديد من الحلول عالية الجودة:



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


اختبارات جودة الكود الآلي (أدوات أداة)


في Rust 1.30 ، قمنا بتثبيت "سمات مفيدة" مثل #[rustfmt::skip] . في Rust 1.31 ، #[allow(clippy::bool_comparison)] شيء مثل هذا: "lints tool" مثل #[allow(clippy::bool_comparison)] . يتيح لك ذلك تحديد مساحات الأسماء للفحوصات لجعلها أكثر وضوحًا ما هي الأدوات التي تأتي منها.


إذا كنت قد استخدمت في السابق اختبارات Clippy ، فيمكنك الترحيل كما يلي:


 //  #![cfg_attr(feature = "cargo-clippy", allow(bool_comparison))] //  #![allow(clippy::bool_comparison)] 

لم تعد بحاجة إلى cfg_attr ! ستتلقى الآن تحذيرات تساعدك على التبديل إلى استخدام النمط الجديد.


الوثائق


كان هناك العديد من التحسينات على Rustdoc هذا العام ، وتم إصدار الكتاب المعاد كتابته بالكامل ، The Rust Programming Language. يمكنك شراء نسخة ورقية من No Starch Press !


كان يُطلق عليه سابقًا "الطبعة الثانية" من الكتاب ، لكن منذ أن أصبحت النسخة المطبوعة الأولى ، تسبب هذا في إرباك. في الواقع ، من المخطط أن يتم تحديث النسخة المطبوعة بشكل دوري. في النهاية ، بعد العديد من المناقشات مع No Starch ، تقرر تحديث الكتاب على الموقع الإلكتروني مع كل إصدار ، ولن يقوم No Starch بالتقاط التغييرات بشكل دوري وطباعتها. الكتاب يباع بشكل جيد ويجمع الأموال من أجل Black Girls Code .


يمكنك العثور على الإصدار الجديد من الكتاب هنا .


مجموعات العمل


لقد أعلنا هذا العام عن إنشاء أربع مجموعات عمل:


  • خدمات الشبكة
  • تطبيقات سطر الأوامر
  • Webassembly
  • الأجهزة المدمجة

عملت المجموعات جاهدة لجعل الصدأ أفضل في كل من هذه المجالات. فيما يلي بعض الإنجازات:


  • أعادت خدمات الشبكة إعادة تصميم الواجهة للعقود المستقبلية ، بالإضافة إلى المزامنة / الانتظار. لم يتم إصدار هذه التحسينات بعد ، لكننا قريبون بالفعل من ذلك!
  • عمل فريق CLI على المكتبات والوثائق لجعل تطبيقات سطر الأوامر أفضل.
  • أصدر WebAssembly العديد من الأدوات ذات المستوى العالمي لاستخدام Rust مع wasm.
  • للأجهزة المدمجة ، أصبح من الممكن تطوير ARM على صدأ ثابت!

يمكنك معرفة المزيد حول كل هذا على موقعنا الجديد!


موقع جديد


في الأسبوع الماضي ، أعلنا عن إصدار جديد من موقعنا. الآن أصبح الإصدار الرسمي لـ rust-lang.org!


لإنشائه استغرق سنة من العمل لكثير من الناس. على الرغم من أنه لا يزال هناك الكثير مما يجب عمله قبل اكتماله ، إلا أننا فخورون بالعمل المنجز.


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


تمت إضافة جديدة From التطبيقات:


  • u8 تطبيق u8 الآن From<NonZeroU8> ، بالمثل بالنسبة للأنواع الرقمية الأخرى وما يعادلها من غير NonZero
  • Option<&T> ينفذ From<&Option<T>> ، على غرار &mut

تم تثبيت الوظائف التالية أيضًا:



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


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


سيقوم Cargo الآن بتحميل الحزم بالتوازي باستخدام HTTP / 2.


بالإضافة إلى ذلك ، نظرًا لأن extern crate أصبح اختياريًا الآن ، فمن المحبط أن يتم كتابة extern crate foo as bar; لإعادة تسمية التبعية. لذلك ، يمكنك القيام بذلك في Cargo.toml بهذه الطريقة:


 [dependencies] baz = { version = "0.1", package = "foo" } 

أو ، بالتساوي:


 [dependencies.baz] version = "0.1" package = "foo" 

تتوفر حزمة foo الآن baz لاستخدامها في التعليمات البرمجية الخاصة بك.


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


المطورين 1.31.0


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


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

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


All Articles