كتب هذا المقال لين كلارك بالتعاون مع فريق تطوير الصدأ ("نحن" في النص). يمكنك أيضًا قراءة المنشور على مدونة Rust الرسمية.
تم إصدار الإصدار الأول من Rust 2018 في 6 ديسمبر 2018. في هذا الإصدار ، ركزنا على الإنتاجية حتى بدأ مطورو Rust بالعمل بكفاءة قدر الإمكان.
يُظهر الجدول الزمني الانتقال من الإصدار التجريبي إلى الإصدار Rust 2018 و Rust 2015. وهو محاط برموز للأدوات والأربعة مجالات: WebAssembly و embedded و Networking و CLI الدائرة الحمراء - إنتاجية المطورين - تحيط بكل شيء ما عدا Rust 2015ولكن بشكل عام ، ليس من السهل شرح ماهية Rust 2018.
يقدم البعض هذا كإصدار جديد من اللغة ... شيء من هذا القبيل ، ولكن ليس حقا. أقول "لا حقًا" ، لأن "الإصدار الجديد" هنا لا يعني الإصدارات الجديدة من اللغات الأخرى.
في معظم اللغات الأخرى ، تضيف جميع الميزات الجديدة نسخة جديدة. لم يتم تحديث الإصدار السابق.
نظام الصدأ يعمل بشكل مختلف. هذا يرجع إلى كيفية تطور اللغة. تتوافق جميع الميزات الجديدة تقريبًا مع Rust. أنها لا تتطلب أي تغييرات. هذا يعني أنه لا يوجد سبب لتقييدهم برمز Rust 2018. ستستمر الإصدارات الأحدث من المترجم في دعم "وضع Rust 2015" افتراضيًا.
لكن في بعض الأحيان يتطلب تطوير لغة ما الابتكار ، على سبيل المثال ، بناء جملة جديد. وهذا بناء الجملة الجديد يمكن أن يكسر الأكواد البرمجية الموجودة.
على سبيل المثال ، وظيفة
async/await
. في البداية ، لم تكن هناك مثل هذه المفاهيم في الصدأ. لكن اتضح أن هذه الأوليات مفيدة حقًا ، فهي تبسط كتابة الشفرة غير المتزامنة.
لهذه الوظيفة ، يجب إضافة الكلمات الرئيسية
async
. لكن يجب أن تحرص على عدم كسر الشفرة القديمة حيث يمكن استخدام
async
أو
await
كأسماء متغيرة.
وبالتالي ، نضيف الكلمات الرئيسية في Rust 2018. على الرغم من أن الوظيفة لم تصدر بعد ، إلا أن الكلمات الرئيسية محفوظة الآن. يتم إجراء جميع التغييرات غير المتوافقة للسنوات الثلاث القادمة من التطوير (على سبيل المثال ، إضافة كلمات رئيسية جديدة) في وقت واحد في Rust 1.31.

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

لذلك ، حتى عند استخدام Rust 2018 ، يبدو كل شيء مثله مثل Rust 2015. يتم تطبيق معظم التغييرات في وقت واحد في Rust 2018 و Rust 2015. تتطلب وظائف قليلة فقط تغييرات غير متوافقة.

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

أو يمكنك أن تتخيل ذلك في وقت ما عندما يصبح Rust أحد اللغات الأكثر فاعلية للعديد من التطبيقات - عندما تحتاج إلى أداء أو استخدام فعال للموارد أو موثوقية عالية.

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

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

الصدأ مناسب تمامًا لتطوير الويب لسببين:
- يعمل Cargo Crash Ecosystem بالطريقة التي اعتاد عليها معظم مطوري تطبيقات الويب. الجمع بين مجموعة من الوحدات الصغيرة لتشكيل تطبيق أكبر. هذا يعني أن الصدأ سهل الاستخدام بالضبط في المكان الذي تحتاج إليه.
- الصدأ منخفض في الموارد ولا يحتاج إلى وقت تشغيل. لا تحتاج إلى الكثير من التعليمات البرمجية. إذا كان لديك وحدة نمطية صغيرة تقوم بالكثير من أعمال الحوسبة الشاقة ، فقم بتنفيذ عدد قليل من خطوط الصدأ لتسريعها.
باستخدام
web-sys و js-sys من Rust Code ، من السهل استدعاء واجهات برمجة تطبيقات الويب مثل
fetch
أو
appendChild
. و
wasm-bindgen
يجعل من السهل دعم أنواع البيانات ذات المستوى الأعلى التي لا يدعمها WebAssembly أصلاً.
بعد كتابة وحدة Rust WebAssembly ، توجد أدوات لتوصيلها بسهولة بباقي تطبيق الويب. يمكنك استخدام
wasm-pack لتشغيل هذه الأدوات تلقائيًا ، وتشغيل الوحدة النمطية في npm إذا كنت تريد ذلك.
راجع
كتاب Rust و WebAssembly لمزيد من المعلومات .
ما التالي؟
بعد إصدار Rust 2018 ، يخطط المطورون لمناقشة مع المجتمع في أي اتجاهات لمزيد من العمل.
التطبيقات المضمنة
للتطوير المضمن ، كان من الضروري زيادة ثبات الوظائف الحالية.
من الناحية النظرية ، كانت Rust دائمًا لغة جيدة للتطبيقات المدمجة. هذه مجموعة أدوات حديثة ، والتي كانت تفتقر إلى حد كبير للمطورين ، ووظائف لغة عالية المستوى مريحة للغاية. كل هذا دون تحميل غير ضروري على وحدة المعالجة المركزية والذاكرة. وبالتالي ، الصدأ هو عظيم لالمضمنة.
ولكن في الممارسة العملية اتضح بشكل مختلف.
قناة مستقرة تفتقر إلى الوظائف اللازمة. بالإضافة إلى ذلك ، للاستخدام على الأجهزة المدمجة ، كان من الضروري تغيير المكتبة القياسية. هذا يعني أنه كان على الناس تجميع إصدارهم الخاص من صندوق Rust الأساسي (الصندوق المستخدم في كل تطبيق Rust لتوفير اللبنات الأساسية Rust - الوظائف المدمجة والأولويات).

نتيجة لذلك ، اعتمد المطورون على الإصدار التجريبي من Rust. وفي حالة عدم وجود اختبارات تلقائية ، فإن المجموعة التجريبية لم تعمل في كثير من الأحيان على المتحكمات الدقيقة.
لإصلاح ذلك ، حاول المطورون نقل جميع الوظائف الضرورية إلى قناة مستقرة ، وإضافة اختبارات إلى نظام CI لوحدات التحكم الدقيقة. هذا يعني أن تغيير أحد مكونات سطح المكتب لن يؤدي إلى كسر الإصدار المضمن.
مع هذه التغييرات ، ينتقل تطوير الأنظمة المدمجة في Rust من مجال التجارب المتقدمة إلى مجال الكفاءة الطبيعية.
لمزيد من المعلومات ، راجع
كتاب Rust for Embedded Systems .
ما التالي؟
حصلت روست هذا العام على دعم جيد لعائلة ARM Cortex-M الشعبية. ومع ذلك ، لم يتم دعم العديد من البنى حتى الآن. يحتاج الصدأ إلى التوسع لتوفير دعم مماثل للمباني الأخرى.
مهام الشبكة
للعمل على الشبكة ، كان من الضروري تضمين تجريد رئيسي في اللغة:
async/await
. وبالتالي ، يمكن للمطورين استخدام تعابير الصدأ القياسية حتى في التعليمات البرمجية غير المتزامنة.
في مهام الشبكة ، غالبًا ما تضطر إلى الانتظار. على سبيل المثال ، استجابة لطلب. إذا كانت الشفرة متزامنة ، فسيتم إيقاف العمل: لا يمكن لجوهر المعالج الذي تم تنفيذ الرمز أن يفعل أي شيء حتى يصل الطلب. ولكن في الشفرة غير المتزامنة ، يمكن وضع مثل هذه الوظيفة في وضع الاستعداد ، في حين أن وحدة المعالجة المركزية الأساسية ستقوم بالباقي.
البرمجة غير المتزامنة ممكنة أيضًا في Rust 2015 ، وهناك العديد من المزايا لذلك. في التطبيقات عالية الأداء ، سيتعامل تطبيق الخادم مع اتصالات أكثر بكثير لكل خادم. تعمل التطبيقات المضمّنة على وحدات المعالجة المركزية الصغيرة ذات الخيوط المفردة على تحسين استخدام مؤشر ترابط واحد.
لكن هذه المزايا مصحوبة بعيب رئيسي: بالنسبة لمثل هذه الشفرة ، لا يعمل التحقق من الاقتراض وعليك استخدام تعابير الصدأ غير القياسية (والمربكة قليلاً). هذه هي فائدة
async/await
. هذا يعطي المحول البرمجي المعلومات الضرورية لاختبار استدعاءات استدعاءات الوظائف غير المتزامنة.
async/await
تطبيق الكلمات الرئيسية
async/await
في الإصدار 1.31 ، على الرغم من أنها غير مدعومة حاليًا بواسطة التطبيق. يتم إنجاز معظم العمل ، ويجب أن تكون الميزة متوفرة في الإصدار التالي.
ما التالي؟
بالإضافة إلى التطوير الفعال ذي المستوى المنخفض ، يمكن أن يوفر Rust تطويرًا أكثر كفاءة لتطبيقات الشبكة على مستوى أعلى.
تقوم العديد من الخوادم بمهام روتينية: تحليل عناوين URL أو العمل مع HTTP. إذا حولتها إلى مكونات - تجريدات مشتركة يتم مشاركتها كصناديق - فسيكون من السهل توصيلها مع بعضها البعض ، وتشكيل جميع أنواع تكوينات الخادم والإطار.
تم إنشاء
إطار Tide تجريبي لتطوير واختبار المكونات.
أدوات سطر الأوامر
بالنسبة لأدوات سطر الأوامر ، كان من الضروري الجمع بين مكتبات صغيرة منخفضة المستوى في تجريدات عالية المستوى وتلميع بعض الأدوات الموجودة.
بالنسبة لبعض النصوص ، يعد bash مثاليًا. على سبيل المثال ، لاستدعاء أدوات shell الأخرى وتمرير البيانات بينها.
لكن الصدأ هو خيار رائع للعديد من الأدوات الأخرى. على سبيل المثال ، إذا قمت بإنشاء أداة معقدة مثل
ripgrep أو أداة CLI أعلى وظيفة مكتبة موجودة.
لا يحتاج الصدأ إلى وقت تشغيل ويترجم إلى ثنائي ثابت واحد ، مما يبسط عملية توزيع البرنامج. وستحصل على تجريدات عالية المستوى ليست في لغات أخرى ، مثل C و C ++.
ماذا يمكن أن تحسن الصدأ؟ بالطبع ، التجريد من مستوى أعلى.
مع التجريدات ذات المستوى الأعلى ، يتم تجميع CLI الجاهزة بسرعة وسهولة.
مثال على هذا التجريد هي مكتبة
الذعر البشري . في حالة عدم وجود مثل هذه المكتبة ، في حالة حدوث عطل ، من المحتمل أن يُرجع رمز CLI كل التراجع. لكنها ليست مثيرة للاهتمام للغاية للمستخدمين. يمكنك إضافة معالجة مخصصة للخطأ ، لكنها صعبة.
مع مكتبة الذعر البشري ، سينتقل الإخراج تلقائيًا إلى ملف تفريغ الأخطاء. سيرى المستخدم رسالة إعلامية تعرض الإبلاغ عن مشكلة وتنزيل ملف التفريغ.

أصبح البدء في تطوير أدوات CLI أسهل أيضًا. على سبيل المثال ، تقوم مكتبة
confy بأتمتة التكوين الخاص بها. يسأل شيئين فقط:
- ما هو اسم التطبيق؟
- ما معلمات التكوين التي تريد توفيرها (والتي تحددها كهيكل يمكن تسلسله وإلغاء تسلسله)؟
سيحدد Confy كل شيء آخر بمفرده.
ما التالي؟
استخلصنا العديد من المهام ل CLI. ولكن هناك شيء آخر يجب تجريده. سنقوم بإصدار المزيد من المكتبات رفيعة المستوى.
أدوات الصدأ

عندما تكتب بأي لغة ، فأنت تعمل باستخدام أدواتها: البدء بالمحرر والاستمرار في استخدام الأدوات الأخرى في جميع مراحل التطوير والدعم.
هذا يعني أن اللغة الفعالة تعتمد على الأدوات الفعالة.
فيما يلي بعض الأدوات الجديدة (والتحسينات على الأدوات الحالية) في Rust 2018.
دعم IDE
بالطبع ، يعتمد الأداء على النقل السريع والسلس للشفرة من عقل المطور إلى شاشة الكمبيوتر. هذا هو المكان دعم IDE أمر بالغ الأهمية. للقيام بذلك ، نحتاج إلى أدوات يمكنها "شرح" IDE لمعنى كود Rust: على سبيل المثال ، اقترح خيارات ذات معنى للإكمال التلقائي للسلاسل.
في Rust 2018 ، ركز المجتمع على الميزات التي تتطلبها IDE. مع ظهور Rust Language Server و IntelliJ Rust ، فإن العديد من IDEs يدعمون الآن Rust بالكامل.
تجميع أسرع
تحسين أداء المترجم يعني تسريعها. هذا ما فعلناه.
في السابق ، عندما قمت بترجمة صندوق الصدأ ، قام المترجم بإعادة تجميع كل ملف في الصندوق. يتم الآن تنفيذ التحويل البرمجي الإضافي: فهو يجمع فقط الأجزاء التي تغيرت. جنبا إلى جنب مع غيرها من التحسينات ، وهذا جعل مترجم الصدأ أسرع بكثير.
rustfmt
تتطلب الكفاءة أيضًا ألا نتجادل مطلقًا بشأن قواعد تنسيق الأكواد أو إصلاح أنماط الأشخاص الآخرين يدويًا.
تساعد أداة rustfmt في ذلك: ستقوم تلقائيًا بإعادة تهيئة الكود وفقًا للنمط الافتراضي (الذي
توصل المجتمع من خلاله
إلى الإجماع ). يضمن Rustfmt أن يتطابق كل رمز Rust مع نفس النمط ، مثل تنسيق clang لـ C ++ أو Prettier for JavaScript.
كليبي
في بعض الأحيان يكون من الجيد أن يكون لديك مستشار متمرس قريب يقدم المشورة بشأن أفضل الممارسات لكتابة التعليمات البرمجية. هذا ما يفعله Clippy: يتحقق من الشفرة أثناء مشاهدته ويقترح التعابير القياسية.
الصدأ
ولكن إذا كان لديك قاعدة الشفرة القديمة مع التعابير التي عفا عليها الزمن ، ثم التحقق بشكل صحيح وتصحيح رمز يمكن أن تكون متعبة. أنت فقط تريد أن يقوم شخص ما بإجراء تصحيحات لقاعدة التعليمات البرمجية بأكملها.
في هذه الحالات ، يقوم rustfix بأتمتة العملية. يطبق في وقت واحد قواعد من أدوات مثل Clippy ، ويقوم بتحديث الكود القديم وفقًا لمصطلحات Rust 2018.
التغييرات في الصدأ نفسه
زادت التغييرات في النظام البيئي بشكل كبير من كفاءة البرمجة. ولكن بعض المشاكل لا يمكن حلها إلا عن طريق التغييرات في اللغة نفسها.

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

بينما لا يتوفر هذا إلا في Rust 2018 ، ولكن في المستقبل القريب ستتم إضافة الوظيفة إلى جميع الإصدارات الأخرى. قريبا سوف نكتب المزيد عن هذا الموضوع.
وحدات الماكرو الإجرائية في الصدأ المستقر
كان الصدأ وحدات الماكرو قبل الصدأ 1.0. ولكن في Rust 2018 ، تم إجراء تحسينات خطيرة ، على سبيل المثال ، ظهرت وحدات الماكرو الإجرائية. أنها تسمح لك بإضافة بناء الجملة الخاص بك إلى Rust.
يقدم Rust 2018 نوعين من وحدات الماكرو الإجرائية:
وحدات الماكرو وظيفة
تسمح لك وحدات الماكرو التي تشبه الوظيفة بإنشاء كائنات تبدو وكأنها استدعاءات الوظائف العادية ، ولكن يتم تنفيذها فعليًا في وقت الترجمة. يأخذون رمزًا واحدًا ويعطون رمزًا آخر ، يقوم المترجم بإدخاله في الملف الثنائي.
كانت موجودة من قبل ، ولكن مع محدودية. يمكن لماكرو تنفيذ عبارة المطابقة فقط. لم يكن لديه وصول لعرض جميع الرموز في الكود الوارد.
ولكن مع وحدات الماكرو الإجرائية ، يمكنك الحصول على نفس الإدخال مثل المحلل اللغوي: نفس دفق الرموز. هذا يعني أنه يمكنك إنشاء وحدات ماكرو أكثر قوة مثل الوظائف.
تشبه سمة وحدات الماكرو
إذا كنت على دراية بالديكور بلغات مثل JavaScript ، فإن وحدات ماكرو السمات متشابهة جدًا. إنها تسمح لك بتعليق أجزاء من كود Rust التي يجب معالجتها مسبقًا وتحويلها إلى شيء آخر.
الماكرو
derive
يفعل ذلك تماما. عندما تضعها على هيكل ، يأخذ المترجم تلك البنية (بعد تحليلها كقائمة الرموز المميزة) ومعالجتها. على وجه الخصوص ، يضيف تطبيق أساسي للوظائف من السمة.
مزيد من الاقتراض مريح في المقارنات
هناك تغيير بسيط.
في السابق ، إذا كنت ترغب في استعارة شيء ما وحاولت المطابقة ، فعليك إضافة بعض العبارات الغريبة:

الآن ، بدلاً من
&Some(ref s)
نكتب ببساطة
Some(s)
.
جديد الصدأ 2018 الميزات
أصغر جزء من Rust 2018 هو ميزات خاصة بهذا الإصدار. فيما يلي مجموعة صغيرة من التغييرات في Rust 2018.
كلمات مفتاحية
أضاف Rust 2018 بعض الكلمات الرئيسية:
لم يتم تطبيق هذه الميزات بالكامل حتى الآن ، ولكن تمت إضافة الكلمات الرئيسية في Rust 1.31.
وبالتالي ، لن يتعين علينا في المستقبل تقديم كلمات رئيسية جديدة (والتي ستصبح تغييرًا غير متوافق) عندما نطبق هذه الوظائف.نظام وحدات
ألم كبير واحد ل newbies ل Rust هو نظام وحدات. وهذا واضح لماذا. كان من الصعب أن نفهم لماذا يختار راست وحدة معينة. لإصلاح ذلك ، أجرينا بعض التغييرات على آلية المسار.على سبيل المثال ، إذا قمت باستيراد حامل ، يمكنك استخدامه في المسار في المستوى الأعلى. ولكن إذا قمت بنقل أي رمز إلى وحدة فرعية ، فلن يعمل بعد ذلك.
مثال آخر هو البادئة ::
، والتي تستخدم لكل من جذر الصندوق والصندوق الخارجي. من الصعب أن نفهم ما هو أمامنا.جعلناها أكثر وضوحا. الآن إذا كنت تريد الإشارة إلى صندوق الجذر ، فاستخدم البادئة crate::
. هذا هو مجرد واحد من التحسينات من أجل الوضوح.إذا كنت تريد أن يستخدم الكود الحالي إمكانيات Rust 2018 ، على الأرجح ، ستحتاج إلى تحديث الكود ليأخذ في الاعتبار المسارات الجديدة. ولكن ليس من الضروري القيام بذلك يدويا. قبل إضافة نسخة تصفيات Cargo.toml تشغيل فقط cargo fix
- و rustfix
ستجعل التغييرات الضرورية.معلومات اضافية
جميع معلومات الإصدار الجديد للغة موجودة في دليل Rust 2018 .