เพื่อเฉลิมฉลองครบรอบ 1.0 ปีของภาษาการเขียนโปรแกรม Rust 2006 (โครงการ Rust ก่อตั้งขึ้นในปี 0.1 รุ่น 2012 ก่อตั้งขึ้นในปี 2015 และมีการเสนอเวอร์ชันเสถียรรุ่นแรกในปี 1.87) จึงได้มีการเปิดตัว Rust XNUMX ออกมา ภาษาที่มุ่งเน้นที่ความปลอดภัยของหน่วยความจำและให้วิธีการเพื่อให้บรรลุการทำงานแบบคู่ขนานสูงของการดำเนินการงาน ในขณะที่ทำได้โดยไม่ต้องใช้ตัวรวบรวมขยะและรันไทม์ (รันไทม์ลดลงเหลือการเริ่มต้นระบบขั้นพื้นฐานและการบำรุงรักษาไลบรารีมาตรฐาน)
วิธีการจัดการหน่วยความจำของ Rust ช่วยนักพัฒนาจากข้อผิดพลาดเมื่อจัดการพอยน์เตอร์และป้องกันปัญหาที่เกิดขึ้นเนื่องจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงพื้นที่หน่วยความจำหลังจากปล่อยให้ว่าง การยกเลิกการอ้างอิงพอยน์เตอร์ null บัฟเฟอร์เกิน เป็นต้น เพื่อแจกจ่ายไลบรารี่ จัดเตรียมการสร้างและจัดการการอ้างอิง โครงการพัฒนาตัวจัดการแพ็คเกจสินค้า ที่เก็บ crates.io รองรับการโฮสต์ไลบรารี
ความปลอดภัยของหน่วยความจำมีให้ใน Rust ณ เวลาคอมไพล์ผ่านการตรวจสอบการอ้างอิง การติดตามความเป็นเจ้าของออบเจกต์ การติดตามอายุอ็อบเจ็กต์ (ขอบเขต) และการประเมินความถูกต้องของการเข้าถึงหน่วยความจำระหว่างการดำเนินการโค้ด สนิมยังให้การป้องกันการล้นของจำนวนเต็ม, จำเป็นต้องมีการกำหนดค่าเริ่มต้นที่จำเป็นของค่าตัวแปรก่อนใช้งาน, จัดการข้อผิดพลาดได้ดีขึ้นในไลบรารีมาตรฐาน, ใช้แนวคิดของการอ้างอิงและตัวแปรที่ไม่เปลี่ยนรูปแบบตามค่าเริ่มต้น, เสนอการพิมพ์แบบคงที่ที่แข็งแกร่งเพื่อลดข้อผิดพลาดเชิงตรรกะ
นวัตกรรมหลัก:
- เพิ่มการรองรับท่อที่ไม่ระบุชื่อลงในไลบรารีมาตรฐานแล้ว วิธี std::io::pipe() มีไว้สำหรับสร้างท่อที่ไม่มีชื่อ ซึ่งสามารถใช้ร่วมกับ std::process::Command เพื่อประมวลผลสตรีมอินพุตและเอาต์พุตมาตรฐาน และเพื่อรวมสตรีม stdout และ stderr เข้าด้วยกัน ใช้ std::process::Command; ใช้ std::io::Read; ให้ (mut recv, send) = std::io::pipe()?; ให้คำสั่ง mut = Command::new("path/to/bin") // การรวม stdout และ stderr เข้าเป็นช่องเดียว .stdout(send.try_clone()?) .stderr(send) .spawn()?; ให้ mut output = Vec::new(); recv.read_to_end(&mut เอาท์พุต)?; ยืนยัน!(command.wait()?.success());
- อนุญาตให้เรียกใช้ฟังก์ชันภายใน (Intrinsics) ของ std::arch ของคอมไพเลอร์ส่วนใหญ่จากโค้ดที่ปลอดภัย การเปลี่ยนแปลงนี้มีผลใช้กับฟังก์ชัน std::arch ในตัวที่ถูกทำเครื่องหมายว่าไม่ปลอดภัยเท่านั้น เนื่องจากฟังก์ชันดังกล่าวเชื่อมโยงกับฟังก์ชันการทำงานเฉพาะอย่างหนึ่ง หากเปิดใช้งานฟังก์ชันการทำงานนั้น ตัวอย่างเช่น สามารถเรียก _mm256_add_epi32 จากโค้ดที่ปลอดภัยได้หากแอปพลิเคชันใช้ '#[target_feature(enable = "avx2")]'
- จากบล็อค "asm!" อนุญาตให้โค้ดแอสเซมบลีแยกไปยังบล็อกของโค้ด Rust ซึ่งช่วยลดความซับซ้อนในการพัฒนาโค้ดระดับต่ำ เช่น การนำการเพิ่มประสิทธิภาพไปใช้งานในเคอร์เนลหรือการจัดระเบียบการโต้ตอบกับฮาร์ดแวร์ จุดกระโดดสำหรับคำสั่งแอสเซมเบลอร์ "jmp" ถูกระบุไว้ในแมโคร "asm!" โดยใช้ "ป้ายกำกับ" ตัวดำเนินการใหม่ ซึ่งประกอบด้วยนิพจน์บล็อกพร้อมด้วยโค้ด Rust ไม่ปลอดภัย { asm!( "jmp {}", label { println!("Jumped from asm!"); } ); -
- อนุญาตให้ระบุประเภททั่วไปที่จับภาพและอายุการใช้งานอย่างชัดเจนในคำจำกัดความลักษณะโดยใช้ประเภทการส่งคืนลักษณะเฉพาะแบบ impl ลักษณะ Foo { fn method<'a>(&'a self) -> impl Sized; ชนิด Implicit1<'a>: มีขนาด; วิธีการ fn_desugared<'a>(&'a self) -> Self::Implicit1<'a>; fn precise<'a>(&'a self) -> impl Sized + ใช้ - ประเภท Implicit2: มีขนาด; fn precise_desugared<'a>(&'a self) -> Self::Implicit2; -
- ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ของความเสถียร ซึ่งรวมถึงวิธีการและการใช้งานลักษณะต่างๆ ที่ได้รับการทำให้เสถียร:
- วีซี::แยก_ถ้า
- vec::ExtractIf
- ลิงค์ลิสต์::แยกข้อมูล
- รายการลิงก์::แยกถ้า
- <[T]>::แยกออก
- <[T]>::แยกมิวต์ออก
- <[T]>::แยกออกก่อน
- <[T]>::แยกมิวต์แรกออก
- <[T]>::แยกออกครั้งสุดท้าย
- <[T]>::แยกมิวต์สุดท้าย
- สตริง::ขยายจากภายใน
- os_str::การแสดงผล
- OsString::การแสดงผล
- OsStr::การแสดงผล
- ไอโอ::ท่อ
- io::เครื่องอ่านท่อ
- io::PipeWriter
- impl จาก สำหรับ OwnedHandle
- impl จาก สำหรับ OwnedHandle
- impl จาก สำหรับ Stdio
- impl จาก สำหรับ Stdio
- impl จาก สำหรับ OwnedFd
- impl จาก สำหรับ OwnedFd
- กล่อง >::เขียน
- ลองจาก > สำหรับสตริง
- <*const T>::offset_from_unsigned
- <*const T>::byte_offset_from_unsigned
- <*mut T>::offset_from_unsigned
- <*mut T>::byte_offset_from_unsigned
- NonNull::offset_from_unsigned
- NonNull::byte_offset_from_unsigned
- ::ลงนามนักแสดง
- ไม่ใช่ศูนย์:: ::ลงนามนักแสดง
- ::หล่อ_ไม่ได้ลงนาม.
- ไม่ใช่ศูนย์:: ::หล่อ_ไม่ได้ลงนาม.
- ::มีหลายอย่าง
- ::ไร้ขอบเขต_shl
- ::shr ไร้ขอบเขต
- ::ไร้ขอบเขต_shl
- ::shr ไร้ขอบเขต
- ::จุดกึ่งกลาง
- ::จาก_utf8
- ::จาก_utf8_mut
- ::จาก_utf8_ไม่ได้ทำเครื่องหมาย
- ::จาก_utf8_ไม่ได้ตรวจสอบ_mut
- เครื่องหมาย “const” ใช้ในฟังก์ชัน:
- แกนหลัก::str::จาก_utf8_mut
- <[T]>::คัดลอกจากชิ้น
- ซ็อกเก็ตแอดดร::เซ็ต_ไอพี
- ซ็อกเก็ตแอดเดอร์::เซ็ตพอร์ต,
- ซ็อกเก็ต AddrV4::set_ip
- ซ็อกเก็ต AddrV4::set_port
- ซ็อกเก็ต AddrV6::set_ip
- ซ็อกเก็ต AddrV6::set_port
- ซ็อกเก็ต AddrV6::set_flowinfo
- ซ็อกเก็ต AddrV6::set_scope_id
- อักขระ::เป็นตัวเลข
- อักขระ::เป็นช่องว่างสีขาว
- <N::as_flattened
- <N::as_flattened_mut
- สตริง::เป็นไบต์
- สตริง::as_str
- สตริง::ความจุ
- สตริง::as_bytes
- สตริง::len
- สตริง::ว่างเปล่า
- สตริง::as_mut_str
- สตริง::as_mut_vec
- เวกเตอร์::as_ptr
- เวกเตอร์::as_slice
- Vec::ความจุ
- เวค::เลน
- เวกเตอร์::ว่างเปล่า
- เวกเตอร์::as_mut_slice
- เวกเตอร์::as_mut_ptr
- การสนับสนุนระดับที่สองสำหรับแพลตฟอร์มเป้าหมาย i586-pc-windows-msvc ได้ถูกลบออกแล้ว ขอแนะนำให้ใช้แพลตฟอร์ม i686-pc-windows-msvc ซึ่งรองรับคำสั่ง SSE2 แพลตฟอร์ม i586-pc-windows-msvc ไม่มีประโยชน์อีกต่อไปแล้ว เนื่องจาก Windows 10 จำเป็นต้องมีการรองรับ SSE2 และเวอร์ชันก่อนหน้า Windows ฟังก์ชันเหล่านี้ไม่รองรับในภาษา Rust
ที่มา: opennet.ru
