Java decompiler ตัวใหม่ที่ชื่อ garlic-decompiler ได้เปิดตัวแล้ว โดยเขียนด้วยภาษา C ทั้งหมดและอ้างว่ามีประสิทธิภาพที่ดีขึ้นอย่างมากเมื่อเทียบกับเครื่องมือแบบดั้งเดิมที่เขียนด้วย Java โปรเจกต์นี้มีเป้าหมายในการแปลง Java bytecode ที่คอมไพล์แล้วกลับเป็นซอร์สโค้ดที่อ่านได้ โดยรองรับไฟล์ .class, JAR archives และ WAR files
ประเภทไฟล์ที่รองรับ:
- ไฟล์ .class ( Java bytecode )
- ไฟล์ .jar ( Java archives )
- ไฟล์ .war ( Web application archives )
- ไฟล์ .dex (วางแผนไว้ แต่ยังไม่รองรับในปัจจุบัน)
การอ้างสิทธิ์ด้านประสิทธิภาพเทียบกับการตรวจสอบความเป็นจริง
นักพัฒนาอ้างว่า garlic-decompiler ทำงานเร็วกว่าทางเลือกที่เขียนด้วย Java ประมาณ 10 เท่า ในขณะที่ใช้ทรัพยากรระบบน้อยกว่า ไฟล์ที่คอมไพล์แล้วมีขนาดเพียง 300KB ทำให้มีน้ำหนักเบาอย่างน่าทึ่ง อย่างไรก็ตาม การทดสอบเบื้องต้นโดยสมาชิกชุมชนเผยให้เห็นปัญหาในช่วงเริ่มต้นที่เป็นเรื่องปกติของโปรแกรม C ที่จัดการกับโครงสร้างข้อมูลที่ซับซ้อน
ผู้ใช้คนหนึ่งรายงาน segmentation fault ขณะประมวลผลไฟล์ JAR ที่เปิดใช้งาน multiple threads ซึ่งเน้นย้ำถึงความท้าทายของการจัดการหน่วยความจำใน C เมื่อจัดการกับการแยกวิเคราะห์ Java bytecode นักพัฒนาตอบสนองอย่างรวดเร็วโดยขอไฟล์ที่มีปัญหาเพื่อแก้ไขปัญหา
การอ้างสมรรถนะ:
- เร็วกว่า decompiler ที่ใช้ Java ถึง 10 เท่า
- ใช้ทรัพยากรน้อยกว่าทางเลือกที่ใช้ Java
- รองรับการประมวลผลแบบ multi-threaded (ค่าเริ่มต้น: 4 threads)
ปัญหาการจัดการหน่วยความจำเริ่มปรากฏ
การอภิปรายทางเทคนิคในชุมชนมุ่งเน้นไปที่แนวทางการจัดการหน่วยความจำของโปรเจกต์ decompiler ใช้ string library แบบกำหนดเองและใช้ memory pools แยกต่างหากสำหรับการดำเนินการแบบ multi-threaded พร้อมกับ global pool สำหรับโหมด single-threaded
อย่างไรก็ตาม นักพัฒนาที่มีประสบการณ์ได้ระบุปัญหาที่อาจเกิดขึ้นซึ่งโค้ดผสม static strings กับ heap-allocated strings อย่างไม่สอดคล้องกัน สิ่งนี้สร้างสถานการณ์ที่ฟังก์ชันที่เรียกใช้ไม่สามารถกำหนดได้อย่างถูกต้องว่าควรจะปลดปล่อยหน่วยความจำที่ส่งคืนหรือไม่ ซึ่งอาจนำไปสู่ memory leaks หรือการ crash
แนวทางการพัฒนาและแผนอนาคต
โปรเจกต์นี้แสดงถึงความพยายามที่ทำด้วยมือเป็นส่วนใหญ่ โดยนักพัฒนาระบุว่าทำด้วยมือ 90% และ AI 10% ซึ่งเป็นอัตราส่วนที่หลายคนในชุมชนมองว่าเหมาะสำหรับโปรเจกต์ที่มุ่งเน้นการเรียนรู้ แรงจูงใจดูเหมือนจะเป็นทั้งเพื่อการศึกษาและการปฏิบัติ โดยมีเป้าหมายเพื่อทำความเข้าใจ JVM internals ในขณะที่สร้างเครื่องมือที่เร็วกว่า
ผมกำลังเขียนส่วนของการ decompile dex และ apk ความเร็วปัจจุบันเร็วกว่า Java ประมาณ 10 เท่า และใช้ทรัพยากรน้อยกว่า Java
การพัฒนาในอนาคตรวมถึงการวางแผนรองรับไฟล์ Android DEX แม้ว่าฟีเจอร์นี้ยังไม่ได้ถูกนำมาใช้ โปรเจกต์ยังรวมถึงโหมดคล้าย javap สำหรับการวิเคราะห์ bytecode ที่เร็วขึ้น โดยปิดใช้งาน LineNumber และ StackMapTable attributes เพื่อปรับปรุงประสิทธิภาพ
ข้อกำหนดในการ Build:
- cmake >= 3.26
- ไม่มี dependencies อื่น ๆ
- ขนาดไฟล์ binary ที่คอมไพล์แล้ว: ~300KB
สรุป
แม้ว่า garlic-decompiler จะแสดงให้เห็นความมีแนวโน้มที่ดีด้วยการอ้างสิทธิ์ด้านความเร็วและการออกแบบที่มีน้ำหนักเบา แต่ก็เผชิญกับความท้าทายทั่วไปของโปรแกรม C ที่จัดการกับงานการแยกวิเคราะห์ที่ซับซ้อน การตอบสนองของนักพัฒนาต่อรายงานข้อบกพร่องอย่างแข็งขันและลักษณะเชิงการศึกษาของโปรเจกต์บ่งบอกว่าอาจพัฒนาเป็นทางเลือกที่เป็นไปได้สำหรับ Java decompilers ที่มีอยู่ หากปัญหาการจัดการหน่วยความจำได้รับการแก้ไข ในตอนนี้ ผู้ใช้ควรคาดหวังข้อบกพร่องบางอย่างที่เป็นเรื่องปกติของโปรเจกต์ C ในช่วงเริ่มต้นที่จัดการกับการวิเคราะห์ bytecode ที่ซับซ้อน
อ้างอิง: garlic-decompiler