1 คะแนน โดย GN⁺ 4 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Rust 1.97.0 รุ่น stable ปล่อยออกมาแล้ว โดยมีการเปลี่ยนวิธีสร้างสัญลักษณ์ของผลลัพธ์จากการคอมไพล์และลำดับการจัดการคำเตือนระหว่างการบิลด์ และสามารถอัปเดตได้ด้วย rustup update stable
  • symbol mangling v0 กลายเป็นค่าเริ่มต้นของ stable ทำให้เปลี่ยนไปใช้ระบบตั้งชื่อ symbol เฉพาะของ Rust และแนวทางเดิมที่อิง Itanium ABI กำลังมุ่งไปสู่การยกเลิก
  • Cargo สามารถควบคุมคำเตือนเป็น allow, warn, deny ผ่าน CARGO_BUILD_WARNINGS แทน RUSTFLAGS=-Dwarnings ทำให้แยกนโยบายระหว่าง CI และการบิลด์ในเครื่องได้ง่ายขึ้น
  • rustc จะแสดงผลลัพธ์จาก linker แม้ลิงก์สำเร็จแล้วในรูปของคำเตือน linker_messages และ lint นี้ยังไม่ได้รับผลจากกลุ่ม lint warnings
  • ใน standard library มีการเพิ่มเสถียรภาพให้กับ Default ของ RepeatN, Send สำหรับ std::fs::File บน UEFI, เมธอดบิตของจำนวนเต็มและ NonZero, รวมถึง char::is_control ใน const context

อัปเดต Rust 1.97.0

  • Rust 1.97.0 เป็นรุ่น stable และผู้ใช้ที่ติดตั้ง Rust ผ่าน rustup อยู่แล้วสามารถอัปเดตได้ด้วยคำสั่งต่อไปนี้
rustup update stable
  • หากยังไม่มี rustup สามารถดาวน์โหลดได้จากหน้าติดตั้ง rustup บนเว็บไซต์ Rust
  • รายละเอียดการเปลี่ยนแปลงทั้งหมดสรุปไว้ใน detailed release notes for 1.97.0
  • หากต้องการร่วมทดสอบรีลีสในอนาคต สามารถใช้ช่องทาง beta/nightly ได้ด้วย rustup default beta หรือ rustup default nightly และสามารถรายงานบั๊กที่พบได้ที่ Rust issue tracker

พฤติกรรมการคอมไพล์และการบิลด์ที่เปลี่ยนไปใน stable

  • เปิดใช้ symbol mangling v0 เป็นค่าเริ่มต้น

    • เมื่อ Rust คอมไพล์ไปเป็น object file หรือไบนารี รายการแต่ละตัว เช่น ฟังก์ชันหรือ static จะต้องมี symbol ที่ไม่ซ้ำกันในระดับ global
    • เพื่อหลีกเลี่ยงการชนกันเมื่อมีการลิงก์โปรแกรม Rust หลายตัวเข้าด้วยกัน Rust จึงทำการ mangle ชื่อโดยใส่บริบทอย่างเส้นทางโมดูล crate ที่ประกาศ และ generic ของชื่อเดิมเข้าไป
    • การ mangling แบบเดิมอิงกับ Itanium ABI ซึ่งพบได้ใน C++ เช่นกัน
    • วิธีใหม่จะเก็บค่าการ instantiate ของ generic parameter ไว้ และช่วยลดปัญหาที่ยังต้องใช้ custom demangling เพราะก่อนหน้านี้มีความไม่สอดคล้องจากการใช้ Itanium ABI เพียงบางส่วน
    • ตั้งแต่ Rust 1.59 เป็นต้นมา ผู้ใช้สามารถเลือกวิธี mangling แบบเฉพาะของ Rust ได้ด้วย -Csymbol-mangling-version=v0 และตั้งแต่เดือนพฤศจิกายน 2025 ก็ถูกใช้เป็นค่าเริ่มต้นบน nightly
    • ใน Rust 1.97 วิธีนี้กลายเป็นค่าเริ่มต้นของ stable Rust แล้ว และการ mangling แบบ legacy จะเปิดใช้ได้เฉพาะบน nightly
    • แผนปัจจุบันคือการถอดการ mangling แบบ legacy ออกทั้งหมด
    • ดูรายละเอียดเพิ่มเติมได้จากบทความก่อนหน้า switching to v0 mangling on nightly
  • การควบคุมคำเตือนของ Cargo

    • การทำให้คำเตือนใน CI กลายเป็นการบิลด์ล้มเหลวเป็นแนวปฏิบัติที่พบได้ทั่วไป และเดิมมักใช้ RUSTFLAGS=-Dwarnings
    • ตั้งแต่ Rust 1.97 เป็นต้นไป Cargo จะควบคุมความสัมพันธ์ระหว่างคำเตือนกับความสำเร็จของการบิลด์โดยตรง
      • allow: ซ่อนคำเตือน
      • warn: ค่าเริ่มต้น แสดงคำเตือนแต่ไม่ทำให้ล้มเหลว
      • deny: ปฏิเสธคำเตือนและถือว่าการบิลด์ล้มเหลว
    • ความสามารถนี้กำหนดพฤติกรรมผ่านการตั้งค่าของ Cargo จึง ไม่ทำให้ build cache เริ่มต้นใช้ไม่ได้
    • หากต้องการลดเสียงรบกวนจากคำเตือนชั่วคราวระหว่างแก้ error หลังการรีแฟกเตอร์ สามารถรันได้ดังนี้
CARGO_BUILD_WARNINGS=allow cargo check
  • ใน CI สามารถตั้ง CARGO_BUILD_WARNINGS=deny เพื่อปฏิเสธคำเตือนได้
  • เมื่อใช้ร่วมกับ --keep-going ก็จะสามารถรวบรวม error และคำเตือนทั้งหมดได้โดยไม่หยุดที่ package แรกที่ล้มเหลว
  • ดูการตั้งค่าเพิ่มเติมได้ในเอกสาร build.warnings documentation ของ Cargo
  • แสดงผลลัพธ์ของ linker เป็นค่าเริ่มต้น

    • rustc จะเรียกใช้ linker แทนผู้ใช้ และก่อนหน้านี้หากการลิงก์สำเร็จ เอาต์พุตของ linker จะถูกซ่อนไว้โดยปริยาย
    • ตั้งแต่ Rust 1.97 เป็นต้นไป linker message จะถูกแสดงโดยปริยายในรูปของ warning lint ดังนี้
warning: linker stderr: ignoring deprecated linker optimization setting '1'
  |
  = note: `#[warn(linker_messages)]` on by default
  • rustc จะกรอง linker message ทั่วไปที่ถูกวินิจฉัยว่าเป็น false positive หรือเป็นพฤติกรรมที่ตั้งใจไว้
  • หลังจาก nightly เปลี่ยนมาไม่ซ่อนเอาต์พุตนี้ ก็มีการแก้ไขข้อบกพร่องหลายรายการ
  • ปัจจุบัน linker_messages เป็น lint แบบพิเศษ และ ไม่ได้รับผลจากกลุ่ม lint warnings
  • โดยทั่วไป rustc ไม่สามารถควบคุมเอาต์พุตของ linker ได้อย่างละเอียด และเอาต์พุตอาจปรากฏเฉพาะบนบางแพลตฟอร์มเท่านั้น
  • หากดูเหมือนเป็นเอาต์พุต false positive จาก linker สามารถส่ง issue ได้
  • หากต้องการซ่อนคำเตือน สามารถตั้ง lint level เป็น allow ได้ โดยเพิ่ม lints section ต่อไปนี้ใน Cargo.toml
[lints.rust]
linker_messages = "allow"

API ที่ทำให้เป็น stable

บันทึกการเปลี่ยนแปลงที่เกี่ยวข้อง

1 ความคิดเห็น

 
GN⁺ 4 시간 전
ความคิดเห็นจาก Lobste.rs
  • การที่ Cargo ใน Rust 1.97 สามารถควบคุมความสัมพันธ์ระหว่าง คำเตือนกับความสำเร็จของการบิลด์ ได้ ถือเป็นฟีเจอร์ใหม่ที่ดีมาก
    หลังรีแฟกเตอร์ ถ้าคำเตือนรบกวนระหว่างแก้ข้อผิดพลาด ก็สามารถซ่อนไว้ชั่วคราวด้วย CARGO_BUILD_WARNINGS=allow cargo check ได้ และใน CI ก็สามารถใช้ CARGO_BUILD_WARNINGS=deny เพื่อถือว่าคำเตือนเป็นความล้มเหลวได้ หากใช้ร่วมกับ --keep-going ก็จะไม่หยุดที่แพ็กเกจแรกที่ล้มเหลว แต่จะรวบรวมข้อผิดพลาดและคำเตือนทั้งหมดได้

  • อาจจะดีกว่าถ้าชะลอการอัปเกรดไว้ก่อน ดูเหมือนว่าจะมี บั๊กคอมไพล์ผิด
    https://github.com/rust-lang/rust/issues/159035

    • น่าสนใจว่าอาการคอมไพล์ผิดนี้มีอยู่มาแล้วถึง 10 รีลีส แต่ก่อนหน้านี้เหมือนจะอ่านเลยขอบเขตไปเพียงเล็กน้อย ตอนนี้กลับอ่านเลยขอบเขตไปมากกว่ามากจนเกิด segfault
    • เป็นบั๊กของ LLVM โชคดีที่วิธีแก้ดูค่อนข้างตรงไปตรงมา
      https://github.com/llvm/llvm-project/pull/208683
  • เยี่ยมเลย อยากรู้ว่าจะมีใครช่วยสรุปความคืบหน้าการทำ pattern types ได้ไหม

  • น่าเสียดายที่ never type ยังไม่ได้ถูกทำให้เสถียรในครั้งนี้เช่นกัน รอรีลีสถัดไป

    • มุกที่ว่า “never type ตั้งชื่อตามวันที่จะเสถียร” ก็ใกล้จะหมดอายุแล้ว
    • สมาชิกคนหนึ่งของทีมคอมไพเลอร์ได้พูดเรื่อง never type ที่ RustWeek แนะนำให้ดู เพราะอาจช่วยให้ประเมินแนวโน้มการทำให้เสถียรได้ดีขึ้น: https://www.youtube.com/watch?v=3jM4cnEVrLc