Introduction

L'auteur a récemment créé un interpréteur de tail-call en utilisant le mot-clé become, récemment ajouté à la version nightly de Rust. Cet interpréteur a été utilisé pour émuler le processeur Uxn, qui est utilisé dans l'écosystème Hundred Rabbits.

Contexte Technique

Le processeur Uxn est une machine à pile simple avec 256 instructions. La mémoire du processeur est divisée en plusieurs parties, notamment deux piles de 256 octets, 65536 octets de RAM et 256 octets de mémoire de périphériques. L'interpréteur le plus simple lit un octet de la RAM à l'adresse du pointeur de programme, puis appelle une fonction qui correspond à l'instruction.

Le code assembleur utilise une technique appelée threaded code, où chaque instruction se termine par un saut à l'instruction suivante. Cela permet d'améliorer les performances en réduisant le nombre de branches non prédites. Cependant, cela nécessite de maintenir environ 2000 lignes de code et est très dangereux.

Analyse et Implications

L'utilisation d'un interpréteur de tail-call en Rust permet d'obtenir les mêmes avantages que le code assembleur sans avoir à écrire chaque instruction en assembleur. L'idée principale est de stocker l'état du programme dans les arguments de fonction, qui sont mappés aux registres en fonction de la convention d'appel du système.

Cependant, l'implémentation initiale a rencontré un problème de débordement de pile en raison de la façon dont le compilateur Rust gère les appels de fonction. La solution consiste à utiliser le mot-clé become pour indiquer au compilateur de générer un saut à registre au lieu d'un saut et de lien, et de ne pas allouer d'espace persistant sur la pile.

Perspective

L'utilisation d'interpréteurs de tail-call en Rust offre des perspectives intéressantes pour améliorer les performances des émulateurs et des interpréteurs. Cependant, il est important de surveiller les limites de cette approche, notamment en termes de complexité du code et de maintenance. Les prochaines étapes pourraient consister à explorer d'autres applications de cette technique et à améliorer les outils de développement pour faciliter son utilisation.