WebAssembly, ou wasm, est un standard du World Wide Web pour le développement d’applications. Complémentaire de JavaScript, ce format binaire est aussi réputé pour ses performances supérieures qui accélèrent les applications Web. L’ajout envisagé d’une fonctionnalité multi-valeur permettrait aux fonctions de renvoyer de nombreuses valeurs, ce qui aurait des avantages en terme de taille de code et offrirait d’autres possibilités d'instruction. La proposition lèverait les restrictions actuelles sur les fonctions, qui ne peuvent retourner qu'une valeur zéro ou un, et sur les séquences d'instructions du genre « blocks », « ifs » et « loops », qui ne peuvent pas ingérer les valeurs de pile et ne peuvent produire qu'une valeur de pile de zéro ou de un.

Selon le bulletin publié par Mozilla et la Bytecode Alliance, « en supprimant ces restrictions, les fonctions pourraient retourner un nombre arbitraire de valeurs et les séquences d'instructions pourraient produire un nombre arbitraire de valeurs de pile ». La multi-valeur est également une condition préalable pour les types d'interface Wasm qui décrivent des valeurs de haut niveau comme les enregistrements, les séquences et les chaînes de caractères.

Les fonctions à valeurs multiples ouvrent plusieurs perspectives

La motivation de ce projet de fonctions à valeurs multiples, c’est que les valeurs de retour multiples pour les fonctions permettraient de déconditionner les « tuples » ou les « structs » retournés par les valeurs et de compiler efficacement les valeurs de retour multiples. En outre, les étiquettes de « loop » peuvent avoir des arguments, une définition macro des instructions avec des entrées, comme le précise la proposition formelle déposée sur GitHub.

L’implémentation de valeurs multiples permettrait de préserver presque totalement la structure et le format de texte du langage. Le format binaire nécessite une modification pour autoriser le traitement des types de fonctions en tant que « blocks ». L'encodage ad hoc actuel doit être étendu pour permettre des références aux types de fonctions. Le développeur Nick Fitzgerald a déclaré qu'il avait ajouté le support multi-valeurs aux « crates » de la chaîne d'outils de Rust et de WebAssembly ainsi qu'au runtime Wasmtime de WebAssembly.