إصدار لغة البرمجة Rust 1.59 مع دعم إدراجات التجميع

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

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

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

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

  • من الممكن استخدام إدراجات لغة التجميع، والتي تكون مطلوبة في التطبيقات التي تحتاج إلى التحكم في التنفيذ عند مستوى منخفض أو تكون قادرة على استخدام تعليمات الآلة المتخصصة. تتم إضافة إدراجات التجميع باستخدام وحدات الماكرو "asm!" و"global_asm!" استخدام صيغة تنسيق السلسلة لتسمية السجلات المشابهة لتلك المستخدمة لاستبدالات السلسلة في Rust. يدعم المترجم تعليمات التجميع لمعماريات x86 وx86-64 وARM وAArch64 وRISC-V. مثال الإدراج: استخدم std::arch::asm; // اضرب x في 6 باستخدام الإزاحات والجمع Let mut x: u64 = 4; غير آمن { asm!( "mov {tmp}, {x}"، "shl {tmp}، 1"، "shl {x}، 2"، "add {x}، {tmp}"، x = inout(reg ) x, tmp = out(reg) _, ); } تأكيد_eq!(x, 4 * 6);
  • تمت إضافة دعم للتخصيصات غير المهيكلة (الموازية)، حيث يتم تحديد العديد من السمات أو الشرائح أو الهياكل على الجانب الأيسر من التعبير. على سبيل المثال: دع (أ، ب، ج، د، ه)؛ (أ، ب) = (1، 2)؛ [ج، ..، د، _] = [1، 2، 3، 4، 5]؛ Struct { e, .. } = Struct { e: 5, f: 3 }; تأكيد_eq!([1, 2, 1, 4, 5], [أ, ب, ج, د, ه]);
  • تم توفير القدرة على تحديد القيم الافتراضية للأدوية العامة const: struct ArrayStorage { آر: [ت؛ N]، } ضمنا ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • يوفر مدير حزمة Cargo تحذيرات حول استخدام الهياكل غير الصالحة في التبعيات التي تتم معالجتها بسبب أخطاء في المترجم (على سبيل المثال، بسبب خطأ، تم السماح باستعارة حقول الهياكل المعبأة في كتل آمنة). لن يتم دعم مثل هذه التركيبات في الإصدار المستقبلي من Rust.
  • يتمتع كل من Cargo وrustc بقدرة مضمنة على إنشاء ملفات قابلة للتنفيذ مجردة من بيانات تصحيح الأخطاء (strip = "debuginfo") والرموز (strip = "symbols")، دون الحاجة إلى استدعاء أداة مساعدة منفصلة. يتم تنفيذ إعداد التنظيف من خلال معلمة "الشريط" في Cargo.toml: [profile.release] strip = "debuginfo"، "symbols"
  • يتم تعطيل التجميع المتزايد بشكل افتراضي. يُقال إن السبب هو حل مؤقت لخلل في المترجم يؤدي إلى حدوث أعطال وأخطاء في إلغاء التسلسل. لقد تم بالفعل إعداد إصلاح الأخطاء وسيتم تضمينه في الإصدار التالي. لإرجاع الترجمة التزايدية، يمكنك استخدام متغير البيئة RUSTC_FORCE_INCREMENTAL=1.
  • تم نقل جزء جديد من واجهة برمجة التطبيقات إلى فئة المستقر ، بما في ذلك تم تثبيت طرق وتطبيقات السمات:
    • std::thread::available_parallelism
    • النتيجة::منسوخة
    • النتيجة::استنساخ
    • القوس :: asm!
    • القوس::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom لـ u8
    • char::TryFromCharError (استنساخ، تصحيح، عرض، PartialEq، نسخ، معادل، خطأ)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator لبنية ToLowercase
    • DoubleEndedIterator لبنية ToUppercase
    • TryFrom<&mut [T]> لـ [T; ن]
    • UnwindSafe للهيكل مرة واحدة
    • RefUnwindSafe لمرة واحدة
    • وظائف دعم نيون Armv8 مدمجة في المترجم لـ Aarch64
  • تُستخدم خاصية "const" ، التي تحدد إمكانية استخدامها في أي سياق بدلاً من الثوابت ، في الدوال:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

المصدر: opennet.ru

إضافة تعليق