by m3rLinEz
12. February 2011 09:23
IKVM เป็น run-time ที่ใช้แปลง byte code ของ Java ไปเป็น IL บน .NET รวมถึงมี Base Class Library ของ Java ที่ implement เป็น .NET ให้เรียกใช้ด้วย ตอนนี้ใช้งานได้ในสองโหมดคือ
1. เอา IKVM ไปแทน Java ไปเลย สั่งรัน class ของ Java หรือ .JAR ที่ build มาแล้วได้ทันทีบน .NET Framework
2. แปลง byte code ไปเป็น IL ให้เสร้จก่อน แล้วเรียกใช้เหมือน app ปกติ (หรือ add reference ไปในกรณ๊ที่เป็น library)
กรณีทั่วๆไปคงหาโอกาสใช้ให้เกิดประโยชน์ได้ยาก ถ้าโปรแกรมเล็กๆเขียนใหม่จาก Java –> .NET ดูจะเป็นวิธีแก้ปัญหาที่ดีกว่า ถ้าแต่โปรแกรมมันเริ่มซับซ้อนและใหญ่ และการใช้งานจริงๆเราก็มองว่าเป็น black box (give input, get output) แก้ปัญหาโดยใช้ IKVM ก็ไม่เลว เคสของผมคือมันมี logic สำหรับการแกะ format อะไรซักอย่างที่มัน proprietary มากๆ spec ก็คงหาค่อนข้างยาก ให้แกะ spec จากโค้ดลองดูแล้วนิดหน่อยก็คิดว่าคงใช้เวลามหาศาล แต่โชคดีที่มันมี implementation ที่เป็น Java อยู่แล้ว ก็ใช้ IKVM แปลงมาเป็น library ใน .NET แล้วเรียกใช้ได้เลย
ตอนแรกคิดว่าคงมีปัญหาแน่ๆ เพราะ library มันก็ใหญ่มากอยู่ แต่ปรากฎว่าผ่านฉลุยตั้งแต่รอบแรกอย่างน่าตกใจ o__o! วันนี้กลับมาบ้านเลยมาลองกับ project วิชา programming methodology ที่เคยเขียนเป็น game คู่กับแบงค์ ทิ้งไว้เมื่อตอนปีสอง ถ้าวัดในแง่ขนาดของโค้ดคงเล็กกว่าที่แปลงก่อนหน้านี้หลักร้อยเท่า แต่เนื่องจากมันเป็น game เลย depends on libraries หลายตัว อาทิ:
- Swing ทำ GUI
- อ่านเขียนไฟล์
- Audio เล่นเสียง
- คลาสพวกจัดการ Image
- Math
- อ่าน Image จากไฟล์ใน JAR (เทียบได้กับ Resource ล่ะมั้ง)
- ..
รัน
ikvmc CPLander100.jar
ได้มาเป็น CPLander100.exe ผลคือ
- Start up นานได้ใจ (เกือบ 3 วินาที)
- เปิดเมนูหน้าแรกได้ ใช้ได้ Hooray!
- In game ใช้ได้ แต่ออกมาเมนูข้างนอกอีกรอบไม่ได้ T_T
- เสียงหาย
- ช้ากว่ารันด้วย Java มาก (สมเหตุสมผล)
- Component ของ Swing ที่ใช้ทำงานถูก
- พวก Math มีคำนวณพลาดจน paint ภาพผิดตำแหน่ง คิดว่าน่าจะเกิดจากตอนเขียนโค้ดไม่ระวังเรื่องพวกใช้ floating point (มั้ง)
ถึงจะรันได้ไม่ perfect แต่โดยรวมถูกใจ IKVM มาก ว่างๆไปหาโอกาสเล่นกันดู ยกนิ้วให้คนทำ –/\-
