Aktueller Stand
- Derzeit wurden die SBCL-Laufzeitumgebung und der Compiler erfolgreich so portiert, dass sie auf der Nintendo Switch laufen können
- Die Anbindung an Shared Libraries ist ebenfalls möglich, und verschiedene Portabilitätsbibliotheken für Betriebssysteme wurden ebenfalls portiert
- Allerdings kommt es zu Abstürzen, wenn der Garbage Collector von SBCL arbeitet
- Keine Audioausgabe möglich, Probleme mit dem C-Callback-Mechanismus
- Auch Leistungsprobleme sind zu erwarten
Überblick
- Die Switch verwendet einen ARM64-Cortex-A57-Chip mit 4 GB RAM und läuft auf einem proprietären Mikrokernel-Betriebssystem
- SBCL verfügt bereits über einen ARM64-Linux-Port, sodass Probleme bei der Codegenerierung bereits gelöst sind
- Die Switch ist die einzige Konsole mit Unterstützung für die OpenGL-Grafikbibliothek, was die Portierung der Grafikbibliothek von Trial erleichtert
- Um mit der Entwicklung zu beginnen, wurde bei Nintendo of Europe ein Development Kit gekauft und das SDK installiert
SBCL-Build-Prozess
build-config: Sammelt Build-Konfigurationsoptionen und gibt sie in einem lesbaren Format aus
make-host-1: Baut mit einem Host-Lisp-Compiler einen Cross-Compiler
make-target-1: Erzeugt mit dem Ziel-C-Compiler die C-Laufzeitumgebung
make-host-2: Baut das Ziel-Lisp-System
make-target-2: Lädt den Cold Core in der Ziel-Laufzeitumgebung und schließt das Bootstrap ab
Build für die Switch
- Die Switch ist keine PC-Umgebung und hat weder Shell noch Kommandozeile oder Compiler
- Es können keine ausführbaren Speicherseiten erzeugt werden, daher ist keine Laufzeitkompilierung möglich
- Der Großteil des Codes ist plattformunabhängig und kann für ARM64 kompiliert werden
fasteval wird verwendet, um die Laufzeitkompilierung zu ersetzen
Garbage Collector
- Der Standard-GC von SBCL ist
gencgc, ein generationaler Garbage Collector
- In Multithreading-Umgebungen treten Probleme beim Verschieben von Objekten auf
- Auf Unix-Systemen werden Threads per Signalmechanismus angehalten, auf der Switch ist das jedoch nicht möglich
- Stattdessen wird eine „Safepoints“-Strategie verwendet, damit Threads sich selbst anhalten
Weitere Arbeiten
- CLOS so weit wie möglich fixieren und Precompilation weiter untersuchen
- Aufgrund des leistungsschwachen Prozessors der Switch sind zusätzliche Optimierungen nötig
- Der Garbage Collector muss vollständig funktionsfähig werden
- Das C-Callback-Problem muss gelöst werden
Fazit
- Aufgrund einer NDA können nicht alle Arbeiten offengelegt werden, aber die Teile, die möglich sind, werden veröffentlicht
- Unterstützung wird über Patreon, GitHub und Ko-Fi erbeten
GN⁺-Zusammenfassung
- Dieser Artikel behandelt den Prozess und die Herausforderungen bei der Portierung der Common-Lisp-Laufzeitumgebung auf die Nintendo Switch
- Durch das proprietäre Betriebssystem und die Hardware-Beschränkungen der Switch ergeben sich viele technische Schwierigkeiten
- Zu den wichtigsten Herausforderungen zählen der Garbage Collector und Multithreading-Probleme sowie Probleme mit der Laufzeitkompilierung
- Das Projekt bietet nützliche Informationen für Common-Lisp-Entwickler und Spieleentwickler
1 Kommentare
Hacker-News-Kommentare
Ich habe einige Wochen lang mit Trial die Spieleentwicklung in Common Lisp getestet, und es war eine sehr erfreuliche Erfahrung.
SBCL ist eine hervorragende Sprachimplementierung, und ich wollte schon immer CL-Entwicklung für eine „echte“ Spielkonsole ausprobieren.
Vielen Dank an den Autor für diesen interessanten und detaillierten Artikel.
Ich frage mich, warum das offizielle SDK verwendet wurde.
Ich habe Kandria gekauft.
SBCL – „Steel Bank Common Lisp“
Ihre Arbeit ist erstaunlich.
Ich wünschte, Nintendo und Sony würden solche Bemühungen unterstützen.
Etwas off-topic, aber es wäre erstaunlich, Yuzu auf die Nintendo Switch zu portieren.
Genau deswegen komme ich zu HN.