การเปิดตัวภาษาการเขียนโปรแกรม Rust 1.40

ที่ตีพิมพ์ การเปิดตัวภาษาโปรแกรมระบบ สนิม 1.40ก่อตั้งโดยโครงการ Mozilla ภาษามุ่งเน้นไปที่การจัดการหน่วยความจำที่ปลอดภัย ให้การจัดการหน่วยความจำอัตโนมัติ และจัดเตรียมวิธีการเพื่อให้บรรลุการทำงานแบบขนานในระดับสูง ในขณะที่หลีกเลี่ยงการใช้ตัวรวบรวมขยะและ รันไทม์.

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

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

  • เพิ่มความสามารถในการทำเครื่องหมายโครงสร้าง (struct) และการแจงนับ (แจงนับด้วยบล็อก Variant) โดยใช้แอตทริบิวต์ "#[ไม่_ละเอียดถี่ถ้วน]", ที่ ช่วยให้ ในอนาคต ให้เพิ่มฟิลด์และตัวเลือกใหม่ให้กับโครงสร้างและการแจงนับที่ประกาศ ตัวอย่างเช่น นักพัฒนาโมดูลที่มีโครงสร้างพร้อมฟิลด์ที่ประกาศต่อสาธารณะสามารถใช้ "#[non_exhaustive]" เพื่อทำเครื่องหมายโครงสร้างที่อาจมีฟิลด์ใหม่ที่เพิ่มเข้ามาในอนาคต จนถึงขณะนี้ ในสถานการณ์นี้ นักพัฒนาถูกบังคับให้เลือกระหว่างการประกาศฟิลด์แบบส่วนตัวและการผูกเข้ากับรายการฟิลด์ที่ไม่เปลี่ยนรูป แอตทริบิวต์ใหม่จะลบข้อจำกัดนี้ออก และอนุญาตให้คุณเพิ่มฟิลด์ใหม่ได้ในอนาคตโดยไม่มีความเสี่ยงที่จะทำลายโค้ดภายนอกที่คอมไพล์ไว้ก่อนหน้านี้ ในแพ็คเกจลัง เมื่อตัวเลือกการจับคู่ในส่วน "ตรงกัน" จำเป็นต้องมีคำจำกัดความที่ชัดเจนของมาสก์ "_ => {...}" ซึ่งครอบคลุมฟิลด์ที่เป็นไปได้ในอนาคต มิฉะนั้นข้อผิดพลาดจะปรากฏขึ้นเมื่อเพิ่มฟิลด์ใหม่
  • เพิ่ม ความสามารถในการเรียกแมโครขั้นตอน mac!() ในบริบทประเภท ตัวอย่างเช่น ตอนนี้คุณสามารถเขียน “type Foo = expand_to_type!(bar);” หาก “expand_to_type” เป็นมาโครขั้นตอน
  • ในบล็อก "ภายนอก { ... }" เพิ่ม ความสามารถในการใช้มาโครขั้นตอนและแอตทริบิวต์ รวมถึงมาโคร “bang!()” ตัวอย่างเช่น:

    มาโคร_กฎ! make_item { ($ชื่อ: ident) => { fn $name(); } }

    ภายนอก {
    make_item!(อัลฟ่า);
    make_item!(เบต้า);
    }

    ภายนอก "C" {
    #[my_identity_มาโคร] fn ฟู();
    }

  • ในมาโคร นำไปใช้ ความสามารถในการสร้างองค์ประกอบ “macro_rules!” กำลังสร้าง "macro_rules!" เป็นไปได้ทั้งในมาโครที่มีลักษณะคล้ายฟังก์ชัน (“mac!()”) และในมาโครในรูปแบบของแอตทริบิวต์ (“#[mac]”)
  • ในองค์ประกอบการแมป $m:meta เพิ่ม รองรับค่าการแจงนับโทเค็นโดยพลการ (“[TOKEN_STREAM]”, “{TOKEN_STREAM}” และ “(TOKEN_STREAM)”) ตัวอย่างเช่น:

    มาโคร_กฎ! ยอมรับ_meta { ($m:meta) => {} }
    Accept_meta!( ของฉัน::เส้นทาง );
    Accept_meta!( my::path = "lit" );
    Accept_meta!( my::path ( abc ) );
    Accept_meta!( my::path [ abc ] );
    Accept_meta!( my::path { abc } );

  • ในโหมด Rust 2015 เอาต์พุตข้อผิดพลาดจะถูกเปิดใช้งานสำหรับปัญหาที่ระบุเมื่อตรวจสอบการยืมตัวแปร (ตัวตรวจสอบการยืม) โดยใช้เทคนิค NLL (อายุการใช้งานที่ไม่ใช่คำศัพท์) ก่อนหน้านี้ คำเตือนจะถูกแทนที่ด้วยข้อผิดพลาดเมื่อทำงานในโหมด Rust 2018
    หลังจากที่การเปลี่ยนแปลงขยายไปสู่โหมด Rust 2015 แล้ว นักพัฒนาก็สามารถทำได้ในที่สุด กำจัด จากตัวตรวจสอบการยืมตัวเก่า

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

  • คุณลักษณะ “const” ซึ่งกำหนดความเป็นไปได้ในการใช้งานในบริบทใดๆ แทนค่าคงที่ ใช้สำหรับฟังก์ชัน is_power_of_two (สำหรับจำนวนเต็มที่ไม่ได้ลงนาม)
  • ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ที่เสถียร รวมถึงมาโคร todo!() และสไลซ์::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value วิธีการได้รับความเสถียร
    ตัวเลือก::as_deref, ตัวเลือก::as_deref_mut, ตัวเลือก::แบน, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32, f64}::from_be_bytes, {f32,f64}::from_le_bytes และ {f32,f64}::from_ne_bytes

  • ในตัวจัดการแพ็คเกจสินค้า
    ดำเนินการ คำเตือนคอมไพเลอร์แคชบนดิสก์ เพิ่มตัวเลือก "ข้อมูลเมตาของสินค้า" ให้กับคำสั่ง "ข้อมูลเมตาของสินค้า"--กรองแพลตฟอร์ม" เพื่อแสดงเฉพาะแพ็คเกจที่เชื่อมโยงกับแพลตฟอร์มเป้าหมายที่ระบุในคอลัมน์การแก้ไขการพึ่งพา เพิ่มตัวเลือกการกำหนดค่า http.ssl-version เพื่อกำหนดเวอร์ชัน TLS ที่ถูกต้อง
    เพิ่มความสามารถในการเผยแพร่ส่วน "การพึ่งพา dev" โดยไม่ต้องระบุคีย์ "เวอร์ชัน"

  • คอมไพเลอร์rustc ให้การสนับสนุนระดับที่สามสำหรับแพลตฟอร์มเป้าหมาย thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 และ mips64el-unknown-linux-muslabi64 ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติและการเผยแพร่งานสร้างอย่างเป็นทางการ

ที่มา: opennet.ru

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