การเปิดตัวภาษาการเขียนโปรแกรม Rust 1.39

ที่ตีพิมพ์ การเปิดตัวภาษาโปรแกรมระบบ สนิม 1.39ก่อตั้งโดยโครงการ Mozilla ภาษามุ่งเน้นไปที่ความปลอดภัยของหน่วยความจำ ให้การจัดการหน่วยความจำอัตโนมัติ และจัดเตรียมวิธีการเพื่อให้บรรลุการทำงานแบบขนานที่มีงานสูงโดยไม่ต้องใช้ตัวรวบรวมขยะหรือรันไทม์

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

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

  • มีเสถียรภาพ ไวยากรณ์การเขียนโปรแกรมแบบอะซิงโครนัสใหม่ที่ใช้ฟังก์ชัน "async" บล็อก async move { ... } และตัวดำเนินการ ".await" ซึ่งช่วยให้เขียนตัวจัดการที่ไม่บล็อกโฟลว์คำสั่งหลักได้ง่ายขึ้น เมื่อเปรียบเทียบกับ API ที่นำเสนอก่อนหน้านี้สำหรับ I/O แบบอะซิงโครนัส โครงสร้าง async/.await นั้นเข้าใจง่าย อ่านได้สูง และช่วยให้คุณสามารถปรับใช้การโต้ตอบแบบอะซิงโครนัสที่ซับซ้อนได้โดยใช้เทคนิคการควบคุมโฟลว์ที่คุ้นเคยโดยอิงตามลูป คำสั่งแบบมีเงื่อนไข และข้อยกเว้น

    ไวยากรณ์รอแบบ Async ช่วยให้คุณสร้างฟังก์ชันที่สามารถหยุดการดำเนินการชั่วคราว คืนการควบคุมไปยังเธรดหลัก และจากนั้นดำเนินการดำเนินการต่อจากจุดที่ค้างไว้ ตัวอย่างเช่น จำเป็นต้องหยุดชั่วคราวเมื่อประมวลผล I/O ซึ่งงานอื่นสามารถทำได้ในขณะที่รอข้อมูลชิ้นต่อไปมาถึง ฟังก์ชั่นและบล็อกที่กำหนดด้วย "async fn" และ "async move" จะส่งคืนลักษณะ อนาคตซึ่งกำหนดการแสดงการคำนวณแบบอะซิงโครนัสที่เลื่อนออกไป คุณสามารถเริ่มการคำนวณแบบเลื่อนออกไปได้โดยตรงและรับผลลัพธ์โดยใช้ตัวดำเนินการ ".await" ไม่มีการดำเนินการหรือการวางแผนล่วงหน้าจนกว่าจะมีการเรียก .await ทำให้สามารถสร้างโครงสร้างที่ซ้อนกันที่ซับซ้อนได้โดยไม่มีค่าใช้จ่ายเพิ่มเติม

    async fn first_function() -> u32 { .. }
    ...
    ให้อนาคต = first_function();
    ...
    ให้ผลลัพธ์: u32 = Future.await;

  • มีเสถียรภาพ "#![feature(bind_by_move_pattern_guards)]" ช่วยให้สามารถใช้ตัวแปรที่มีประเภทการเชื่อมโยง "โดย-ย้าย" ในเทมเพลตและใช้การอ้างอิงถึงตัวแปรเหล่านี้ในส่วน "if" ของนิพจน์ "การจับคู่". ตัวอย่างเช่น ขณะนี้อนุญาตให้มีการก่อสร้างต่อไปนี้:

    fnmain() {
    ให้อาร์เรย์: กล่อง<[u8; 4]> = กล่อง::ใหม่([1, 2, 3, 4]);

    จับคู่อาร์เรย์ {
    เลข
    ถ้า nums.iter().sum::() == 10

    => {
    หล่น (ตัวเลข);
    }
    _ => ไม่สามารถเข้าถึงได้!(),
    }
    }

  • อนุญาตให้บ่งชี้ได้ คุณลักษณะ เมื่อกำหนดพารามิเตอร์ฟังก์ชัน การปิด และตัวชี้ฟังก์ชัน รองรับแอตทริบิวต์การคอมไพล์แบบมีเงื่อนไข (cfg, cfg_attr) ที่ควบคุมการวินิจฉัยผ่าน Lint (อนุญาต เตือน ปฏิเสธ และห้าม) และแอตทริบิวต์การเรียกมาโครเสริมได้รับการสนับสนุน

    FN เลน(
    #[cfg(windows)] ชิ้น: &[u16], // ใช้พารามิเตอร์บน Windows
    #[cfg(not(windows))] Slice: &[u8], // ใช้ในระบบปฏิบัติการอื่น
    ) -> ใช้ {
    ชิ้น.len()
    }

  • คำเตือนเกี่ยวกับปัญหาที่ระบุเมื่อตรวจสอบการยืมตัวแปร (ตัวตรวจสอบการยืม) โดยใช้เทคนิค NLL (Non-Lexical Lifetimes) แปลแล้ว อยู่ในหมวดหมู่ของข้อผิดพลาดร้ายแรง ให้เราระลึกว่าระบบการตรวจสอบที่ใช้กลไกใหม่ในการพิจารณาอายุการใช้งานของตัวแปรที่ยืมมาทำให้สามารถระบุปัญหาบางอย่างที่รหัสยืนยันเก่าไม่มีใครสังเกตเห็นได้ เนื่องจากเอาต์พุตข้อผิดพลาดสำหรับการตรวจสอบดังกล่าวอาจส่งผลต่อความเข้ากันได้กับโค้ดที่ทำงานก่อนหน้านี้ จึงมีการออกคำเตือนตั้งแต่แรกแทนข้อผิดพลาด คำเตือนได้ถูกแทนที่ด้วยข้อผิดพลาดเมื่อทำงานในโหมด Rust 2018 ในรุ่นถัดไป เอาต์พุตข้อผิดพลาดจะถูกนำมาใช้ในโหมด Rust 2015 ซึ่งในที่สุดจะกำจัดตัวตรวจสอบการยืมแบบเก่าออกไป
  • คุณลักษณะ “const” ซึ่งกำหนดความเป็นไปได้ของการใช้งานในบริบทใดๆ แทนค่าคงที่ ใช้สำหรับฟังก์ชัน Vec::new, String::new, LinkedList::new, str::len, [T]::len , STR::as_bytes,
    เอบีเอส, wrap_abs และล้น_abs;

  • ส่วนใหม่ของ API ได้ถูกถ่ายโอนไปยังหมวดหมู่ที่เสถียร รวมถึงวิธีการที่ได้รับความเสถียรด้วย
    ปักหมุด::into_inner, Instant::checked_duration_since และ Instant::saturating_duration_since;

  • ขณะนี้ตัวจัดการแพ็คเกจสินค้าสามารถใช้นามสกุล “.toml” สำหรับไฟล์การกำหนดค่าได้แล้ว เพิ่มการสนับสนุนเบื้องต้นสำหรับการสร้างห้องสมุดมาตรฐานโดยตรงจาก Cargo เพิ่มแฟล็ก "--พื้นที่ทำงาน" โดยแทนที่แฟล็ก "--ทั้งหมด" ที่เป็นที่ถกเถียงกัน มีการเพิ่มฟิลด์ใหม่ลงในข้อมูลเมตา "ประกาศ“ ซึ่งช่วยให้คุณสามารถเผยแพร่การอ้างอิงโดยระบุแท็ก git และหมายเลขเวอร์ชัน เพิ่มตัวเลือกการทดสอบ "-Ztimings" เพื่อสร้างรายงาน HTML ของเวลาดำเนินการของขั้นตอนการคอมไพล์ต่างๆ
  • ในคอมไพเลอร์สนิม ข้อความวินิจฉัยรวมถึงการตัดแต่งส่วนท้ายของโค้ดที่ไม่พอดีกับเทอร์มินัล ให้การสนับสนุนระดับที่สามสำหรับแพลตฟอร์มเป้าหมาย
    i686-unknown-uefi และ sparc64-unknown-openbsd. ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติและการเผยแพร่งานสร้างอย่างเป็นทางการ

ที่มา: opennet.ru

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