สถานะปัจจุบัน
- ขณะนี้พอร์ตเสร็จแล้วจนสามารถรันรันไทม์และคอมไพเลอร์ของ SBCL บน Nintendo Switch ได้
- สามารถเชื่อมต่อกับไลบรารีที่ใช้ร่วมกันได้ และได้พอร์ตไลบรารีด้านความเข้ากันได้ของระบบปฏิบัติการหลายตัวเสร็จแล้ว
- อย่างไรก็ตาม เมื่อ garbage collector ของ SBCL ทำงานจะเกิดการแครช
- ยังไม่สามารถส่งออกเสียงได้ และมีปัญหากับกลไก C callback
- คาดว่าน่าจะมีปัญหาด้านประสิทธิภาพด้วย
ภาพรวม
- Switch ใช้ชิป ARM64 Cortex-A57 และ RAM 4GB และทำงานบนระบบปฏิบัติการแบบไมโครเคอร์เนลที่เป็นกรรมสิทธิ์
- SBCL มีพอร์ต ARM64 Linux อยู่แล้ว จึงแก้ปัญหาเรื่องการสร้างโค้ดได้
- Switch เป็นคอนโซลเพียงเครื่องเดียวที่รองรับไลบรารีกราฟิก OpenGL ทำให้พอร์ตไลบรารีกราฟิกของ Trial ได้ง่าย
- เพื่อเริ่มพัฒนา ได้ซื้อชุดพัฒนาจาก Nintendo of Europe และติดตั้ง SDK
กระบวนการบิลด์ SBCL
build-config: รวบรวมตัวเลือกการตั้งค่าบิลด์และแสดงผลในรูปแบบที่อ่านได้
make-host-1: สร้าง cross-compiler ด้วยคอมไพเลอร์ Lisp ฝั่งโฮสต์
make-target-1: สร้าง C runtime ด้วยคอมไพเลอร์ C ฝั่งเป้าหมาย
make-host-2: บิลด์ระบบ Lisp ฝั่งเป้าหมาย
make-target-2: โหลด cold core บน target runtime และทำ bootstrap ให้เสร็จสมบูรณ์
การบิลด์สำหรับ Switch
- Switch ไม่ใช่สภาพแวดล้อมแบบ PC และไม่มีเชลล์ บรรทัดคำสั่ง หรือคอมไพเลอร์
- ไม่สามารถสร้างหน้าหน่วยความจำที่รันโค้ดได้ จึงไม่สามารถคอมไพล์ระหว่างรันไทม์ได้
- โค้ดส่วนใหญ่ไม่ขึ้นกับแพลตฟอร์มและสามารถคอมไพล์เป็น ARM64 ได้
- ใช้
fasteval เพื่อทดแทนการคอมไพล์ระหว่างรันไทม์
Garbage Collector
- GC มาตรฐานของ SBCL คือ "gencgc" ซึ่งเป็น garbage collector แบบแบ่งเจเนอเรชัน
- เกิดปัญหาเรื่องการย้ายอ็อบเจ็กต์ในสภาพแวดล้อมแบบมัลติเธรด
- บนระบบ Unix จะใช้กลไกสัญญาณเพื่อพักเธรด แต่บน Switch ทำแบบนั้นไม่ได้
- จึงใช้กลยุทธ์ "safepoints" เพื่อให้เธรดพักตัวเอง
งานถัดไป
- ตรึง CLOS ให้ได้มากที่สุดและสำรวจการคอมไพล์ล่วงหน้า
- ต้องมีการปรับแต่งเพิ่มเติมเนื่องจากโปรเซสเซอร์ของ Switch มีประสิทธิภาพต่ำ
- ต้องทำให้ garbage collector ทำงานได้อย่างสมบูรณ์
- ต้องแก้ปัญหา C callback
บทสรุป
- เนื่องจากติด NDA จึงไม่สามารถเปิดเผยรายละเอียดงานทั้งหมดได้ แต่กำลังเปิดเผยในส่วนที่ทำได้
- ขอรับการสนับสนุนผ่าน Patreon, GitHub และ Ko-Fi
สรุปโดย GN⁺
- บทความนี้กล่าวถึงกระบวนการและความท้าทายในการพอร์ตรันไทม์ Common Lisp ไปยัง Nintendo Switch
- เนื่องจากข้อจำกัดของฮาร์ดแวร์และระบบปฏิบัติการแบบกรรมสิทธิ์ของ Switch จึงเกิดความยากทางเทคนิคหลายด้าน
- ปัญหาเกี่ยวกับ garbage collector และมัลติเธรด รวมถึงปัญหาการคอมไพล์ระหว่างรันไทม์ คือความท้าทายหลัก
- โปรเจกต์นี้มอบข้อมูลที่เป็นประโยชน์แก่ทั้งนักพัฒนา Common Lisp และนักพัฒนาเกม
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
ตลอดช่วงหลายสัปดาห์ที่ผ่านมาได้ลองใช้ Trial เพื่อทดสอบการพัฒนาเกมด้วย Common Lisp และเป็นประสบการณ์ที่สนุกมาก
SBCL เป็นอิมพลีเมนเทชันภาษาที่ยอดเยี่ยม และอยากลองพัฒนา CL สำหรับเครื่องเกมคอนโซล "ของจริง"
ขอบคุณผู้เขียนสำหรับบทความที่น่าสนใจและลงรายละเอียดมาก
สงสัยว่าทำไมถึงใช้ SDK อย่างเป็นทางการ
ซื้อ Kandria แล้ว
SBCL - "Steel Bank Common Lisp"
งานของเธอน่าทึ่งมาก
อยากให้ Nintendo และ Sony สนับสนุนความพยายามแบบนี้
ออกนอกประเด็นไปนิด แต่การพอร์ต Yuzu ไปลง Nintendo Switch ก็คงน่าทึ่งมาก
นี่แหละคือเหตุผลที่เข้ามา HN