Visual Basic a produit trois formats de binaires en trente ans, et chacun décide de ce qu'une décompilation peut rendre. Ce n'est pas une anecdote d'historien : c'est la raison pour laquelle lire un assembly .NET est gratuit et reconstruire un exécutable VB6 ne l'est pas.
Le P-Code, seul format pendant six ans
Les premières versions de Visual Basic ne compilaient pas au sens habituel du terme. Elles traduisaient le code en P-Code — pseudo-code — une suite d'instructions compactes exécutées par une machine virtuelle livrée avec l'application, la fameuse bibliothèque MSVBVM dont la version 6 accompagne encore les binaires d'aujourd'hui.
Ce choix était pragmatique. Il rendait les exécutables petits, la compilation rapide, et permettait au débogueur de l'environnement de travailler sur le même code que l'exécution. Il avait un revers dont personne ne se souciait alors : le P-Code n'emporte aucune métadonnée. Les instructions décrivent des opérations, pas des identifiants. Le nom des variables locales, celui des procédures privées, les constantes et les énumérations disparaissent au moment de la traduction.
1997 : VB5 ajoute le code natif, avec le compilateur de Visual C++
Visual Basic 5 introduit une seconde cible : la compilation en code machine x86. Et pas avec un générateur de code maison — la documentation de Microsoft le dit sans détour, VB utilise « the same optimizing back-end compiler technology as Microsoft Visual C++ ».
C'est le fait le plus lourd de conséquences de toute cette histoire. Un exécutable VB6 compilé en code natif n'est pas du VB6 déguisé : c'est le produit d'un compilateur optimisant industriel, qui a réordonné les instructions, propagé les constantes, éliminé les redondances et alloué les registres. Reconstruire du Visual Basic lisible à partir de ça n'a plus rien à voir avec du décodage.
P-Code, à partir de VB5
Reste disponible en option. Chaque instruction correspond à une opération du langage, ce qui rend la reconstruction largement mécanique.
Devient minoritaire, parce que le natif est le réglage par défaut et qu'il s'exécute nettement plus vite.
Code natif, nouveauté de VB5
Du x86 optimisé. Les types ne sont plus déclarés, la structure du code a été remaniée par le compilateur.
Devient le format de la grande majorité des applications réellement distribuées.
Ce que chacun des deux rend, mesuré : voir P-Code ou Code Natif, ce que votre binaire rend.
2002 : VB.NET n'est pas VB7
Visual Basic 6 est le dernier de sa lignée. Ce qui lui succède en 2002 porte le même nom et n'est pas la même chose : Visual Basic .NET est un langage différent, sur une plateforme différente, avec un modèle objet différent. Le passage n'était pas une mise à jour mais une réécriture, et c'est précisément pour cette raison que des dizaines de milliers d'applications VB6 n'ont jamais migré.
Sous VB.NET, le compilateur ne produit plus ni P-Code ni x86. Il produit du MSIL — Microsoft Intermediate Language, que la norme ECMA-335 appelle CIL — qui sera compilé en code machine à l'exécution par le compilateur à la volée.
P-Code et MSIL : deux bytecodes, un fossé
Les deux sont des jeux d'instructions pour machine virtuelle. Là s'arrête la ressemblance, et la différence explique tout le reste.
P-Code — VB1 à VB6
- Format non documenté par Microsoft
- Aucune métadonnée : ni noms, ni types déclarés, ni signatures
- Interprété par
MSVBVM60.dll - Propre à Visual Basic
- Les identifiants sont perdus à la traduction
MSIL — VB.NET et suivants
- Normalisé, ECMA-335
- Tables de métadonnées : noms de classes, méthodes, champs, paramètres, signatures complètes
- Compilé à la volée à l'exécution
- Commun à tous les langages de la plateforme
- Les identifiants sont conservés dans le fichier
C'est de là que vient l'écart de prix entre les outils. Un décompilateur .NET lit des noms que le format a conservés : le travail est largement une remise en forme, et d'excellents outils le font gratuitement. Un décompilateur VB6 doit déduire ce que le format a jeté — et sur du code natif, déduire à partir d'un binaire réordonné par un compilateur optimisant.
Si le fichier que vous cherchez à ouvrir est un assembly .NET, ne payez rien : nous recensons les outils gratuits et open source qui font ce travail mieux que n'importe quelle solution payante.
Pourquoi le VB6 n'a pas disparu
On pourrait croire le sujet clos. Il ne l'est pas, et c'est Microsoft qui l'a décidé : la bibliothèque d'exécution de Visual Basic 6 est supportée pendant toute la durée de vie de chaque version de Windows, sous un principe explicitement nommé « It Just Works ». L'environnement de développement, lui, a perdu son support en avril 2008.
Autrement dit : les applications VB6 continuent de fonctionner sur Windows 11, et rien n'annonce le contraire. Ce qui a disparu, ce ne sont pas les programmes — ce sont leurs projets, leurs disquettes de sauvegarde, les postes de leurs auteurs. Une application qui tourne depuis vingt-cinq ans et dont personne ne retrouve le code source n'est pas une curiosité : c'est le cas le plus fréquent que l'on nous soumette.
C'est ce qui rend la question du format déterminante. Le binaire est là, il fonctionne, et il contient plus que ce qu'on imagine — les noms des formulaires, des contrôles et des procédures publiques y sont toujours. La version gratuite de VBReFormer ouvre le fichier et dit en quelques secondes de quel format il s'agit et ce qu'il contient.