إطلاق لغة البرمجة Rust 1.75 وunikernel Hermit 0.6.7

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

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

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

الابتكارات الرئيسية:

  • تمت إضافة القدرة على استخدام "async fn" وعلامة "->impl Trait" في السمات الخاصة. على سبيل المثال، باستخدام "->impl Trait" يمكنك كتابة أسلوب سمة يُرجع مكررًا: السمات الحاوية { fn items(&self) -> impl Iterator; } حاوية impl لـ MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    يمكنك أيضًا إنشاء السمات باستخدام "async fn": السمات HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // سيتم توسيعه إلى: // fn fetch(&self, url: Url) -> impl Future; }

  • تمت إضافة واجهة برمجة التطبيقات لحساب إزاحات البايت بالنسبة للمؤشرات. عند العمل باستخدام مؤشرات مجردة ("*const T" و"*mut T")، قد تكون هناك حاجة إلى عمليات لإضافة إزاحة إلى المؤشر. في السابق، كان من الممكن لهذا الغرض استخدام بناء مثل "::add(1)"، مضيفًا عدد البايتات المتوافقة مع حجم "size_of::()". تعمل واجهة برمجة التطبيقات الجديدة على تبسيط هذه العملية وتجعل من الممكن معالجة إزاحات البايت دون إرسال الأنواع أولاً إلى "*const u8" أو "*mut u8".
    • المؤشر::byte_add
    • المؤشر::byte_offset
    • المؤشر::byte_offset_from
    • المؤشر::byte_sub
    • المؤشر::wrapping_byte_add
    • المؤشر::wrapping_byte_offset
    • المؤشر::wrapping_byte_sub
  • استمرار العمل على زيادة أداء المترجم Rustc. تمت إضافة مُحسِّن BOLT، والذي يعمل في مرحلة ما بعد الارتباط ويستخدم المعلومات من ملف تعريف التنفيذ المُعد مسبقًا. يتيح لك استخدام BOLT تسريع تنفيذ المترجم بنسبة 2% تقريبًا عن طريق تغيير تخطيط رمز المكتبة librustc_driver.so لاستخدام أكثر كفاءة لذاكرة التخزين المؤقت للمعالج.

    تم تضمين إنشاء مترجم Rustc باستخدام خيار "-Ccodegen-units=1" لتحسين جودة التحسين في LLVM. تُظهر الاختبارات التي تم إجراؤها زيادة في الأداء في حالة إنشاء "-Ccodegen-units=1" بنسبة 1.5% تقريبًا. يتم تمكين التحسينات المضافة بشكل افتراضي فقط للنظام الأساسي x86_64-unknown-linux-gnu.

    تم اختبار التحسينات المذكورة سابقًا بواسطة Google لتقليل وقت إنشاء مكونات نظام Android الأساسي المكتوبة بلغة Rust. إن استخدام "-C codegen-units=1" عند إنشاء Android أتاح لنا تقليل حجم مجموعة الأدوات بنسبة 5.5% وزيادة أدائها بنسبة 1.8%، بينما تضاعف وقت إنشاء مجموعة الأدوات نفسها تقريبًا.

    أدى تمكين جمع البيانات المهملة في وقت الارتباط ("--gc-sections") إلى زيادة الأداء بنسبة تصل إلى 1.9%، وتمكين تحسين وقت الارتباط (LTO) حتى 7.7%، والتحسينات المستندة إلى الملف الشخصي (PGO) حتى 19.8%. في المرحلة النهائية، تم تطبيق التحسينات باستخدام الأداة المساعدة BOLT، والتي سمحت بزيادة سرعة البناء إلى 24.7%، لكن حجم مجموعة الأدوات زاد بنسبة 10.9%.

    إطلاق لغة البرمجة Rust 1.75 وunikernel Hermit 0.6.7

  • تم نقل جزء جديد من واجهة برمجة التطبيقات إلى فئة المستقر ، بما في ذلك تم تثبيت طرق وتطبيقات السمات:
    • الذرية*::from_ptr
    • أوقات الملفات
    • FileTimesExt
    • ملف::set_modified
    • ملف::set_times
    • IPAddr::to_canonical
    • Ipv6Addr::to_canonical
    • الخيار::as_slice
    • الخيار::as_mut_slice
    • المؤشر::byte_add
    • المؤشر::byte_offset
    • المؤشر::byte_offset_from
    • المؤشر::byte_sub
    • المؤشر::wrapping_byte_add
    • المؤشر::wrapping_byte_offset
    • المؤشر::wrapping_byte_sub
  • تُستخدم خاصية "const" ، التي تحدد إمكانية استخدامها في أي سياق بدلاً من الثوابت ، في الدوال:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • ربماUninit::صفر
    • مذكر::تمييز
    • مذكر::صفر
  • تم تنفيذ المستوى الثالث من الدعم لمنصات csky-unknown-linux-gnuabiv2hf وi586-unknown-netbsd وmipsel-unknown-netbsd. يتضمن المستوى الثالث الدعم الأساسي، ولكن بدون اختبار تلقائي أو نشر إصدارات رسمية أو التحقق من إمكانية إنشاء التعليمات البرمجية.

بالإضافة إلى ذلك، يمكننا أن نلاحظ إصدارًا جديدًا من مشروع Hermit، الذي يقوم بتطوير نواة متخصصة (unikernel)، مكتوبة بلغة Rust، مما يوفر أدوات لبناء تطبيقات قائمة بذاتها يمكن تشغيلها فوق برنامج Hypervisor أو الأجهزة العارية دون طبقات إضافية وبدون نظام تشغيل. عند إنشاء التطبيق، يتم ربطه بشكل ثابت بالمكتبة، التي تنفذ بشكل مستقل جميع الوظائف الضرورية، دون الارتباط بنواة نظام التشغيل ومكتبات النظام. يتم توزيع رمز المشروع بموجب تراخيص Apache 2.0 وMIT. يتم دعم التجميع للتنفيذ المستقل للتطبيقات المكتوبة بلغات Rust وGo وFortran وC وC++. يقوم المشروع أيضًا بتطوير أداة تحميل التشغيل الخاصة به والتي تسمح لك بتشغيل Hermit باستخدام QEMU وKVM.

المصدر: opennet.ru

إضافة تعليق