Wild เครื่องมือ linker เร็วสำหรับ Linux
(github.com/davidlattimore)-
Wild linker
- Wild เป็นเครื่องมือที่มุ่งเป้าไปที่การลิงก์ที่รวดเร็วมากสำหรับการพัฒนาแบบทำซ้ำ
- แม้จะยังไม่ได้มีการทำ incremental linking แต่ในปัจจุบันก็ยังให้ประสิทธิภาพที่ค่อนข้างรวดเร็ว
- สำหรับ production build แนะนำให้ใช้ linker ที่มีความเสถียรและ成熟แล้ว เช่น GNU ld หรือ LLD
- หากต้องการเวลา build ที่รวดเร็วระหว่างการพัฒนา ก็สามารถลองใช้ Wild ได้
- ใช้งานได้หากกำลังพัฒนาบน x86-64 Linux และหากพบปัญหาแนะนำให้ส่ง bug report
-
การติดตั้ง
- หากต้องการติดตั้งไบนารีที่ build ไว้ล่วงหน้า สามารถคัดลอกคำสั่งจากหน้า release มาใช้ได้
- หรือจะคัดลอกไบนารี
wildไปไว้ใน path ด้วยตนเองก็ได้ - หากต้องการ build และติดตั้งด้วยตนเอง ให้ใช้คำสั่ง
cargo install --locked --bin wild --git https://github.com/davidlattimore/wild.git wild
-
การใช้เป็น linker เริ่มต้น
- หากต้องการใช้ Wild เป็น linker เริ่มต้นสำหรับการ build โค้ด Rust ให้เพิ่มการตั้งค่าใน
~/.cargo/config.toml
- หากต้องการใช้ Wild เป็น linker เริ่มต้นสำหรับการ build โค้ด Rust ให้เพิ่มการตั้งค่าใน
-
Q&A
- ทำไมต้องมี linker อีกตัว?
- Mold เร็วมากอยู่แล้ว แต่ไม่รองรับ incremental linking ส่วน Wild มีเป้าหมายเพื่อรองรับ incremental linking
- เขียนด้วย Rust จึงคาดว่าจะช่วยรับมือกับความซับซ้อนของ incremental linking ได้
- ฟีเจอร์ที่ใช้งานได้
- แพลตฟอร์ม/สถาปัตยกรรมที่รองรับในปัจจุบัน: x86-64 บน Linux
- สามารถสร้างเอาต์พุตเป็นไบนารีแบบ static link, ไบนารีแบบ dynamic link และ shared object (ไฟล์ .so)
- ยืนยันความเข้ากันได้กับ Rust proc-macros แล้ว
- ผ่านการทดสอบกับ crate ยอดนิยมบน crates.io
- รองรับข้อมูลดีบัก
- ฟีเจอร์ที่ยังไม่รองรับ
- incremental linking, การรองรับสถาปัตยกรรมอื่นนอกเหนือจาก x86-64, การรองรับ link flag ที่หลากหลาย, การรองรับ Mac และ Windows เป็นต้น
- ทำไมต้องมี linker อีกตัว?
-
เบนช์มาร์ก
- เป้าหมายของ Wild คือให้ประสิทธิภาพที่รวดเร็วมากผ่าน incremental linking
- แม้เป็นการลิงก์แบบไม่ incremental ก็ยังมุ่งให้ทำงานได้เร็วที่สุดเท่าที่เป็นไปได้
- จากผลเบนช์มาร์ก เมื่อไม่มีข้อมูลดีบัก Wild แสดงประสิทธิภาพที่รวดเร็วมาก
- เมื่อมีข้อมูลดีบัก ประสิทธิภาพจะลดลงบ้าง
-
การลิงก์โค้ด Rust
- สามารถใช้คำสั่ง
cargo testเพื่อ build และทดสอบ crate ด้วย Wild ได้ - ต้องติดตั้งคอมไพเลอร์ Clang ไว้ และ GCC ไม่อนุญาตให้ใช้ linker ตามต้องการ
- สามารถใช้คำสั่ง
-
การมีส่วนร่วม
- ดูข้อมูลวิธีมีส่วนร่วมกับ Wild ได้ที่ CONTRIBUTING.md
-
การสนับสนุน
- หากสนับสนุนโปรเจ็กต์นี้ ก็จะช่วยให้สามารถทำงานกับมันแบบเต็มเวลาได้นานขึ้น
-
สัญญาอนุญาต
- เลือกใช้ได้ระหว่าง Apache License, Version 2.0 หรือ MIT license
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
น่าแปลกที่โปรเจกต์นี้ปรากฏขึ้น ทั้งที่หลังจาก mold เปลี่ยนไลเซนส์จาก AGPL เป็น MIT ความจำเป็นของลิงเกอร์ความเร็วสูงตัวใหม่ก็ลดลงไปแล้ว อย่างไรก็ตาม มันน่าสนใจตรงที่ในบางกรณีเร็วกว่า mold ถึง 2 เท่า
เคยดูโปรเจกต์นี้มาก่อน แต่ดูเหมือนว่ายังไม่พร้อมสำหรับโปรดักชัน จึงยังคงใช้ mold อยู่
สำหรับผู้ใช้ macOS นั้น Apple ได้ออกลิงเกอร์ตัวใหม่เมื่อ 1~2 ปีก่อน และหากใช้ร่วมกับ Rust จำเป็นต้องเพิ่มการตั้งค่าบางอย่างใน config.toml
คงจะสดใหม่ไม่น้อยหากคอมไพเลอร์ C/C++ สามารถบิลด์ทั้งโปรแกรมเป็นหน่วยเดียวได้โดยไม่มีขั้นตอนลิงก์เลย เนื่องจากไลบรารีภายนอกส่วนใหญ่ลิงก์แบบไดนามิกอยู่แล้ว การตัดกระบวนการลิงก์ออกก็คงไม่เป็นปัญหา
ความสนใจในลิงเกอร์ความเร็วสูงเพิ่มขึ้นอย่างต่อเนื่อง ทั้ง Gold ในปี 2008, Lld ในปี 2015 และ mold ในปี 2021
ความนิยมของ Rust ทำให้ความสนใจในลิงเกอร์ความเร็วสูงเพิ่มขึ้น และไบนารีของ Rust ใช้เวลามากในขั้นตอนลิงก์ นี่ไม่ใช่ปัญหาเฉพาะของ Rust แต่เกิดจากการลิงก์แบบสแตติกและการปรับแต่งประสิทธิภาพของ LLVM
"Linkers and Loaders" ของ John Levine เป็นหนังสือที่ดีในหัวข้อนี้ และตอนที่อ่านเมื่อไม่กี่ปีก่อนก็น่าสนใจมาก
เมื่อเปรียบเทียบประสิทธิภาพของ wild, mold และ ld ก็พบว่าในโปรเจกต์ที่มีโครงสร้างดี เวลาในการลิงก์ไม่ได้เป็นปัญหาใหญ่นัก
การทดสอบประสิทธิภาพรันบนโน้ตบุ๊ก System76 Lemur pro รุ่นปี 2020 ที่มี 4 คอร์ (8 เธรด) และ RAM 42GB
มีคนสงสัยว่าลิงเกอร์คืออะไร
มีคำถามว่าสามารถใช้ลิงก์ Linux kernel ได้หรือไม่ ซึ่งถือเป็นหมุดหมายที่มีประโยชน์ของ LLD