การเปิดตัวภาษาการเขียนโปรแกรม Rust 1.59 พร้อมรองรับการแทรกแอสเซมบลี

การเปิดตัวของภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปของ Rust 1.59 ซึ่งก่อตั้งโดยโครงการ Mozilla แต่ปัจจุบันได้รับการพัฒนาภายใต้การอุปถัมภ์ขององค์กรอิสระ Rust Foundation ที่ไม่แสวงหาผลกำไร ได้รับการเผยแพร่แล้ว ภาษานี้เน้นไปที่ความปลอดภัยของหน่วยความจำและให้แนวทางเพื่อให้ได้งานที่มีความเท่าเทียมกันสูง ในขณะที่หลีกเลี่ยงการใช้ตัวรวบรวมขยะและรันไทม์ (รันไทม์จะลดลงเหลือเพียงการเริ่มต้นพื้นฐานและการบำรุงรักษาไลบรารีมาตรฐาน)

วิธีการจัดการหน่วยความจำของ Rust ช่วยนักพัฒนาจากข้อผิดพลาดเมื่อจัดการพอยน์เตอร์และป้องกันปัญหาที่เกิดขึ้นเนื่องจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงพื้นที่หน่วยความจำหลังจากปล่อยให้ว่าง การยกเลิกการอ้างอิงพอยน์เตอร์ null บัฟเฟอร์เกิน เป็นต้น เพื่อแจกจ่ายไลบรารี่ จัดเตรียมการสร้างและจัดการการอ้างอิง โครงการพัฒนาตัวจัดการแพ็คเกจสินค้า ที่เก็บ crates.io รองรับการโฮสต์ไลบรารี

ความปลอดภัยของหน่วยความจำมีให้ใน Rust ณ เวลาคอมไพล์ผ่านการตรวจสอบการอ้างอิง การติดตามความเป็นเจ้าของออบเจกต์ การติดตามอายุอ็อบเจ็กต์ (ขอบเขต) และการประเมินความถูกต้องของการเข้าถึงหน่วยความจำระหว่างการดำเนินการโค้ด สนิมยังให้การป้องกันการล้นของจำนวนเต็ม, จำเป็นต้องมีการกำหนดค่าเริ่มต้นที่จำเป็นของค่าตัวแปรก่อนใช้งาน, จัดการข้อผิดพลาดได้ดีขึ้นในไลบรารีมาตรฐาน, ใช้แนวคิดของการอ้างอิงและตัวแปรที่ไม่เปลี่ยนรูปแบบตามค่าเริ่มต้น, เสนอการพิมพ์แบบคงที่ที่แข็งแกร่งเพื่อลดข้อผิดพลาดเชิงตรรกะ

นวัตกรรมหลัก:

  • คุณสามารถใช้ส่วนแทรกภาษาแอสเซมบลีซึ่งเป็นที่ต้องการในแอปพลิเคชันที่ต้องการควบคุมการทำงานในระดับต่ำหรือสามารถใช้คำสั่งเครื่องพิเศษได้ ส่วนแทรกแอสเซมบลีถูกเพิ่มโดยใช้มาโคร "asm!" และ "global_asm!" ใช้ไวยากรณ์การจัดรูปแบบสตริงสำหรับการตั้งชื่อการลงทะเบียนคล้ายกับที่ใช้สำหรับการแทนที่สตริงใน Rust คอมไพลเลอร์รองรับคำแนะนำการประกอบสำหรับสถาปัตยกรรม x86, x86-64, ARM, AArch64 และ RISC-V ตัวอย่างการแทรก: ใช้ std::arch::asm; // คูณ x ด้วย 6 โดยใช้กะและเพิ่มให้ mut x: u64 = 4; ไม่ปลอดภัย { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "เพิ่ม {x}, {tmp}", x = inout (reg ) x, tmp = ออก(reg) _, ); } assert_eq!(x, 4 * 6);
  • เพิ่มการสนับสนุนสำหรับการกำหนดโครงสร้างแบบ destructed (ขนาน) ซึ่งมีการระบุลักษณะ ชิ้น หรือโครงสร้างหลายรายการทางด้านซ้ายของนิพจน์ ตัวอย่างเช่น: ให้ (a, b, c, d, e); (ก, ข) = (1, 2); [ค, .., ง, _] = [1, 2, 3, 4, 5]; โครงสร้าง { e, .. } = โครงสร้าง { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • เป็นไปได้ที่จะระบุค่าเริ่มต้นสำหรับ const generics: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn ใหม่(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • ตัวจัดการแพ็คเกจ Cargo ให้คำเตือนเกี่ยวกับการใช้โครงสร้างที่ไม่ถูกต้องในการขึ้นต่อกันที่ถูกประมวลผลเนื่องจากข้อผิดพลาดในคอมไพลเลอร์ (เช่น เนื่องจากข้อผิดพลาด ฟิลด์ของโครงสร้างที่แพ็กจึงได้รับอนุญาตให้ยืมในบล็อกที่ปลอดภัย) โครงสร้างดังกล่าวจะไม่ได้รับการรองรับใน Rust เวอร์ชันอนาคตอีกต่อไป
  • Cargo และrustc มีความสามารถในตัวในการสร้างไฟล์ปฏิบัติการที่แยกข้อมูลการดีบัก (strip = "debuginfo") และสัญลักษณ์ (strip = "สัญลักษณ์") โดยไม่จำเป็นต้องเรียกใช้ยูทิลิตีแยกต่างหาก การตั้งค่าการทำความสะอาดจะดำเนินการผ่านพารามิเตอร์ “strip” ใน Cargo.toml: [profile.release] strip = “debuginfo”, “สัญลักษณ์”
  • การคอมไพล์ส่วนเพิ่มถูกปิดใช้งานตามค่าเริ่มต้น เหตุผลดังกล่าวเป็นวิธีแก้ปัญหาชั่วคราวสำหรับจุดบกพร่องในคอมไพเลอร์ที่ทำให้เกิดข้อขัดข้องและข้อผิดพลาดในการดีซีเรียลไลซ์ มีการเตรียมการแก้ไขข้อบกพร่องไว้แล้วและจะรวมไว้ในรุ่นถัดไป หากต้องการส่งคืนการคอมไพล์ส่วนเพิ่ม คุณสามารถใช้ตัวแปรสภาพแวดล้อม RUSTC_FORCE_INCREMENTAL=1
  • ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ของความเสถียร ซึ่งรวมถึงวิธีการและการใช้งานลักษณะต่างๆ ที่ได้รับการทำให้เสถียร:
    • มาตรฐาน::thread::available_parallelism
    • ผลลัพธ์::คัดลอกแล้ว
    • ผลลัพธ์::โคลน
    • โค้ง::asm!
    • โค้ง::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • ลองจากสำหรับ u8
    • char::TryFromCharError (โคลน, ดีบัก, แสดงผล, PartialEq, คัดลอก, Eq, ข้อผิดพลาด)
    • มัน::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 สำหรับโครงสร้างตัวพิมพ์เล็ก
    • DoubleEndedIterator สำหรับโครงสร้าง ToUppercase
    • ลองจาก สำหรับ [T; ยังไม่มีข้อความ]
    • UnwindSafe สำหรับโครงสร้างครั้งเดียว
    • RefUnwindSafe อีกครั้ง
    • ฟังก์ชั่นรองรับนีออน armv8 ที่สร้างไว้ในคอมไพเลอร์สำหรับ aarch64
  • คุณลักษณะ “const” ซึ่งกำหนดความเป็นไปได้ในการใช้งานในบริบทใดๆ แทนที่จะเป็นค่าคงที่ ถูกใช้ในฟังก์ชัน:
    • mem::อาจจะUninit::as_ptr
    • mem::อาจจะUninit::assume_init
    • mem::อาจจะUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

ที่มา: opennet.ru

เพิ่มความคิดเห็น