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

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

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

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

  • เพิ่มโหมดการคอมไพล์ไปป์ไลน์ (ไปป์ไลน์) ซึ่งการสร้างแพ็คเกจลังที่ขึ้นต่อกันจะเริ่มต้นทันทีที่ข้อมูลเมตาการขึ้นต่อกันพร้อมใช้งาน โดยไม่ต้องรอให้การคอมไพล์เสร็จสิ้น เมื่อรวบรวมแพ็คเกจ ไม่จำเป็นต้องประกอบการขึ้นต่อกันอย่างสมบูรณ์ เพียงกำหนดข้อมูลเมตาซึ่งรวมถึงรายการประเภท การขึ้นต่อกัน และองค์ประกอบที่ส่งออก ข้อมูลเมตาจะพร้อมใช้งานตั้งแต่เนิ่นๆ ของกระบวนการคอมไพล์ ดังนั้น แพ็คเกจที่เชื่อมโยงจึงสามารถคอมไพล์ได้เร็วกว่ามาก เมื่อสร้างแพ็คเกจเดี่ยว โหมดที่เสนอจะไม่ส่งผลต่อประสิทธิภาพ แต่หากบิลด์ครอบคลุมแพ็คเกจที่มีการพึ่งพาแบบแยกสาขา เวลาในการสร้างโดยรวมจะลดลง 10-20%
  • ช่วยให้มั่นใจได้ถึงการตรวจจับการใช้ฟังก์ชันที่ไม่ถูกต้อง std::mem::ไม่ได้กำหนดค่าเริ่มต้น и มาตรฐาน::mem::ศูนย์. ตัวอย่างเช่น std::mem::uninitialized สะดวกสำหรับการสร้างอาร์เรย์อย่างรวดเร็ว แต่จะทำให้คอมไพลเลอร์เข้าใจผิดเนื่องจากดูเหมือนว่าจะเตรียมใช้งาน แต่ในความเป็นจริงแล้ว ค่ายังคงไม่ได้เตรียมใช้งาน ฟังก์ชั่น mem::uninitialized ถูกทำเครื่องหมายว่าเลิกใช้แล้ว และขอแนะนำให้ใช้ประเภทกลางแทน บางทียูนิต. สำหรับ mem::zeroed ฟังก์ชันนี้อาจทำให้เกิดปัญหากับประเภทที่ไม่สามารถยอมรับค่าศูนย์ได้

    เพื่อช่วยระบุพฤติกรรมที่ไม่ได้กำหนด รุ่นใหม่จะเพิ่มการตรวจสอบผ้าสำลีให้กับคอมไพเลอร์ที่ตรวจพบปัญหาบางอย่างกับ mem::unitialized หรือ mem::zeroed ตัวอย่างเช่น ตอนนี้คุณได้รับข้อผิดพลาดเมื่อพยายามใช้ mem::unitialized หรือ mem::zeroed ด้วยประเภท &T และ Box‹T› ซึ่งแสดงถึงวัตถุตัวชี้ที่ไม่สามารถยอมรับค่า Null ได้

  • แอตทริบิวต์ “#[deprecated]” ได้รับการขยายเพื่อให้สามารถทำเครื่องหมายบรรจุภัณฑ์แบบลังว่าล้าสมัยและกำหนดเวลาสำหรับการลบในอนาคต ตั้งแต่ Rust 1.38 คุณลักษณะนี้สามารถใช้กับมาโครได้เช่นกัน
  • เพิ่มความสามารถในการใช้แอตทริบิวต์ “#[global_allocator]” ในโมดูลย่อย
  • เพิ่มคุณสมบัติแล้ว มาตรฐาน::ใด ๆ ::type_nameซึ่งช่วยให้คุณค้นหาชื่อประเภทซึ่งอาจมีประโยชน์สำหรับการแก้ไขจุดบกพร่อง ตัวอย่างเช่น ในระหว่างการทำงานของโปรแกรม คุณสามารถดูได้ว่าฟังก์ชันนี้เรียกว่าประเภทใด:

    fn gen_value‹T: ค่าเริ่มต้น>() -› T {
    println!("กำลังเริ่มต้นอินสแตนซ์ของ {}", std::any::type_name::‹T›());
    ค่าเริ่มต้น::ค่าเริ่มต้น()
    }

    fnmain() {
    ให้ _: i32 = gen_value(); # "i32" จะถูกพิมพ์
    ให้ _: String = gen_value(); # จะพิมพ์ "alloc::string::String"
    }

  • ฟังก์ชั่นเพิ่มเติมของไลบรารีมาตรฐาน:
    • ชิ้น :: {concat, เชื่อมต่อ, เข้าร่วม} ตอนนี้สามารถรับค่า &[T] นอกเหนือจาก &T;
    • ตอนนี้ "*const T" และ "*mut T" ใช้ marker::Unpin;
    • "Arc‹[T]›" และ "Rc‹[T]›" ตอนนี้ใช้ FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} ตอนนี้ใช้ DoubleEndedIterator
    • ascii::EscapeDefault ใช้ Clone และ Display
  • ส่วนใหม่ของ API ได้ถูกถ่ายโอนไปยังหมวดหมู่ที่เสถียร รวมถึงวิธีการที่ได้รับความเสถียรด้วย
    • ‹*const T›::ส่ง, ‹*mut T›::ส่ง,
    • ระยะเวลา::as_secs_f{32|64},
    • ระยะเวลา::div_duration_f{32|64},
    • ระยะเวลา::div_f{32|64},
    • ระยะเวลา::from_secs_f{32|64},
    • ระยะเวลา::mul_f{32|64},
    • การดำเนินการหารด้วยส่วนที่เหลือ
      div_euclid และ rem_euclid สำหรับจำนวนเต็มดั้งเดิมทั้งหมด

  • เพิ่มการรองรับสำหรับการระบุตัวเลือก “--คุณสมบัติ” หลายครั้งเพื่อเปิดใช้งานคุณสมบัติที่แตกต่างกันในตัวจัดการแพ็คเกจสินค้า
  • คอมไพเลอร์จัดเตรียมส่วนที่สาม ชั้น รองรับแพลตฟอร์มเป้าหมาย aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc เป้าหมาย, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl และ riscv32i-unknown-none-elf ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติและการเผยแพร่งานสร้างอย่างเป็นทางการ

ที่มา: opennet.ru

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