Ce qui se passe
Toute coloration syntaxique repose sur une grammaire par langage. gpu-lexer prend le problème à l'envers : il découpe la source en mots, espaces, retours à la ligne et symboles, puis un modèle WebGPU minuscule combine le contexte local et celui du fichier entier pour étiqueter chacun. Les étiquettes voisines deviennent des spans, parmi neuf classes :
import { parse } from 'gpu-lexer'
const spans = await parse('source code')
// { type: 'plain' | 'comment' | 'string' | 'number' | 'keyword'
// | 'type' | 'function' | 'constant' | 'operator',
// start: number, end: number }[]Le modèle pèse 41 321 paramètres, entraînés sur 4 688 781 jetons, et le même bundle sert tous les langages — y compris ceux absents de l'entraînement.
Les mesures
Sur dix copies de three.min.js (5,56 M de caractères), une exécution
navigateur après préchauffage le 9 septembre, MacBook Pro M4 Pro, Chrome 152,
chaque moteur dans son worker, rendu DOM exclu :
| Bibliothèque | Temps |
|---|---|
| gpu-lexer | 402,0 ms |
| Sugar High 2.3.1 | 836,2 ms |
| Prism.js 1.30.0 | 1,16 s |
| Highlight.js 11.12.0 | 1,29 s |
| Starry Night 3.11.0 | 11,0 s |
| Shiki 4.4.3 | 29,6 s |
Côté poids, 27,4 Ko minifiés et compressés en Brotli pour 75 langages, contre 8,6 Ko (Prism) et 14,9 Ko (Highlight.js) pour six langages du web seulement.
L'accord est mesuré contre Shiki, ramené à 100 %, sur 1 103 fichiers exclus de l'entraînement, pondérés par la popularité des 25 premiers langages du GitHub Innovation Graph (2026-Q1) : gpu-lexer 90,35 %, Prism.js 86,93 %, Highlight.js 84,31 %.
Ce que ça vaut
Les auteurs sont clairs : c'est « une expérience, pas un équivalent de grammaire ». 11,98 % des étiquettes diffèrent de Shiki, et cette mesure dit l'accord, pas la justesse. Le résultat varie beaucoup selon le langage : ActionScript, Python et JSX passent 95 %, Jinja et Visual Basic tombent sous 50 %. Rien là-dedans ne remplace un compilateur, un linter ou un analyseur.
Source : gpu-lexer.