JSIR de Google : une représentation intermédiaire basée sur MLIR pour l'analyse JavaScript

JSIR de Google : une représentation intermédiaire basée sur MLIR pour l'analyse JavaScript

lschvn5 min de lecture

Quand une représentation intermédiaire de compilateur fait la une, c'est que ça compte. Google a publié JSIR, un outil d'analyse JavaScript nouvelle génération basé sur MLIR, et il est déjà utilisé en interne pour des tâches qui révèlent toute l'ambition du projet : décompiler le bytecode Hermes vers JavaScript et alimenter des pipelines de désobfuscation assistée par IA combinant JSIR avec Gemini.

Pourquoi c'est important pour l'outillage

Une représentation intermédiaire est la structure de données qu'un compilateur ou un outil d'analyse utilise pour représenter le code entre le parsing et la génération de code. Si un AST vous dit à quoi ressemble le code结构llement, une IR vous dit ce qu'il fait. La qualité de votre IR détermine le type d'analyse et de transformation que vous pouvez effectuer.

L'outillage JavaScript a longtemps souffert d'approches fragmentées des IR. Les plugins Babel travaillent sur des AST. Les règles ESLint travaillent sur des AST. Les bundlers travaillent souvent sur leurs propres représentations internes avec une interopérabilité limitée. Une IR commune et bien conçue pourrait permettre à ces outils de partager le travail d'analyse — et c'est exactement ce que Google propose avec JSIR.

Haut niveau et bas niveau simultanément

Le défi technique central que JSIR résout est un classique du design de compilateurs : vous devez généralement choisir entre une IR de haut niveau (préserve la structure AST, peut être remontée à la source) et une IR de bas niveau (permet une analyse de flux profonde comme le suivi de taint et la propagation de constantes). La plupart des systèmes choisissent un.

JSIR utilise les régions MLIR pour modéliser précisément les structures de flux de contrôle de JavaScript — fermetures, try-catch-finally, fonctions async, cadres générateurs — d'une manière qui supporte les deux directions simultanément. Vous pouvez transformer le code et le remonter à la source, ou exécuter une analyse de taint sur la même représentation.

Cela ouvre des cas d'usage précédemment impraticables :

Décompilation : JSIR est utilisé chez Google pour décompiler le bytecode Hermes jusqu'au JavaScript. Hermes compile les apps React Native vers un bytecode compact pour des démarrages plus rapides ; la capacité de remontée à la source de JSIR est ce qui rend cette décompilation possible quand d'autres outils heurteraient un mur.

Désobfuscation : Google a publié des recherches (CASCADE) sur la combinaison de Gemini LLM avec JSIR pour la désobfuscation JavaScript. L'IA opère sur la représentation structurée de JSIR plutôt que sur la source obfusquée brute, produisant des transformations que JSIR applique pour reconstruire du code propre.

La Fondation MLIR

JSIR n'est pas un projet autonome — il est construit sur MLIR, le framework IR flexible du projet LLVM. C'est significatif pour la compatibilité avec l'écosystème : MLIR a déjà un large ensemble de dialectes, transformations et outils existants. En exprimant l'analyse JavaScript en termes MLIR, JSIR peut se brancher sur cet écosystème plutôt que de réinventer l'infrastructure.

Pour Commencer

JSIR est disponible sur GitHub à github.com/google/jsir. Le projet recommande d'utiliser Docker pour l'expérimentation locale :

docker build -t jsir:latest .
docker run --rm -v $(pwd):/workspace jsir:latest jsir_gen --input_file=/workspace/yourfile.js

Compiler depuis les sources requiert clang, Bazel, et un temps de build significatif — le projet note que la récupération et la compilation de LLVM prend du temps. Le chemin Docker est le point d'entrée pratique pour la plupart des développeurs.

Ce Que Ça Signifie pour l'Écosystème

La plupart des développeurs n'interagiront pas directement avec JSIR dans un avenir proche — c'est une fondation pour que les développeurs d'outils buildent dessus. Mais les implications à long terme sont significatives. Une IR partagée et bien conçue pourrait permettre :

  • Des linters avec une compréhension sémantique plus profonde (pas juste de la correspondance de patterns sur des nœuds AST)
  • Des bundlers avec une meilleure élimination de code mort utilisant l'analyse de flux
  • Des outils de refactoring qui peuvent transformer le code en toute sécurité à travers un flux de contrôle complexe
  • Une analyse cross-framework qui fonctionne de manière cohérente quel que soit le framework ou l'outil de build utilisé

Google l'a open source, ce qui signifie que la communauté peut build sur cette fondation. Que ça gagne en traction dépend de si les mainteneurs d'outils voient assez d'avantages pour intégrer l'analyse basée sur JSIR dans leurs pipelines — mais la fondation technique est solide.

Questions fréquentes

Articles connexes

Plus de couverture avec des sujets et tags en commun.

JetStream 3 : Le Benchmark Qui Reflète Enfin le Fonctionnement des Apps Web Modernes
JavaScript

JetStream 3 : Le Benchmark Qui Reflète Enfin le Fonctionnement des Apps Web Modernes

WebKit, Google et Mozilla viennent de publier JetStream 3 — la première révision majeure du benchmark depuis 2019. Il abandonne les microbenchmarks au profit de workloads réalistes, refond le scoring WebAssembly, et introduit du Dart, Kotlin et Rust compilés en Wasm.
Node.js 25.9 : L'API stream/iter Arrive Enfin en Expérimental
JavaScript

Node.js 25.9 : L'API stream/iter Arrive Enfin en Expérimental

Node.js 25.9 ajoute un module stream/iter expérimental pour l'itération asynchrone sur les streams, un flag CLI --max-heap-size, AsyncLocalStorage avec using scopes, la crypto TurboSHAKE, et npm 11.12.1.
QuickBEAM : un runtime JavaScript pour la VM BEAM — JavaScript rencontre OTP d'Erlang
JavaScript

QuickBEAM : un runtime JavaScript pour la VM BEAM — JavaScript rencontre OTP d'Erlang

QuickBEAM est un runtime JavaScript qui s'exécute à l'intérieur de la VM BEAM — la même machine virtuelle qui alimente Erlang et Elixir. Il intègre JavaScript dans les arbres de supervision OTP, permet à JS d'appeler des fonctions Elixir et des bibliothèques OTP, et inclut un outil TypeScript intégré.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.