การเปิดตัวของภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปของ Rust 1.77 ซึ่งก่อตั้งโดยโครงการ Mozilla แต่ปัจจุบันได้รับการพัฒนาภายใต้การอุปถัมภ์ขององค์กรอิสระ Rust Foundation ที่ไม่แสวงหาผลกำไร ได้รับการเผยแพร่แล้ว ภาษานี้เน้นไปที่ความปลอดภัยของหน่วยความจำและให้แนวทางเพื่อให้ได้งานที่มีความเท่าเทียมกันสูง ในขณะที่หลีกเลี่ยงการใช้ตัวรวบรวมขยะและรันไทม์ (รันไทม์จะลดลงเหลือเพียงการเริ่มต้นพื้นฐานและการบำรุงรักษาไลบรารีมาตรฐาน)
วิธีการจัดการหน่วยความจำของ Rust ช่วยนักพัฒนาจากข้อผิดพลาดเมื่อจัดการพอยน์เตอร์และป้องกันปัญหาที่เกิดขึ้นเนื่องจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงพื้นที่หน่วยความจำหลังจากปล่อยให้ว่าง การยกเลิกการอ้างอิงพอยน์เตอร์ null บัฟเฟอร์เกิน เป็นต้น เพื่อแจกจ่ายไลบรารี่ จัดเตรียมการสร้างและจัดการการอ้างอิง โครงการพัฒนาตัวจัดการแพ็คเกจสินค้า ที่เก็บ crates.io รองรับการโฮสต์ไลบรารี
ความปลอดภัยของหน่วยความจำมีให้ใน Rust ณ เวลาคอมไพล์ผ่านการตรวจสอบการอ้างอิง การติดตามความเป็นเจ้าของออบเจกต์ การติดตามอายุอ็อบเจ็กต์ (ขอบเขต) และการประเมินความถูกต้องของการเข้าถึงหน่วยความจำระหว่างการดำเนินการโค้ด สนิมยังให้การป้องกันการล้นของจำนวนเต็ม, จำเป็นต้องมีการกำหนดค่าเริ่มต้นที่จำเป็นของค่าตัวแปรก่อนใช้งาน, จัดการข้อผิดพลาดได้ดีขึ้นในไลบรารีมาตรฐาน, ใช้แนวคิดของการอ้างอิงและตัวแปรที่ไม่เปลี่ยนรูปแบบตามค่าเริ่มต้น, เสนอการพิมพ์แบบคงที่ที่แข็งแกร่งเพื่อลดข้อผิดพลาดเชิงตรรกะ
นวัตกรรมหลัก:
- เพิ่มการรองรับตัวอักษรสำหรับสตริง C (c"ข้อความ") ซึ่งจัดเก็บไว้ในหน่วยความจำด้วยอักขระที่สิ้นสุดด้วยค่า null และเชื่อมโยงกับประเภท "CStr" คาดว่าการสนับสนุน C-string จะทำให้การเขียนโค้ดที่โต้ตอบกับเลเยอร์ในภาษาการเขียนโปรแกรมที่ใช้สตริงที่สิ้นสุดด้วยค่า null ง่ายขึ้น และจะช่วยให้มีการตรวจสอบที่จำเป็นในขั้นตอนการคอมไพล์ const สวัสดี: &core::ffi::CStr = c"สวัสดีชาวโลก!";
- ในฟังก์ชันที่ดำเนินการแบบอะซิงโครนัสที่ประกาศโดยใช้นิพจน์ "async fn" อนุญาตให้ใช้การเรียกซ้ำได้ เช่น ฟังก์ชันดังกล่าวสามารถเรียกตัวเองได้แล้ว async fn fib (n: u32) -> u32 { ตรงกับ n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
- มาโคร offset_of! มีความเสถียร ทำให้คุณสามารถกำหนดออฟเซ็ตไบต์ของฟิลด์ของโครงสร้าง การแจงนับ ยูเนียน และทูเปิล โดยสัมพันธ์กับจุดเริ่มต้นของประเภท ในทางปฏิบัติ แมโครอาจมีประโยชน์ในสถานการณ์ที่คุณต้องทำงานในระดับออฟเซ็ตฟิลด์ในกรณีที่ไม่มีอินสแตนซ์ประเภทนั้น โดยเฉพาะอย่างยิ่ง จำเป็นต้องมีฟังก์ชัน offset_of เมื่อพัฒนาส่วนประกอบระดับต่ำ เช่น ไดรเวอร์ ใช้ std::mem; # [repr (C)] struct FieldStruct { แรก: u8 ที่สอง: u16 ที่สาม: u8 } assert_eq! (mem::offset_of! (FieldStruct แรก) 0); assert_eq!(mem::offset_of!(FieldStruct วินาที), 2); assert_eq!(mem::offset_of!(FieldStruct, สาม), 4);
- ในตัวจัดการแพ็คเกจ Cargo ในโปรไฟล์รีลีส การล้างไฟล์จากข้อมูลการดีบักจะถูกเปิดใช้งานตามค่าเริ่มต้น (strip = “debuginfo”) เว้นแต่ว่าโหมดดีบั๊กจะถูกเปิดใช้งานอย่างชัดเจนในโปรไฟล์ Cargo เช่น ถ้าพารามิเตอร์ debug = 0
- ตัวเลือก "-Zthir-unsafeck=on" ถูกเปิดใช้งานตามค่าเริ่มต้น โดยให้การตรวจสอบที่ไม่ปลอดภัยสำหรับ THIR (การเป็นตัวแทนระดับกลางระดับสูงที่พิมพ์)
- เพิ่มการตรวจสอบผ้าสำลีสำหรับ static_mut_refs เพื่อแสดงคำเตือนเมื่อใช้การอ้างอิงถึงค่าคงที่ที่ไม่แน่นอน
- ความสามารถในการใช้ประเภท “จาก<&[T;” ได้ถูกนำมาใช้แล้ว N]>" สำหรับประเภท "Cow<[T]>" fn foo (ข้อมูล: impl Into >) { /* … */ } fn main() { foo(&[“hello”, “world”]); -
- คอมไพเลอร์จัดเตรียมการจัดตำแหน่งของประเภท 16 ไบต์ i128 และ u128 สำหรับระบบ x86
- ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ของความเสถียร ซึ่งรวมถึงวิธีการและการใช้งานลักษณะต่างๆ ที่ได้รับการทำให้เสถียร:
- อาร์เรย์::each_ref
- อาร์เรย์::each_mut
- แกนหลัก::net
- f32::round_ties_even
- f64::round_ties_even
- บันทึก::offset_of!
- ชิ้น::first_chunk
- ชิ้น::first_chunk_mut
- ชิ้น::split_first_chunk
- ชิ้น :: split_first_chunk_mut
- ชิ้น::last_chunk
- ชิ้น::last_chunk_mut
- ชิ้น::split_last_chunk
- ชิ้น :: split_last_chunk_mut
- ชิ้น::chunk_by
- ชิ้น::chunk_by_mut
- ผูกมัด::แผนที่
- ไฟล์::create_new
- Mutex::clear_poison
- RwLock::clear_poison
- การสนับสนุนระดับที่สามได้ถูกนำมาใช้สำหรับแพลตฟอร์ม aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf และ riscv32im-risc0-zkvm-elf ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติ การเผยแพร่บิลด์อย่างเป็นทางการ หรือการตรวจสอบว่าสามารถสร้างโค้ดได้หรือไม่
ที่มา: opennet.ru
