Il y a aussi la solution qui consiste à toujours déclarer explicitement la mutabilité, que la variable soit mutable ou non. Comme en Kotlin (var
/val
– oui, les opérateurs ont presque le même nom), en Swift (var
/let
) ou en JS moderne (let
/const
– on notera que let
est une variable en JS mais une constante en Swift…).
À noter que, selon le langage, ça ne résous pas le problème de la distinction entre « variable immutable » et « constante connue et résolue par le compilateur » – qui sont deux choses très différentes – ni entre – « variable immutable y compris son contenu (variable immutable qui contient une structure immutable) » et « variable immutable au contenu mutable », un autre grand classique des incompréhensions de ce qu’est une variable immutable, et très important pour les performances et les problèmes de parallélisation.
Ça c’est dans le cas générique.
Dans le cas spécifique des langages de shader, c’est un contexte d’exécution avec des contraintes très spécifiques. Donc si le but est d’écrire un langage de shader, il faudrait s’assurer de bien comprendre ces contraintes et ce qu’elles impliquent sur la programmation, tant d’un point de vue technique (je pense aux performances, c’est des domaines où c’est souvent primordial) que d’un point de vue « utilisateur final » – les développeurs qui vont devoir utiliser le langage dans la réalité.
C’est très important (et hélas très compliqué) d’avoir les deux connaissances pour faire un langage efficace et que tu ne sois pas le seul à utiliser ; et honnêtement je ne pense pas que le code existant t’aide beaucoup à ce sujet. Notamment parce que les contraintes des langages existants impactent énormément leur usage. Par exemple en Java, les variables sont mutables par défaut, ce qui conduit à beaucoup de réutilisation non nécessaire de variables, qui sont donc réutilisées (avec une réaffectation dans le code) sans raison valable – pas exemple à cause de croyances sur les optimisations faites par le compilateur ou l’interpréteur.
Un exemple dans la vraie vie : dans les langages qui tournent sur la JVM et compatibles avec des bibliothèques Java, on trouve entre autres Scala et Kotlin. Scala est beaucoup plus « propre » selon la théorie des langages, mais sa lenteur atroce de compilation (partiellement corrigée) et sa syntaxe parfois difficile à lire font qu’il est sensiblement moins utilisé que Kotlin, un langage pensé par des développeurs, pour des développeurs, pour être le plus efficace possible dans leur contexte.
En résumé : sur ce point de détail, c’est pas très important et tu peux t’en sortir en bottant en touche (tout déclarer explicitement). Mais d’une façon générale, pour bien concevoir un langage qui ne soit pas un pur produit de recherche ou de développement, tu vas avoir besoin de beaucoup de connaissances sur l’utilisation souhaitée et sur les contraintes techniques d’exécution.