- 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
- ใน Rust 1.97 API ต่อไปนี้ถูกทำให้ stable
char::is_control ซึ่งเดิมเป็น stable อยู่แล้ว ตอนนี้ stable ใน const context ด้วย
บันทึกการเปลี่ยนแปลงที่เกี่ยวข้อง
- สามารถดูการเปลี่ยนแปลงทั้งหมดได้จาก changelog ของ Rust, Cargo และ Clippy ตามลำดับ
1 ความคิดเห็น
ความคิดเห็นจาก 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
https://github.com/llvm/llvm-project/pull/208683
เยี่ยมเลย อยากรู้ว่าจะมีใครช่วยสรุปความคืบหน้าการทำ pattern types ได้ไหม
น่าเสียดายที่ never type ยังไม่ได้ถูกทำให้เสถียรในครั้งนี้เช่นกัน รอรีลีสถัดไป