1 คะแนน โดย GN⁺ 2024-09-14 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

สถานะปัจจุบัน

  • ขณะนี้พอร์ตเสร็จแล้วจนสามารถรันรันไทม์และคอมไพเลอร์ของ 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

  1. build-config: รวบรวมตัวเลือกการตั้งค่าบิลด์และแสดงผลในรูปแบบที่อ่านได้
  2. make-host-1: สร้าง cross-compiler ด้วยคอมไพเลอร์ Lisp ฝั่งโฮสต์
  3. make-target-1: สร้าง C runtime ด้วยคอมไพเลอร์ C ฝั่งเป้าหมาย
  4. make-host-2: บิลด์ระบบ Lisp ฝั่งเป้าหมาย
  5. 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 ความคิดเห็น

 
GN⁺ 2024-09-14
ความคิดเห็นใน Hacker News
  • ตลอดช่วงหลายสัปดาห์ที่ผ่านมาได้ลองใช้ Trial เพื่อทดสอบการพัฒนาเกมด้วย Common Lisp และเป็นประสบการณ์ที่สนุกมาก

    • ข้อดีอย่างมากคือสามารถแก้ไขได้แทบทุกส่วนขณะที่เกมกำลังรันอยู่
    • หวังว่าพอร์ตนี้จะประสบความสำเร็จ
  • SBCL เป็นอิมพลีเมนเทชันภาษาที่ยอดเยี่ยม และอยากลองพัฒนา CL สำหรับเครื่องเกมคอนโซล "ของจริง"

    • รู้สึกประหลาดใจที่ Shinmera กำลังทำงานนี้อยู่
    • ตอนที่เคยลองดูภายในของ SBCL แวบหนึ่งก็รู้สึกหวาดหวั่น เลยขอชื่นชมเขา
    • สงสัยว่า SBCL (+เธรดดิ้ง/SDL2) ทำงานบน Raspberry Pi ได้หรือไม่
  • ขอบคุณผู้เขียนสำหรับบทความที่น่าสนใจและลงรายละเอียดมาก

    • รายละเอียดระดับนี้ปกติมักจะถูกเปิดเผยก็ต่อเมื่อวงจรชีวิตของคอนโซลสิ้นสุดลงแล้ว
    • ทุกครั้งที่ได้อ่านงานเชิงลึกแบบนี้ ก็รู้สึกอิจฉาซอฟต์แวร์แสนน่าเบื่อที่ตัวเองใช้ทั้งวัน
  • สงสัยว่าทำไมถึงใช้ SDK อย่างเป็นทางการ

    • อาจเป็นเพราะ Nintendo ไม่อนุญาตให้เผยแพร่เกมอย่างเป็นทางการถ้าสร้างด้วย SDK ของบุคคลที่สาม
  • ซื้อ Kandria แล้ว

    • ไม่ได้เล่นเกมมากนัก แต่การที่ Shinmera กำลังขยายขอบเขตของโลก Lisp เป็นสิ่งที่ควรสนับสนุน
  • SBCL - "Steel Bank Common Lisp"

    • SBCL เป็นคอมไพเลอร์ Common Lisp ประสิทธิภาพสูง และเป็นโอเพนซอร์ส/ซอฟต์แวร์เสรี
    • นอกจากคอมไพเลอร์และระบบรันไทม์สำหรับ ANSI Common Lisp แล้ว ยังมีส่วนขยายหลากหลาย เช่น ดีบักเกอร์, โปรไฟเลอร์เชิงสถิติ, เครื่องมือวัด code coverage เป็นต้น
  • งานของเธอน่าทึ่งมาก

    • สำหรับคนอย่างฉันที่ชอบใช้ CL ไปทั่วทุกที่ มันสร้างความยินดีอย่างมาก
  • อยากให้ Nintendo และ Sony สนับสนุนความพยายามแบบนี้

    • การเริ่มโปรแกรมอย่าง Github Accelerator ก็เป็นอีกวิธีหนึ่งในการสร้างเกม (IP) สำหรับคอนโซล
  • ออกนอกประเด็นไปนิด แต่การพอร์ต Yuzu ไปลง Nintendo Switch ก็คงน่าทึ่งมาก

  • นี่แหละคือเหตุผลที่เข้ามา HN

    • ขอชื่นชม OP และเพื่อนร่วมงานของเขา
    • ถ้า Nintendo เปิดกว้างกับระบบของตัวเองมากกว่านี้อีกหน่อย ก็คงเป็นพรอันยิ่งใหญ่