Présentation du langage Brainfuck

Brainfuck ne possède que huit instructions (>, <, +, -, ,, ., [, ]) et un seul type de mémoire : un ruban théoriquement infini de cellules de 8 bits (u8). Le pointeur se déplace à droite ou à gauche avec > et <, les valeurs sont incrémentées ou décrémentées avec + et -, et les boucles sont contrôlées par [ et ]. L’absence de registres multiples ou d’opérations arithmétiques natives rend chaque calcul explicite et coûteux en nombre d’instructions.

Choix de la représentation numérique

Pour tracer des géométries, l’auteur a introduit un format fixe Q16.16. Chaque valeur est stockée sur deux cellules : les 16 bits de poids fort représentent la partie entière, les 16 bits de poids faible la partie fractionnaire. Cette résolution de 1/2^16 ≈ 1.5·10⁻⁵ offre un intervalle de [-32768, 32767), suffisant pour placer une sphère de rayon 1000 dans la scène tout en conservant la précision nécessaire aux calculs d’intersection.

Implémentation des primitives arithmétiques

Le générateur pseudo‑aléatoire utilisé pour l’anti‑aliasing est un LCG très simple : A = (5·A + 1) % 256. Cette formule garantit un cycle complet de 256 valeurs, ce qui évite les répétitions prématurées dans les échantillons. Pour la racine carrée, les méthodes classiques (Taylor, Heron) ont été rejetées à cause du coût des divisions. L’auteur a opté pour une méthode de division longue appliquée aux valeurs codées en Q16.16 : en calculant isqrt(N) où N = x·2^16, le résultat N' correspond à sqrt(x)·2^16. La différence d’un bit dans N' modifie la racine décodée de moins de 1/2^16, assurant une précision suffisante pour le rendu.

[ - > + < ]   ; move : transfère la valeur d’une cellule vers la suivante
[ - > + > + << ] ; copy : duplique la valeur dans deux cellules adjacentes

Ces deux boucles constituent les blocs de base du code : move vide la cellule source tout en incrémentant la destination, tandis que copy conserve la source et crée une copie. Toutes les opérations plus complexes (addition, division, comparaison) sont construites à partir de séquences répétées de ces primitives, ce qui explique la longueur importante du programme final.

Architecture du compilateur et limites

Le processus de génération se déroule en trois étapes : parsing d’un DSL intermédiaire, transformation en forme proche SSA (variables préfixées à la hongroise) et emission du code Brainfuck. Le dictionnaire qui mappe chaque variable à une adresse du ruban évite les collisions lors de la résolution des références. Malgré cette organisation, le rendu reste limité par la vitesse d’interprétation : chaque opération arithmétique nécessite plusieurs dizaines d’instructions Brainfuck, et le ruban doit être parcouru à chaque boucle. Aucun benchmark chiffré n’est fourni, mais l’auteur indique que le programme produit l’image de référence du « Metal section of RIW », ce qui prouve la faisabilité même si le temps d’exécution reste prohibitif pour des résolutions supérieures.