แอพพลิเคชันจดบันทึกงานอย่างง่ายสำหรับ Windows ที่สร้างด้วย C และ Win32 API ได้จุดประกายการอภิปรายทางเทคนิคอย่างกว้างขวางเกี่ยวกับการปรับขนาดไฟล์ไบนารี แนวทางการพัฒนา GUI สมัยใหม่ และวิวัฒนาการของการเขียนโปรแกรมบน Windows แอพพลิเคชันนี้ถูกอธิบายว่าทันสมัยโดยผู้สร้าง มีขนาด 278KB ตามความเห็นต่างๆ แม้ว่านักพัฒนาหลายคนแสดงความประหลาดใจกับขนาดไฟล์นี้สำหรับฟังก์ชันการทำงานที่พวกเขาถือว่าค่อนข้างพื้นฐาน
แอพ todo นี้แสดงให้เห็นเทคนิคการเขียนโปรแกรม GUI บน Windows โดยใช้ Win32 API โดยไม่ต้องใช้เฟรมเวิร์กหรือไลบรารี UI สมัยใหม่ มีฟีเจอร์ต่างๆ เช่น การสร้าง แก้ไข และลบรายการ todo การทำเครื่องหมายงานว่าเสร็จสมบูรณ์ การจัดเก็บข้อมูลถาวรใน AppData การรวมเข้ากับถาดระบบ และตัวเลือกการเริ่มต้นอัตโนมัติ
การปรับขนาดไบนารีให้เหมาะสม
หนึ่งในประเด็นที่มีการอภิปรายมากที่สุดของโปรเจกต์นี้คือขนาดไบนารี ผู้แสดงความคิดเห็นหลายคนแสดงความประหลาดใจที่ไฟล์ที่ประมวลผลได้มีขนาด 278KB โดยแนะนำว่าฟังก์ชันการทำงานที่คล้ายกันสามารถทำได้ด้วยขนาดที่เล็กกว่ามาก นักพัฒนาหลายคนเสนอเทคนิคการปรับแต่งที่สามารถลดขนาดไฟล์ลงได้อย่างมาก
ผมพยายามสร้างไบนารีนี้ขึ้นมาใหม่เพื่อดูว่า 278 KB นั้นถูกใช้ไปกับอะไร... โดยใช้ x86_64-15.1.0-release-win32-seh-msvcrt-rt_v12-rev0.7z เป็นชุดเครื่องมือ ซึ่งสร้างไฟล์ .exe ขนาด 102 KB ตั้งแต่แรกเราก็ทำได้ดีกว่า 278 KB ที่กล่าวอ้าง... เราสามารถปรับปรุงได้โดยการส่งสวิตช์บางตัวไปยัง GCC... gcc -s -Oz -flto => 47 KB
การอภิปรายเผยให้เห็นว่าความใหญ่ของไบนารีส่วนใหญ่น่าจะมาจากการลิงก์แบบสแตติกของไลบรารีรันไทม์ของ C นักพัฒนาถกเถียงถึงข้อดีของการลิงก์แบบสแตติกเทียบกับแบบไดนามิก โดยบางคนชี้ให้เห็นว่าแม้การลิงก์แบบไดนามิกจะสร้างไฟล์ที่ประมวลผลได้ที่เล็กกว่า แต่ก็ต้องแจกจ่าย DLL พร้อมกับแอพพลิเคชัน เว้นแต่ว่าจะเป็นส่วนหนึ่งของระบบปฏิบัติการอยู่แล้ว
เทคนิคการลดขนาดไฟล์ที่กล่าวถึง
- ตัวเลือกคอมไพเลอร์สำหรับการลดขนาด:
-Os
- การปรับแต่งเพื่อลดขนาด-Oz
- การปรับแต่งเพื่อลดขนาดที่มากขึ้น-flto
- การปรับแต่งในขั้นตอนการเชื่อมโยง-s
- การลบตารางสัญลักษณ์
- ตัวเลือกการเชื่อมโยง:
- การเชื่อมโยงแบบไดนามิกกับ DLL ของระบบ เทียบกับการเชื่อมโยงแบบสแตติก
- การใช้ MSVCRT.DLL ที่เป็นค่าเริ่มต้นของ MinGW เป็น C runtime
- การบีบอัดไฟล์ที่ประมวลผลแล้ว:
- มีการกล่าวถึง UPX เป็นเทคนิคในอดีต (พร้อมข้อกังวลเกี่ยวกับโปรแกรมป้องกันไวรัส)
คุณสมบัติของโครงการ
- เขียนด้วยภาษา C ล้วนโดยใช้ Win32 API
- การจัดการรายการสิ่งที่ต้องทำ (สร้าง, แก้ไข, ลบ, ทำเครื่องหมายว่าเสร็จสิ้น)
- การจัดเก็บข้อมูลถาวรใน %APPDATA%\TodoApp\todos.dat
- การรวมเข้ากับถาดระบบ
- ตัวเลือกเริ่มต้นอัตโนมัติพร้อมกับ Windows
- รองรับรายการสิ่งที่ต้องทำสูงสุด 100 รายการ
แนวทางการพัฒนา Windows สมัยใหม่
ผู้แสดงความคิดเห็นหลายคนตั้งคำถามเกี่ยวกับการอ้างว่าแอพพลิเคชันนี้ทันสมัย โดยชี้ให้เห็นว่าขาดคุณสมบัติเช่น การรองรับ high-DPI สไตล์ UI สมัยใหม่ และการนำทางด้วยแท็บระหว่างตัวควบคุม หลายคนแนะนำให้เพิ่มแมนิเฟสต์แอพพลิเคชัน Windows เพื่อเปิดใช้งานสไตล์ UI สมัยใหม่และคุณสมบัติ Windows ร่วมสมัยอื่นๆ
การอภิปรายเน้นให้เห็นว่าแนวทางการพัฒนา Windows ได้วิวัฒนาการไปตามกาลเวลาอย่างไร ในขณะที่การเขียนโปรแกรม Win32 API ใน C เคยเป็นวิธีมาตรฐาน นักพัฒนา Windows ส่วนใหญ่ได้ย้ายไปใช้เฟรมเวิร์กและภาษาระดับสูงขึ้นเช่น C++, Visual Basic และ Delphi ตั้งแต่ยุค Windows 95 ปัจจุบัน แม้แต่เอกสารของ Microsoft เองก็แนะนำให้ใช้ C++ มากกว่า C สำหรับการพัฒนา Windows
ความรู้สึกถวิลหาอดีตและคุณค่าในการเรียนรู้
แม้จะมีคำวิจารณ์ ผู้แสดงความคิดเห็นหลายคนแสดงความชื่นชมในคุณค่าทางการศึกษาของโปรเจกต์และความรู้สึกถวิลหาอดีต นักพัฒนาหลายคนรำลึกถึงประสบการณ์การเขียนโปรแกรม Windows ในช่วงแรกด้วยวิธีการที่คล้ายคลึงกัน โดยสังเกตว่ารูปแบบการพัฒนานี้ช่วยให้โปรแกรมเมอร์เข้าใจสิ่งที่เกิดขึ้นใกล้ชิดกับฮาร์ดแวร์
โปรเจกต์นี้จุดประกายการอภิปรายเกี่ยวกับวิวัฒนาการของแนวทางการพัฒนาตลอดหลายทศวรรษ โดยนักพัฒนารุ่นเก่าระลึกถึงเมื่อขนาดของไฟล์ที่ประมวลผลได้ถูกวัดเป็นกิโลไบต์มากกว่าเมกะไบต์ บางคนเปรียบเทียบแอพพลิเคชันขนาด 278KB กับข้อจำกัดของการเขียนโปรแกรมสำหรับระบบที่มีทรัพยากรจำกัดมากกว่า เช่น โปรเซสเซอร์ 6502 อย่างขบขัน
โปรเจกต์นี้แสดงให้เห็นว่าในขณะที่แนวทางการพัฒนาสมัยใหม่ได้เคลื่อนไปสู่การใช้แอบสแทรกชันระดับสูงขึ้นและไบนารีขนาดใหญ่ขึ้น ยังคงมีคุณค่าในการทำความเข้าใจพื้นฐานของ API ระบบปฏิบัติการและการเขียนโปรแกรมที่มีประสิทธิภาพ สำหรับผู้เริ่มต้นที่ต้องการเรียนรู้การเขียนโปรแกรม GUI บน Windows หรือนักพัฒนาที่มีประสบการณ์ที่ต้องการทบทวนพื้นฐาน โปรเจกต์เช่นนี้ให้จุดเริ่มต้นที่เข้าถึงได้ในการทำความเข้าใจว่าแอพพลิเคชัน Windows ทำงานอย่างไรในระดับที่ต่ำกว่า
อ้างอิง: Simple Todo (C / WinAPI)