1 คะแนน โดย GN⁺ 2025-01-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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
  • 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 เป็นต้น
  • เบนช์มาร์ก

    • เป้าหมายของ 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 ความคิดเห็น

 
GN⁺ 2025-01-25
ความคิดเห็นจาก 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