Je vais d'abord joindre le référentiel GitHub : wasm3-tinygo-psp.
Depuis quelques temps déjà, je souhaitais faire tourner Golang sur PSP.
Cependant, la compilation native sur la PSP est impossible (probablement).
Certes, Golang prend en charge GOARCH=mipsle, mais cela suppose la présence d'un système d'exploitation. Si vous essayez d’y parvenir, vous devrez probablement emprunter un chemin très difficile et épineux.
Alors, j'ai choisi une autre voie. En d'autres termes, l'approche consiste à le convertir en WASM à l'aide de TinyGo.
Maintenant, jetons un œil au code réel.
package main import "unsafe" //go:wasmimport debug println func println(ptr unsafe.Pointer, len int32) //export start func start() { main() } func main() { message := "Hello, WebAssembly, from Golang!" println(unsafe.Pointer(unsafe.StringData(message)), int32(len(message))) }
Essentiellement, nous appelons simplement les fonctions fournies par le runtime. C'est juste un exemple de Hello World.
Il existait également une option permettant d'utiliser Rust et wasmi pour le runtime, mais bien que cela fonctionnait sur des émulateurs comme PPSSPP, des erreurs se produisaient sur le matériel réel (comme le montre la capture d'écran ci-dessous).
Je soupçonne que cela peut être lié au mode noyau, mais comme je n'ai finalement pas pu le résoudre, j'ai adopté une approche différente.
En fin de compte, la combinaison de C et Wasm3 a fonctionné avec succès.
Concernant println, qui a été mentionné dans le code précédent, il est défini côté exécution comme suit.
#define printf pspDebugScreenPrintf static const void* host_debug_println(IM3Runtime runtime, IM3ImportContext ctx, uint64_t *stack, void *mem) { uint32_t ptr = (uint32_t) stack[0]; uint32_t length = (uint32_t) stack[1]; uint8_t* bytes = (uint8_t*)mem + ptr; char buffer[256]; if (length >= sizeof(buffer)) { length = sizeof(buffer)-1; } memcpy(buffer, bytes, length); buffer[length] = ''; printf("%s\n", buffer); return NULL; }
Puisqu'il ne s'agit que d'une démo, c'est tout pour le moment. Cependant, si vous enveloppez également d'autres fonctions et les rendez appelables depuis WASM, vous devriez être en mesure de développer des applications à part entière.
Il était nécessaire de compiler Wasm3 à l'aide de la chaîne d'outils PSP.
J'ai créé un référentiel forké pour permettre à tout le monde de configurer facilement l'environnement, alors jetez un œil pour référence : wasm3-for-psp.
Au final, je me suis retrouvé avec la commande tinygo build -o hello.wasm -target=wasm -no-debug main.go, mais il m'a fallu pas mal de temps pour arriver à une commande aussi simple. J'ai encore beaucoup à apprendre.
Si vous utilisez -target=wasi, TinyGo exporte la fonction principale sous _start. Mais dans ce cas, j'ai dû définir et exporter une fonction de démarrage distincte.
Cette fois, j'ai utilisé TinyGo pour compiler du code Golang dans WASM, mais si d'autres langages peuvent également être compilés dans WASM, je pense qu'ils peuvent être exécutés en utilisant une méthode similaire. Je suis passionné par Golang, donc je serais heureux si quelqu'un pouvait l'essayer.
C'est tout. Merci d'avoir lu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!