← กลับไปยังบทความทั้งหมด

ไบนารีแบบรวมสถาปัตยกรรม (Fat Binary)

สรุปใจความสำคัญ

  • Fat Binary คือไฟล์ที่รวมรหัสคำสั่งสำหรับหลายสถาปัตยกรรมซีพียูไว้ในไฟล์เดียว
  • ช่วยให้ซอฟต์แวร์ทำงานได้เต็มประสิทธิภาพ (Native speed) บนหลายแพลตฟอร์มโดยไม่ต้องพึ่งพาการจำลองการทำงาน (Emulation)
  • มีขนาดไฟล์ใหญ่กว่าปกติเนื่องจากต้องเก็บชุดคำสั่งของทุกสถาปัตยกรรมที่รองรับ
  • Apple เป็นผู้ใช้เทคโนโลยีนี้อย่างกว้างขวางผ่านรูปแบบไฟล์ Mach-O และ Universal Binary

ไบนารีแบบรวมสถาปัตยกรรม (Fat Binary) หรือ ไบนารีหลายสถาปัตยกรรม (Multi-architecture Binary) คือไฟล์โปรแกรมที่สามารถรันได้ (Executable program) หรือไลบรารีที่ถูกขยายขนาดให้บรรจุรหัสคำสั่ง (Machine code) ที่เขียนขึ้นสำหรับชุดคำสั่ง (Instruction sets) ของหน่วยประมวลผลหลายประเภทไว้ภายในไฟล์เดียว ส่งผลให้โปรแกรมดังกล่าวสามารถทำงานได้บนคอมพิวเตอร์ที่ใช้ซีพียูต่างสถาปัตยกรรมกันได้อย่างมีประสิทธิภาพ

สาเหตุที่เรียกว่า "Fat" (อ้วน) เนื่องจากไฟล์ประเภทนี้จะมีขนาดใหญ่กว่าไฟล์ไบนารีปกติที่รองรับเพียงสถาปัตยกรรมเดียว เพราะต้องเก็บรหัสคำสั่งซ้ำกันสำหรับทุกสถาปัตยกรรมที่รองรับ

กลไกการทำงาน

โดยทั่วไป การนำ Fat Binary ไปใช้งานมีวิธีการหลักๆ ดังนี้:

  • จุดเข้าใช้งานเดียว (Single Entry Point): ไฟล์จะมีส่วนเริ่มต้นที่รวมรหัสคำสั่งที่เข้ากันได้กับทุกระบบปฏิบัติการ ซึ่งจะทำหน้าที่ตรวจสอบสถาปัตยกรรมของซีพียูที่กำลังใช้งานอยู่ จากนั้นจึงทำการกระโดด (Jump) ไปยังส่วนของรหัสคำสั่งที่ตรงกับสถาปัตยกรรมนั้นๆ
  • การแยกฟอร์ก (Forks): บางระบบอาจใช้วิธีเก็บไฟล์รันได้ที่แตกต่างกันไว้ในฟอร์กที่แยกจากกัน โดยแต่ละฟอร์กจะมีจุดเข้าใช้งานของตนเองซึ่งระบบปฏิบัติการจะเรียกใช้โดยตรง

ทางเลือกอื่นในการรองรับหลายสถาปัตยกรรม

เนื่องจาก Fat Binary ทำให้ไฟล์มีขนาดใหญ่ขึ้น จึงมีวิธีการอื่นที่นิยมใช้เพื่อแก้ปัญหาการรองรับหลายแพลตฟอร์ม เช่น:

  • โปรแกรมติดตั้ง (Installer): ใช้โปรแกรมติดตั้งเพื่อเลือกดาวน์โหลดหรือติดตั้งเฉพาะไบนารีที่ตรงกับสถาปัตยกรรมของเครื่องผู้ใช้ (เช่น Multiple APKs ใน Android)
  • การเลือกขณะรันไทม์ (Runtime Selection): เลือกไบนารีที่เหมาะสมในขณะที่โปรแกรมเริ่มทำงาน
  • การแจกจ่ายซอร์สโค้ด (Source Distribution): แจกจ่ายในรูปแบบซอร์สโค้ดเพื่อให้ผู้ใช้นำไปคอมไพล์ (Compile) บนเครื่องของตนเอง
  • เครื่องจักรเสมือน (Virtual Machine): ใช้ Bytecode ที่รันบน VM และใช้การคอมไพล์แบบ Just-In-Time (JIT) เช่น ภาษา Java

ประวัติและการใช้งานในระบบต่างๆ

Apollo Computer

ในปี 1988 ระบบปฏิบัติการ Domain/OS SR10.1 ของ Apollo Computer ได้นำเสนอไฟล์ประเภท "cmpexe" (Compound Executable) ซึ่งเป็นการรวมไบนารีสำหรับ Motorola 680x0 และ Apollo PRISM ไว้ด้วยกัน

Apple และการเปลี่ยนผ่านสถาปัตยกรรม

Apple เป็นผู้ใช้งาน Fat Binary อย่างโดดเด่นที่สุดเพื่อช่วยในการเปลี่ยนผ่านสถาปัตยกรรมซีพียูในหลายยุค:

1. จาก 68k สู่ PowerPC (1994)

เพื่อลดผลกระทบจากการเปลี่ยนจากไมโครโปรเซสเซอร์ 68k ไปเป็น PowerPC Apple ได้ใช้ Fat Binary บรรจุรหัสทั้งสองชุดไว้ในไฟล์เดียว แม้ว่าการจำลองการทำงาน (Emulation) จะทำได้ แต่รหัสแบบ Native ใน Fat Binary จะทำงานได้เต็มประสิทธิภาพบนทั้งสองแพลตฟอร์ม โดยรหัส 68k จะถูกเก็บใน Resource Fork และรหัส PowerPC จะอยู่ใน Data Fork ในรูปแบบ PEF

2. NeXTSTEP และ Mach-O

ระบบปฏิบัติการ NeXTSTEP (ตั้งแต่เวอร์ชัน 3.1) ได้นำเสนอ "Multi-Architecture Binaries" เพื่อให้ซอฟต์แวร์ทำงานได้ทั้งบนฮาร์ดแวร์ Motorola 68k และ Intel IA-32 โดยใช้รูปแบบไฟล์ Mach-O ซึ่งมีโครงสร้างดังนี้:

  • fat_header: ประกอบด้วย Magic Number เพื่อระบุว่าเป็น Fat Binary และจำนวนของ Mach-O ไฟล์ที่บรรจุอยู่ภายใน
  • fat_arch: โครงสร้างที่ระบุตำแหน่ง (Offset), การจัดเรียง (Alignment), ขนาด, ประเภทซีพียู และประเภทย่อยของไบนารีแต่ละตัว

3. Mac OS X และ Universal Binary (2005)

เมื่อ Apple เข้าซื้อ NeXT และนำ Mach-O มาใช้ใน Mac OS X ระบบนี้ได้ถูกพัฒนาต่อจนกลายเป็น Universal Binary ในปี 2005 เพื่อรองรับการเปลี่ยนผ่านจาก PowerPC ไปสู่ Intel x86 โดยอนุญาตให้แอปพลิเคชันเดียวทำงานได้แบบ Native ทั้งบนซีพียู PowerPC และ Intel

คำถามที่พบบ่อย

Fat Binary ต่างจากโปรแกรมจำลอง (Emulator) อย่างไร?

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

ทำไม Fat Binary ถึงมีขนาดไฟล์ใหญ่?

เพราะภายในไฟล์เดียวมีการเก็บชุดคำสั่ง (Machine code) ของโปรแกรมเดียวกันแต่เขียนสำหรับซีพียูต่างชนิดกัน เช่น มีทั้งชุดคำสั่งสำหรับ Intel และ ARM ในไฟล์เดียว

ปัจจุบันยังมีการใช้ Fat Binary อยู่หรือไม่?

ยังมีใช้อยู่ โดยเฉพาะในระบบนิเวศของ Apple (macOS และ iOS) เพื่อรองรับการเปลี่ยนผ่านสถาปัตยกรรม เช่น จาก Intel ไปสู่ Apple Silicon (ARM64)