การเปิดตัวภาษาโปรแกรมอเนกประสงค์ Rust 1.58 ซึ่งก่อตั้งโดยโครงการ Mozilla แต่ปัจจุบันได้รับการพัฒนาภายใต้การอุปถัมภ์ของ Rust Foundation องค์กรอิสระที่ไม่แสวงหาผลกำไรได้รับการเผยแพร่แล้ว ภาษามุ่งเน้นไปที่ความปลอดภัยของหน่วยความจำ ให้การจัดการหน่วยความจำอัตโนมัติ และจัดเตรียมวิธีการเพื่อให้บรรลุการทำงานแบบขนานในระดับสูงโดยไม่ต้องใช้ตัวรวบรวมขยะหรือรันไทม์ (รันไทม์ลดลงเหลือเพียงการเริ่มต้นขั้นพื้นฐานและการบำรุงรักษาไลบรารีมาตรฐาน)
การจัดการหน่วยความจำอัตโนมัติของ Rust ช่วยนักพัฒนาจากข้อผิดพลาดเมื่อจัดการพอยน์เตอร์และป้องกันปัญหาที่เกิดขึ้นเนื่องจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงพื้นที่หน่วยความจำหลังจากปล่อยให้ว่าง การอ้างอิงพอยน์เตอร์ว่าง บัฟเฟอร์เกิน ฯลฯ เพื่อแจกจ่ายไลบรารี่ จัดเตรียมการสร้างและจัดการการอ้างอิง โครงการพัฒนาตัวจัดการแพ็คเกจสินค้า ที่เก็บ crates.io รองรับการโฮสต์ไลบรารี
นวัตกรรมหลัก:
- ในบล็อกการจัดรูปแบบบรรทัด นอกเหนือจากความสามารถที่มีอยู่ก่อนหน้านี้ในการแทนที่ตัวแปรที่แสดงไว้อย่างชัดเจนหลังบรรทัดตามหมายเลขและชื่อแล้ว ยังมีการนำความสามารถในการแทนที่ตัวระบุที่กำหนดเองโดยการเพิ่มนิพจน์ “{identifier}” ลงในบรรทัดอีกด้วย ตัวอย่างเช่น: // โครงสร้างที่รองรับก่อนหน้านี้: println!("Hello, {}!", get_person()); println!("สวัสดี {0}!", get_person()); println!("สวัสดี {person}!", person = get_person()); // ตอนนี้คุณสามารถระบุได้ ให้บุคคล = get_person(); println!("สวัสดี {บุคคล}!");
ตัวระบุสามารถระบุได้โดยตรงในตัวเลือกการจัดรูปแบบ ให้ (ความกว้าง, ความแม่นยำ) = get_format(); สำหรับ (ชื่อ, คะแนน) ใน get_scores() { println!("{name}: {score:width$.precision$}"); }
การทดแทนใหม่ใช้งานได้กับมาโครทั้งหมดที่รองรับการกำหนดรูปแบบสตริง ยกเว้นมาโคร “ตื่นตระหนก!” ในภาษา Rust เวอร์ชัน 2015 และ 2018 ซึ่ง panic!("{ident}") จะถือเป็นสตริงปกติ (ใน Rust 2021 การทดแทนจะทำงาน)
- ลักษณะการทำงานของโครงสร้างคำสั่ง std::process::Command บนแพลตฟอร์ม Windows มีการเปลี่ยนแปลง ดังนั้นเมื่อดำเนินการคำสั่ง ด้วยเหตุผลด้านความปลอดภัย จะไม่ค้นหาไฟล์ปฏิบัติการในไดเร็กทอรีปัจจุบันอีกต่อไป ไดเร็กทอรีปัจจุบันถูกแยกออก เนื่องจากสามารถใช้เพื่อรันโค้ดที่เป็นอันตรายได้ หากโปรแกรมทำงานในไดเร็กทอรีที่ไม่น่าเชื่อถือ (CVE-2021-3013) ตรรกะการตรวจจับปฏิบัติการใหม่เกี่ยวข้องกับการค้นหาไดเร็กทอรี Rust, ไดเร็กทอรีแอปพลิเคชัน, ไดเร็กทอรีระบบ Windows และไดเร็กทอรีที่ระบุในตัวแปรสภาพแวดล้อม PATH
- ไลบรารีมาตรฐานได้ขยายจำนวนฟังก์ชันที่ทำเครื่องหมาย "#[must_use]" เพื่อออกคำเตือนหากละเว้นค่าที่ส่งคืน ซึ่งช่วยระบุข้อผิดพลาดที่เกิดจากการสมมติว่าฟังก์ชันจะเปลี่ยนค่าแทนที่จะส่งคืนค่าใหม่
- ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ของความเสถียร ซึ่งรวมถึงวิธีการและการใช้งานลักษณะต่างๆ ที่ได้รับการทำให้เสถียร:
- ข้อมูลเมตา::is_symlink
- เส้นทาง::is_symlink
- {จำนวนเต็ม}::saturating_div
- ตัวเลือก::unwrap_unchecked
- ผลลัพธ์::unwrap_unchecked
- ผลลัพธ์::unwrap_err_unchecked
- คุณลักษณะ “const” ซึ่งกำหนดความเป็นไปได้ในการใช้งานในบริบทใดๆ แทนที่จะเป็นค่าคงที่ ถูกใช้ในฟังก์ชัน:
- ระยะเวลา::ใหม่
- Duration::checked_add
- ระยะเวลา::saturating_add
- Duration::checked_sub
- ระยะเวลา::saturating_sub
- ระยะเวลา::checked_mul
- ระยะเวลา::saturating_mul
- ระยะเวลา::checked_div
- อนุญาตให้มีการยกเลิกการอ้างอิงตัวชี้ "* const T" ในบริบท "const"
- ในตัวจัดการแพ็คเกจ Cargo ฟิลด์rust_versionได้ถูกเพิ่มเข้าไปในข้อมูลเมตาของแพ็คเกจแล้ว และตัวเลือก “--message-format” ได้ถูกเพิ่มในคำสั่ง “cargo install”
- คอมไพลเลอร์ใช้การสนับสนุนกลไกการป้องกัน CFI (Control Flow Integrity) ซึ่งจะเพิ่มการตรวจสอบก่อนการเรียกทางอ้อมแต่ละครั้งเพื่อตรวจจับพฤติกรรมที่ไม่ได้กำหนดบางรูปแบบซึ่งอาจนำไปสู่การละเมิดลำดับการดำเนินการปกติ (โฟลว์การควบคุม) อันเป็นผลมาจาก การใช้ช่องโหว่ที่เปลี่ยนพอยน์เตอร์ที่เก็บไว้ในหน่วยความจำในฟังก์ชัน
- คอมไพลเลอร์ได้เพิ่มการรองรับเวอร์ชัน 5 และ 6 ของรูปแบบการเปรียบเทียบความครอบคลุม LLVM ซึ่งใช้ในการประเมินการครอบคลุมโค้ดระหว่างการทดสอบ
- ในคอมไพเลอร์ ข้อกำหนดสำหรับเวอร์ชันขั้นต่ำของ LLVM จะเพิ่มขึ้นเป็น LLVM 12
- การสนับสนุนระดับที่สามสำหรับแพลตฟอร์ม x86_64-unknown-none ได้ถูกนำมาใช้แล้ว ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติ การเผยแพร่บิลด์อย่างเป็นทางการ หรือการตรวจสอบว่าสามารถสร้างโค้ดได้หรือไม่
นอกจากนี้เรายังสามารถสังเกตการตีพิมพ์ของ Microsoft เกี่ยวกับการเปิดตัวไลบรารี Rust สำหรับ Windows 0.30 ซึ่งอนุญาตให้คุณใช้ภาษา Rust เพื่อพัฒนาแอปพลิเคชันสำหรับ Windows OS ชุดนี้ประกอบด้วยแพ็คเกจลังสองชุด (windows และ windows-sys) ซึ่งคุณสามารถเข้าถึง Win API ในโปรแกรม Rust ได้ โค้ดสำหรับการสนับสนุน API ถูกสร้างขึ้นแบบไดนามิกจากข้อมูลเมตาที่อธิบาย API ซึ่งช่วยให้คุณสามารถดำเนินการสนับสนุนได้ไม่เฉพาะสำหรับการเรียก Win API ที่มีอยู่เท่านั้น แต่สำหรับการโทรที่จะปรากฏในอนาคต เวอร์ชันใหม่เพิ่มการรองรับแพลตฟอร์มเป้าหมาย UWP (Universal Windows Platform) และใช้ประเภท Handle และ Debug
ที่มา: opennet.ru