1 คะแนน โดย GN⁺ 2023-07-10 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • บทความนี้สำรวจขีดจำกัดของรูปแบบไฟล์โมดูล .NET เพื่อสร้างไฟล์ปฏิบัติการที่เล็กที่สุดซึ่งพิมพ์ "Hello, World!" ออกสู่ standard output
  • เพื่อใช้เป็นเงื่อนไขในการทดลอง ผู้เขียนกำหนดกติกาขึ้นเองว่าให้ใช้ managed entry point ที่เขียนด้วย C# หรือ CIL, รันบน .NET Framework 4.x.x และไม่มีการพึ่งพาไลบรารีของบุคคลที่สาม
  • เพื่อค่อย ๆ ลดขนาดของไฟล์ปฏิบัติการ ผู้เขียนปิดใช้งาน nullable reference annotations, เขียนโมดูล .NET ด้วยมือ, ลบ imports และ base relocations, ตัด metadata ที่ไม่จำเป็นออก และปรับการใช้สตริง ASCII ให้เหมาะสม
  • ผลลัพธ์สุดท้ายคือไฟล์ปฏิบัติการขนาด 889 ไบต์ ซึ่งเป็นขนาดต่ำสุดตามทฤษฎีที่เป็นไปได้ของไฟล์ .NET PE ที่ถูกต้อง
  • ในบทความมีตัวอย่างโค้ดและคำอธิบายของแต่ละขั้นตอนที่ใช้เพื่อลดขนาดไฟล์ปฏิบัติการ
  • ผู้เขียนเน้นย้ำถึงความสำคัญของการทำความเข้าใจรูปแบบไฟล์และการตัดสินใจเชิงกลยุทธ์เพื่อเพิ่มประสิทธิภาพขนาดไฟล์ปฏิบัติการ
  • การย้ายสตริงไปไว้ในเซกเมนต์ padding ที่ไม่ได้ใช้งานช่วยลดขนาดไฟล์ลงได้อีก 13 ไบต์
  • การลบการอ้างอิงถึง mscorlib สามารถช่วยประหยัดพื้นที่ในไฟล์ไบนารีได้
  • การตัด VersionString ใน .NET metadata directory ช่วยประหยัดไบต์เพิ่มได้อีก
  • ขนาดสุดท้ายของไฟล์ไบนารีคือ 834 ไบต์ และเมื่อบีบอัดแล้วสามารถลดลงได้อีกเหลือ 476 ไบต์
  • แม้จะเป็นโปรเจกต์ที่ไม่ได้มีสาระสำคัญนัก แต่การสำรวจขีดจำกัดของระบบที่มีอยู่ก็อาจเป็นเรื่องสนุกได้
  • ผู้เขียนเผยแพร่ซอร์สโค้ดทั้งหมดบน GitHub เพื่อใช้อ้างอิง
  • บทความกล่าวถึง reverse engineering, code golf และการปรับแต่งไฟล์ PE ให้เล็กที่สุด
  • ผู้เขียนแบ่งปันประสบการณ์ของตนและชวนให้ผู้อื่นลองสำรวจวิธีลดขนาดไฟล์เพิ่มเติม
  • บทความนี้ได้รับอนุญาตภายใต้สัญญาอนุญาต CC BY 4.0 โดยผู้เขียน

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

 
GN⁺ 2023-07-10
ความคิดเห็นจาก Hacker News
  • Michal Strehovský สร้างเกมงูด้วย .NET โดยมีขนาดเล็กกว่า 8KB
  • บทความนี้อาจทำให้คนสับสนได้ เพราะไฟล์รันต้องอาศัยรันไทม์ที่ติดตั้งอยู่ในระบบ
  • แหล่งอ้างอิงที่น่าเชื่อถือสำหรับไฟล์รันจริงคือไบนารี Native AOT
  • สถานที่ของผู้เขียนคือสถานี McMurdo ในแอนตาร์กติกา ซึ่งน่าสนใจทีเดียว
  • ขนาดไฟล์เพิ่มขึ้นเพราะการจัดแนวเซกชันเป็น 0x200 ไบต์
  • demoscene เคยสร้างไบนารีขนาด 1k ได้
  • การเจาะลึกรายละเอียดของไบนารีสามารถให้มุมมองเชิงลึกและช่วยเพิ่มพูนความรู้ได้
  • C# Hello World ที่คอมไพล์แบบพึ่งพาตัวเองได้อย่างสมบูรณ์สามารถมีขนาดประมาณ 440 kB
  • .NET Framework แบบคลาสสิกถูกยกเลิกแล้ว และไม่ควรใช้สร้างแอปใหม่
  • การคอมไพล์ด้วยคอมไพเลอร์ C อาจง่ายกว่าการใช้ .NET
  • มีความคิดเห็นบางส่วนที่แสดงความสนใจต่อไฟล์รัน .NET ที่คอมไพล์เป็นเนทีฟ
  • โมดูล Hello.dll ของ Oberon+ IDE มีขนาดเพียง 2048 ไบต์
  • มีการสร้างไฟล์ Hello World แบบ com ที่มีขนาดต่ำกว่า 1k โดยใช้ TurboPascal v1