การเปิดตัวภาษาการเขียนโปรแกรม Rust 1.75 และ unikernel Hermit 0.6.7

การเปิดตัวของภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปของ Rust 1.75 ซึ่งก่อตั้งโดยโครงการ Mozilla แต่ปัจจุบันได้รับการพัฒนาภายใต้การอุปถัมภ์ขององค์กรอิสระ Rust Foundation ที่ไม่แสวงหาผลกำไร ได้รับการเผยแพร่แล้ว ภาษานี้เน้นไปที่ความปลอดภัยของหน่วยความจำและให้แนวทางเพื่อให้ได้งานที่มีความเท่าเทียมกันสูง ในขณะที่หลีกเลี่ยงการใช้ตัวรวบรวมขยะและรันไทม์ (รันไทม์จะลดลงเหลือเพียงการเริ่มต้นพื้นฐานและการบำรุงรักษาไลบรารีมาตรฐาน)

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

ความปลอดภัยของหน่วยความจำมีให้ใน Rust ณ เวลาคอมไพล์ผ่านการตรวจสอบการอ้างอิง การติดตามความเป็นเจ้าของออบเจกต์ การติดตามอายุอ็อบเจ็กต์ (ขอบเขต) และการประเมินความถูกต้องของการเข้าถึงหน่วยความจำระหว่างการดำเนินการโค้ด สนิมยังให้การป้องกันการล้นของจำนวนเต็ม, จำเป็นต้องมีการกำหนดค่าเริ่มต้นที่จำเป็นของค่าตัวแปรก่อนใช้งาน, จัดการข้อผิดพลาดได้ดีขึ้นในไลบรารีมาตรฐาน, ใช้แนวคิดของการอ้างอิงและตัวแปรที่ไม่เปลี่ยนรูปแบบตามค่าเริ่มต้น, เสนอการพิมพ์แบบคงที่ที่แข็งแกร่งเพื่อลดข้อผิดพลาดเชิงตรรกะ

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

  • เพิ่มความสามารถในการใช้สัญลักษณ์ "async fn" และ "->impl Trait" ในลักษณะส่วนตัว ตัวอย่างเช่น การใช้ “->impl Trait” คุณสามารถเขียนเมธอดลักษณะที่ส่งคืนตัววนซ้ำ: คุณลักษณะ Container { fn items(&self) -> impl Iterator; } impl Container สำหรับ MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    คุณยังสามารถสร้างลักษณะโดยใช้ "async fn": คุณลักษณะ HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // จะถูกขยายเป็น: // fn fetch(&self, url: Url) -> impl Future; }

  • เพิ่ม API สำหรับการคำนวณการชดเชยไบต์ที่สัมพันธ์กับพอยน์เตอร์ เมื่อทำงานกับพอยน์เตอร์เปล่า (“*const T” และ “*mut T”) อาจจำเป็นต้องดำเนินการเพื่อเพิ่มออฟเซ็ตให้กับพอยน์เตอร์ ก่อนหน้านี้ คุณสามารถใช้โครงสร้างเช่น “::add(1)” โดยบวกจำนวนไบต์ที่สอดคล้องกับขนาดของ “size_of::()” API ใหม่ทำให้การดำเนินการนี้ง่ายขึ้นและทำให้สามารถจัดการการชดเชยไบต์ได้โดยไม่ต้องส่งประเภทเป็น "*const u8" หรือ "*mut u8" ก่อน
    • ตัวชี้::byte_add
    • ตัวชี้::byte_offset
    • ตัวชี้::byte_offset_from
    • ตัวชี้::byte_sub
    • ตัวชี้::wrapping_byte_add
    • ตัวชี้::wrapping_byte_offset
    • ตัวชี้::wrapping_byte_sub
  • ทำงานอย่างต่อเนื่องเพื่อเพิ่มประสิทธิภาพของคอมไพเลอร์สนิม เพิ่มเครื่องมือเพิ่มประสิทธิภาพ BOLT ซึ่งทำงานในระยะโพสต์ลิงก์ และใช้ข้อมูลจากโปรไฟล์การดำเนินการที่เตรียมไว้ล่วงหน้า การใช้ BOLT ช่วยให้คุณเร่งความเร็วการประมวลผลคอมไพเลอร์ได้ประมาณ 2% โดยการเปลี่ยนเค้าโครงของโค้ดไลบรารี librustc_driver.so เพื่อการใช้แคชตัวประมวลผลอย่างมีประสิทธิภาพมากขึ้น

    รวมการสร้างคอมไพเลอร์rustcด้วยตัวเลือก "-Ccodegen-units=1" เพื่อปรับปรุงคุณภาพของการปรับให้เหมาะสมใน LLVM การทดสอบที่ดำเนินการแสดงให้เห็นถึงการเพิ่มประสิทธิภาพในกรณีของการสร้าง “-Ccodegen-units=1” ประมาณ 1.5% การเพิ่มประสิทธิภาพที่เพิ่มเข้ามาจะเปิดใช้งานตามค่าเริ่มต้นสำหรับแพลตฟอร์ม x86_64-unknown-linux-gnu เท่านั้น

    การเพิ่มประสิทธิภาพที่กล่าวถึงก่อนหน้านี้ได้รับการทดสอบโดย Google เพื่อลดเวลาในการสร้างส่วนประกอบแพลตฟอร์ม Android ที่เขียนด้วยภาษา Rust การใช้ “-C codegen-units=1” เมื่อสร้าง Android ช่วยให้เราสามารถลดขนาดของชุดเครื่องมือลง 5.5% และเพิ่มประสิทธิภาพได้ 1.8% ในขณะที่เวลาในการสร้างชุดเครื่องมือนั้นเพิ่มขึ้นเกือบสองเท่า

    การเปิดใช้งานการรวบรวมขยะเวลาลิงก์ (“--gc-sections”) ทำให้ประสิทธิภาพเพิ่มขึ้นถึง 1.9% ทำให้การเพิ่มประสิทธิภาพเวลาลิงก์ (LTO) สูงถึง 7.7% และการเพิ่มประสิทธิภาพตามโปรไฟล์ (PGO) สูงถึง 19.8% ในขั้นสุดท้าย มีการใช้การปรับให้เหมาะสมโดยใช้ยูทิลิตี้ BOLT ซึ่งทำให้สามารถเพิ่มความเร็วในการสร้างเป็น 24.7% แต่ขนาดของชุดเครื่องมือเพิ่มขึ้น 10.9%

    การเปิดตัวภาษาการเขียนโปรแกรม Rust 1.75 และ unikernel Hermit 0.6.7

  • ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ของความเสถียร ซึ่งรวมถึงวิธีการและการใช้งานลักษณะต่างๆ ที่ได้รับการทำให้เสถียร:
    • อะตอม*::from_ptr
    • ไฟล์ไทม์ส
    • FileTimesExt
    • ไฟล์::set_modified
    • ไฟล์::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • ตัวเลือก::as_slice
    • ตัวเลือก::as_mut_slice
    • ตัวชี้::byte_add
    • ตัวชี้::byte_offset
    • ตัวชี้::byte_offset_from
    • ตัวชี้::byte_sub
    • ตัวชี้::wrapping_byte_add
    • ตัวชี้::wrapping_byte_offset
    • ตัวชี้::wrapping_byte_sub
  • คุณลักษณะ “const” ซึ่งกำหนดความเป็นไปได้ในการใช้งานในบริบทใดๆ แทนที่จะเป็นค่าคงที่ ถูกใช้ในฟังก์ชัน:
    • Ipv6Addr::to_ipv4_mapped
    • บางทีUninit::assume_init_read
    • บางทีUninit::zeroed
    • mem::แยกแยะ
    • บันทึก::ศูนย์
  • การสนับสนุนระดับที่สามได้ถูกนำมาใช้สำหรับแพลตฟอร์ม csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd และ mipsel-unknown-netbsd ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติ การเผยแพร่บิลด์อย่างเป็นทางการ หรือการตรวจสอบว่าสามารถสร้างโค้ดได้หรือไม่

นอกจากนี้ เรายังสามารถสังเกตเวอร์ชันใหม่ของโครงการ Hermit ซึ่งพัฒนาเคอร์เนลพิเศษ (unikernel) ซึ่งเขียนด้วยภาษา Rust ซึ่งเป็นเครื่องมือสำหรับการสร้างแอปพลิเคชันที่มีอยู่ในตัวเองซึ่งสามารถทำงานบนไฮเปอร์ไวเซอร์หรือฮาร์ดแวร์เปลือยโดยไม่ต้องมีเลเยอร์เพิ่มเติม และไม่มีระบบปฏิบัติการ เมื่อสร้างขึ้น แอปพลิเคชันจะเชื่อมโยงแบบคงที่กับไลบรารี ซึ่งใช้ฟังก์ชันการทำงานที่จำเป็นทั้งหมดอย่างอิสระ โดยไม่ต้องเชื่อมโยงกับเคอร์เนล OS และไลบรารีระบบ รหัสโครงการเผยแพร่ภายใต้ลิขสิทธิ์ Apache 2.0 และ MIT Assembly ได้รับการสนับสนุนสำหรับการดำเนินการแบบสแตนด์อโลนของแอปพลิเคชันที่เขียนด้วย Rust, Go, Fortran, C และ C++ โปรเจ็กต์นี้ยังกำลังพัฒนา bootloader ของตัวเองที่ให้คุณเปิดใช้ Hermit โดยใช้ QEMU และ KVM

ที่มา: opennet.ru

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