การเปิดตัวของภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปของ Rust 1.73 ซึ่งก่อตั้งโดยโครงการ Mozilla แต่ปัจจุบันได้รับการพัฒนาภายใต้การอุปถัมภ์ขององค์กรอิสระ Rust Foundation ที่ไม่แสวงหาผลกำไร ได้รับการเผยแพร่แล้ว ภาษานี้เน้นไปที่ความปลอดภัยของหน่วยความจำและให้แนวทางเพื่อให้ได้งานที่มีความเท่าเทียมกันสูง ในขณะที่หลีกเลี่ยงการใช้ตัวรวบรวมขยะและรันไทม์ (รันไทม์จะลดลงเหลือเพียงการเริ่มต้นพื้นฐานและการบำรุงรักษาไลบรารีมาตรฐาน)
วิธีการจัดการหน่วยความจำของ Rust ช่วยนักพัฒนาจากข้อผิดพลาดเมื่อจัดการพอยน์เตอร์และป้องกันปัญหาที่เกิดขึ้นเนื่องจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงพื้นที่หน่วยความจำหลังจากปล่อยให้ว่าง การยกเลิกการอ้างอิงพอยน์เตอร์ null บัฟเฟอร์เกิน เป็นต้น เพื่อแจกจ่ายไลบรารี่ จัดเตรียมการสร้างและจัดการการอ้างอิง โครงการพัฒนาตัวจัดการแพ็คเกจสินค้า ที่เก็บ crates.io รองรับการโฮสต์ไลบรารี
ความปลอดภัยของหน่วยความจำมีให้ใน Rust ณ เวลาคอมไพล์ผ่านการตรวจสอบการอ้างอิง การติดตามความเป็นเจ้าของออบเจกต์ การติดตามอายุอ็อบเจ็กต์ (ขอบเขต) และการประเมินความถูกต้องของการเข้าถึงหน่วยความจำระหว่างการดำเนินการโค้ด สนิมยังให้การป้องกันการล้นของจำนวนเต็ม, จำเป็นต้องมีการกำหนดค่าเริ่มต้นที่จำเป็นของค่าตัวแปรก่อนใช้งาน, จัดการข้อผิดพลาดได้ดีขึ้นในไลบรารีมาตรฐาน, ใช้แนวคิดของการอ้างอิงและตัวแปรที่ไม่เปลี่ยนรูปแบบตามค่าเริ่มต้น, เสนอการพิมพ์แบบคงที่ที่แข็งแกร่งเพื่อลดข้อผิดพลาดเชิงตรรกะ
นวัตกรรมหลัก:
- ตัวจัดการ panic เริ่มต้นได้ออกแบบข้อความที่ส่งคืนใหม่ ข้อความที่ระบุในแมโคร "panic!" จะแสดงแยกบรรทัดโดยไม่มีเครื่องหมายคำพูด ทำให้อ่านข้อความได้ง่ายขึ้นและลดความสับสนเมื่อใช้เครื่องหมายคำพูดซ้อน หรือเมื่อขยายหลายบรรทัด fn main() { let file = "ferris.txt"; panic!("oh no! {file:?} not found!"); } เธรด 'main' เกิดอาการ panic ที่ 'oh no! "ferris.txt" not found!', src/main.rs:3:5 เธรด 'main' เกิดอาการ panic ที่ src/main.rs:3:5: oh no! "ferris.txt" not found!
เอาท์พุตของข้อความที่แสดงเมื่อทริกเกอร์แมโคร "assert_eq" และ "assert_ne" ก็ได้รับการแก้ไขใหม่แล้ว fn main() { assert_eq!("🦀", "🐟", "ferris is not a fish"); } เธรด 'main' ตกใจที่ 'assertion failed: `(left == right)` left: `»🦀»`, right: `»🐟»`: ferris is not a fish', src/main.rs:2:5 เธรด 'main' ตกใจที่ src/main.rs:2:5: assertion `left == right` failed: ferris is not a fish left: "🦀" right: "🐟"
- ตาม RFC 3184 ได้มีการเพิ่มความสามารถในการจัดการคีย์เฉพาะเธรด (thread_local) ของที่จัดเก็บ LocalKey ได้โดยตรง > และ LocalKey > โดยใช้เมธอด get(), set(), take() และ replace() แทนที่จะใช้การปิด "with(|inner| ...)" ซึ่งหลีกเลี่ยงการรันโค้ดการเริ่มต้นเพิ่มเติมสำหรับค่าเริ่มต้นที่กำหนดไว้สำหรับเธรดใหม่โดยใช้แมโคร "thread_local!" thread_local! { static THINGS: Cell > = Cell::new(Vec::new()); } fn f() { // เคยเป็น THINGS.with(|i| i.set(vec![1, 2, 3])); // กลายเป็น THINGS.set(vec![1, 2, 3]); // ... // เคยเป็น let v = THINGS.with(|i| i.take()); // กลายเป็น let v: Vec = สิ่งของ.นำ(); }
- ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ของความเสถียร ซึ่งรวมถึงวิธีการและการใช้งานลักษณะต่างๆ ที่ได้รับการทำให้เสถียร:
- ไม่มีเครื่องหมาย {integer}::div_ceil
- {integer} ที่ไม่มีเครื่องหมาย::next_multiple_of
- {integer} ที่ไม่มีเครื่องหมาย::checked_next_multiple_of
- std::ffi::FromBytesUntilNulError
- มาตรฐาน::os::unix::fs::chown
- std::os::unix::fs::fchown
- std::os::unix::fs::lfchown
- คีย์ท้องถิ่น:: >::รับ
- คีย์ท้องถิ่น:: >::ตั้งค่า
- คีย์ท้องถิ่น:: >::รับ
- คีย์ท้องถิ่น:: >::แทนที่
- คีย์ท้องถิ่น:: >::ด้วยการยืม
- คีย์ท้องถิ่น:: >::with_borrow_mut
- คีย์ท้องถิ่น:: >::ตั้งค่า
- คีย์ท้องถิ่น:: >::รับ
- คีย์ท้องถิ่น:: >::แทนที่
- คุณลักษณะ “const” ซึ่งกำหนดความเป็นไปได้ในการใช้งานในบริบทใดๆ แทนที่จะเป็นค่าคงที่ ถูกใช้ในฟังก์ชัน:
- rc::Weak::new
- ซิงค์::อ่อนแอ::ใหม่
- NonNull::as_ref
- คอมไพเลอร์ช่วยให้สามารถบันทึกข้อมูลเวอร์ชันในส่วน ".comment" ได้ คล้ายกับ GCC และ Clang
- มีการนำการรองรับระดับ 3 มาใช้กับแพลตฟอร์ม aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl และ x86_64-unknown-linux-ohos ระดับ 3 ให้การสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติ การสร้างอย่างเป็นทางการ หรือการตรวจสอบการสร้าง
- การสนับสนุนระดับที่สองสำหรับแพลตฟอร์มเป้าหมาย wasm32-wasi-preview1-threads ได้ถูกนำไปใช้แล้ว การสนับสนุนระดับที่สองนี้รวมถึงการรับประกันการสร้าง
ที่มา: opennet.ru
