สนิม 1.53 เปิดตัวแล้ว Google จะให้ทุนเพิ่มการรองรับ Rust ให้กับเคอร์เนล Linux

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

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

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

  • สำหรับอาร์เรย์ คุณลักษณะ IntoIterator ได้ถูกนำมาใช้ ซึ่งช่วยให้คุณสามารถจัดระเบียบการวนซ้ำขององค์ประกอบอาร์เรย์ตามค่า: for i ใน [1, 2, 3] { .. }

    นอกจากนี้ยังสามารถส่งอาร์เรย์ไปยังเมธอดที่ยอมรับตัววนซ้ำได้ เช่น: la set = BTreeSet::from_iter([1, 2, 3]); สำหรับ (a, b) ใน some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    ก่อนหน้านี้ IntoIterator ถูกนำมาใช้สำหรับการอ้างอิงอาร์เรย์เท่านั้น เช่น เพื่อวนซ้ำค่าที่ต้องใช้การอ้างอิง (“&[1, 2, 3]”) หรือ "[1, 2, 3].iter()” การใช้งาน IntoIterator สำหรับอาร์เรย์ถูกขัดขวางโดยปัญหาความเข้ากันได้ที่เกิดจากการแปลงคอมไพเลอร์ก่อนหน้านี้จาก array.into_iter() เป็น (&array).into_iter() ปัญหาเหล่านี้ได้รับการแก้ไขด้วยวิธีแก้ปัญหา - คอมไพเลอร์จะยังคงแปลง array.into_iter() เป็น (&array).into_iter() ต่อไปราวกับว่าไม่มีการนำคุณสมบัติ IntoIterator ไปใช้ แต่จะเกิดขึ้นเมื่อเรียกใช้เมธอดโดยใช้ ".into_iter() เท่านั้น )" ไวยากรณ์และไม่มีการแตะสายในรูปแบบ "ใน [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • สามารถระบุนิพจน์ “|” ได้ (ตรรกะหรือการดำเนินการ) ในส่วนใดๆ ของเทมเพลต เช่น แทนที่จะเป็น “Some(1) | Some(2)" ตอนนี้คุณสามารถเขียน "Some(1 | 2)" ได้แล้ว: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • อนุญาตให้ใช้อักขระที่ไม่ใช่ ASCII ในตัวระบุ รวมถึงอักขระประจำชาติใดๆ ที่กำหนดไว้ในข้อกำหนด Unicode UAX 31 แต่ไม่รวมอักขระอีโมจิ หากคุณใช้อักขระที่แตกต่างกันแต่คล้ายกัน คอมไพเลอร์จะออกคำเตือน const BLÅHAJ: &str = "🦈"; struct 人 { 名字: String, } ให้ α = 1; ให้sos = 2; คำเตือน: คู่ตัวระบุถือว่าสับสนระหว่าง 's' และ 's'
  • API ส่วนใหม่ได้ถูกโอนไปยังหมวดหมู่ที่เสถียรแล้ว ซึ่งรวมถึงส่วนที่เสถียรดังต่อไปนี้:
    • อาร์เรย์::from_ref
    • อาร์เรย์::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::รักษา
    • BTreeMap::รักษา
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • ซีเอ็มพี::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • ระยะเวลา::ศูนย์
    • ระยะเวลา::MAX
    • ระยะเวลา::is_zero
    • ระยะเวลา::saturating_add
    • ระยะเวลา::saturating_sub
    • ระยะเวลา::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator สำหรับอาร์เรย์
    • {จำนวนเต็ม}::BITS
    • io::ข้อผิดพลาด::ไม่รองรับ
    • ไม่เป็นศูนย์*::leading_zeros
    • ไม่เป็นศูนย์*::trailing_zeros
    • ตัวเลือก::แทรก
    • การเรียงลำดับ::is_eq
    • การสั่งซื้อ::is_ne
    • การสั่งซื้อ::is_lt
    • การเรียงลำดับ::is_gt
    • การสั่งซื้อ::is_le
    • การสั่งซื้อ::is_ge
    • OsStr::make_ascii_ตัวพิมพ์เล็ก
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_ตัวพิมพ์เล็ก
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • ดูได้::peek_mut
    • Rc::increation_strong_count
    • Rc::decreation_strong_count
    • ชิ้น :: IterMut :: as_slice
    • AsRef<[T]> สำหรับชิ้น::IterMut
    • impl SliceIndex สำหรับ (Bound , ผูกพัน )
    • Vec::extend_from_within
  • การสนับสนุนระดับที่สามสำหรับแพลตฟอร์ม wasm64-unknown-unknown ได้ถูกนำมาใช้แล้ว ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติ การเผยแพร่บิลด์อย่างเป็นทางการ หรือการตรวจสอบว่าสามารถสร้างโค้ดได้หรือไม่
  • ตัวจัดการแพ็คเกจ Cargo ถูกย้ายไปใช้ชื่อ "main" สำหรับสาขาหลักของที่เก็บ Git (HEAD) ตามค่าเริ่มต้น การขึ้นต่อกันที่โฮสต์ในพื้นที่เก็บข้อมูลที่ใช้ชื่อ main แทนที่จะเป็น master ไม่จำเป็นต้องกำหนดค่า Branch = "main" อีกต่อไป
  • ในคอมไพเลอร์ ข้อกำหนดสำหรับเวอร์ชันขั้นต่ำของ LLVM จะเพิ่มขึ้นเป็น LLVM 10

นอกจากนี้เรายังสามารถทราบการจัดหาเงินทุนสำหรับการพัฒนาการรวมเข้ากับเคอร์เนล Linux ของเครื่องมือสำหรับการพัฒนาส่วนประกอบในภาษา Rust งานดังกล่าวจะดำเนินการภายใต้กรอบของโครงการ Prossimo ภายใต้การอุปถัมภ์ขององค์กร ISRG (Internet Security Research Group) ซึ่งเป็นผู้ก่อตั้งโครงการ Let's Encrypt และส่งเสริม HTTPS และการพัฒนาเทคโนโลยีเพื่อเพิ่มความปลอดภัยให้กับ อินเทอร์เน็ต. Google จะเป็นผู้จัดหาเงินทุนซึ่งจะจ่ายให้กับผลงานของ Miguel Ojeda ผู้เขียนโครงการ Rust-for-Linux ก่อนหน้านี้ ISRG และ Google ได้ให้ทุนแล้วในการสร้างแบ็กเอนด์ HTTP ทางเลือกสำหรับยูทิลิตี้ curl และการพัฒนาโมดูล TLS ใหม่สำหรับเซิร์ฟเวอร์ Apache http

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

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

ที่มา: opennet.ru

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