Le bytecode (également appelé code portable ou p-code ) est un ensemble d'instructions conçu pour une exécution efficace par un interpréteur de logiciels . Contrairement au code source lisible par l'homme , le bytecode est constitué de codes numériques compacts, de constantes et de références (généralement des adresses numériques) qui encodent le résultat de l'analyse syntaxique et sémantique effectuée par le compilateur sur des éléments tels que le type, la portée et le niveau d'imbrication des objets du programme.
Le terme « bytecode » provient des jeux d'instructions qui utilisent des codes d'opération (opcodes) d'un octet suivis de paramètres optionnels. Les représentations intermédiaires telles que le bytecode peuvent être générées par les implémentations de langages de programmation pour faciliter l'interprétation , ou utilisées pour réduire la dépendance au matériel et au système d'exploitation en permettant l'exécution d'un même code sur différentes plateformes , c'est-à-dire différents appareils. Le bytecode peut souvent être exécuté directement sur une machine virtuelle (une machine à code p , c'est-à-dire un interpréteur), ou être compilé en code machine pour de meilleures performances.
Étant donné que les instructions en bytecode sont traitées par logiciel, elles peuvent être d'une complexité arbitraire, mais sont néanmoins souvent similaires aux instructions matérielles traditionnelles : les machines à pile virtuelle sont les plus courantes, mais des machines à registres virtuels ont également été conçues. Différentes parties peuvent souvent être stockées dans des fichiers séparés, semblables à des modules objets , mais chargées dynamiquement lors de l'exécution.
Exécution
Un programme en bytecode peut être exécuté en analysant et en exécutant directement ses instructions, une à une. Ce type d' interpréteur de bytecode est très portable. Certains systèmes, appelés traducteurs dynamiques ou compilateurs à la volée (JIT), traduisent le bytecode en code machine à la demande, lors de l'exécution . Cela rend la machine virtuelle spécifique au matériel, mais ne compromet pas la portabilité du bytecode. Par exemple, le code Java et Smalltalk est généralement stocké au format bytecode, puis compilé à la volée (JIT) pour être traduit en code machine avant l'exécution. Cela introduit un délai avant l'exécution du programme, le temps que le bytecode soit compilé en code machine natif, mais améliore considérablement la vitesse d'exécution par rapport à l'interprétation directe du code source, généralement d'un facteur 10 environ.
Grâce à ses performances supérieures, de nombreuses implémentations de langages exécutent aujourd'hui un programme en deux phases : la compilation du code source en bytecode, puis le passage de ce bytecode à la machine virtuelle. Il existe des machines virtuelles de ce type, basées sur le bytecode, pour Raku , Python , PHP , Tcl , et Forth ( cependant , Forth est rarement compilé de cette manière et sa machine virtuelle est plus générique). Les implémentations de Perl et Ruby 1.8 fonctionnent quant à elles en parcourant une représentation arborescente de la syntaxe abstraite, dérivée du code source.
Plus récemment, les auteurs de V8 et de Dart ont remis en question l'idée qu'un bytecode intermédiaire soit nécessaire pour une implémentation de machine virtuelle rapide et efficace. Ces deux implémentations de langage effectuent actuellement une compilation JIT directe du code source vers le code machine sans intermédiaire de bytecode.
Exemples
- ActionScript s'exécute dans la machine virtuelle ActionScript (AVM), qui fait partie de Flash Player et d'AIR . Le code ActionScript est généralement transformé en bytecode par un compilateur . Parmi les compilateurs, on peut citer celui intégré à Adobe Flash Professional et celui intégré à Adobe Flash Builder, ainsi que celui disponible dans le kit de développement logiciel Adobe Flex .
- Objets Adobe Flash
- BANCStar , à l'origine un bytecode pour un outil de création d'interfaces, mais également utilisé comme langage.
- Filtre à paquets Berkeley
- EBPF
- Berkeley Pascal
- Bibliothèque d'ingénierie du code octet
- compilateurs de machine virtuelle C vers Java
- L'implémentation CLISP de Common Lisp ne compilait que du bytecode depuis de nombreuses années ; cependant, elle prend désormais également en charge la compilation en code natif grâce à GNU Lightning.
- Les implémentations Common Lisp de CMUCL et Scieneer peuvent être compilées soit en code natif, soit en bytecode, ce dernier étant beaucoup plus compact.
- Langage intermédiaire commun exécuté par l'environnement d'exécution du langage commun (CLR) , utilisé par les langages .NET tels que C#
- Le bytecode Dalvik , conçu pour la plateforme Android , est exécuté par la machine virtuelle Dalvik.
- Le bytecode de Dis, conçu pour Inferno (système d'exploitation) , est exécuté par la machine virtuelle Dis.
- EiffelStudio pour le langage de programmation Eiffel
- EM, la machine virtuelle Amsterdam Compiler Kit, est utilisée comme langage de compilation intermédiaire et comme langage de bytecode moderne.
- Emacs est un éditeur de texte dont la plupart des fonctions sont implémentées par Emacs Lisp , son dialecte intégré de Lisp . Ces fonctionnalités sont compilées en bytecode. Cette architecture permet aux utilisateurs de personnaliser l'éditeur avec un langage de haut niveau qui, une fois compilé en bytecode, offre des performances satisfaisantes.
- Une implémentation embarquée de Common Lisp peut être compilée en bytecode ou en code C.
- Common Lisp fournit une
disassemblefonction qui affiche sur la sortie standard le code sous-jacent d'une fonction spécifiée. Le résultat dépend de l'implémentation et peut ou non correspondre à du bytecode. Son inspection peut être utilisée à des fins de débogage et d'optimisation. Steel Bank Common Lisp , par exemple, produit :
( désassemblage ' ( lambda ( x ) ( print x ))) ; désassemblage pour (LAMBDA (X)) ; 2436F6DF : 850500000F22 TEST EAX, [#x220F0000] ; point d'entrée sans analyse d'arguments ; E5 : 8BD6 MOV EDX, ESI ; E7 : 8B05A8F63624 MOV EAX, [#x2436F6A8] ; #<objet FDEFINITION pour PRINT> ; ED : B904000000 MOV ECX, 4 ; F2 : FF7504 PUSH DWORD PTR [EBP+4] ; F5 : FF6005 JMP DWORD PTR [EAX+5] ; F8 : CC0A BREAK 10 ; gestion des erreurs ; FA : 02 BYTE #X02 ; FB : 18 octets #X18 ; erreur de comptage d'arguments invalide ; FC : 4F octets #X4F ; ECX
- L'implémentation d' Erlang par Ericsson utilise les bytecodes BEAM.
- La machine virtuelle d' Ethereum (EVM) est l'environnement d'exécution, utilisant son propre bytecode, pour l'exécution des transactions dans Ethereum (contrats intelligents).
- Langages de programmation Icon et Unicon
- Infocom a utilisé la machine Z pour rendre ses applications logicielles plus portables.
- Le bytecode Java est exécuté par la machine virtuelle Java.
- Le bytecode Keiko est utilisé par le langage de programmation Oberon-2 pour rendre ce dernier et le système d'exploitation Oberon plus portables.
- KEYB , le pilote de clavier MS-DOS / PC DOS avec son fichier de ressources KEYBOARD.SYS contenant des informations de disposition et de courtes séquences de code P exécutées par un interpréteur à l'intérieur du pilote résident.
- LLVM IR
- LSL, un langage de script utilisé dans les mondes virtuels, est compilé en bytecode exécuté sur une machine virtuelle. Second Life utilise la version originale Mono, tandis qu'Inworldz a développé la version Phlox.
- Le langage Lua utilise une machine virtuelle à bytecode basée sur des registres
- Code m du langage MATLAB
- Malbolge est un langage machine ésotérique pour une machine virtuelle ternaire.
- Code P de Microsoft utilisé dans Visual C++ et Visual Basic
- Multiplan
- Code O du langage de programmation BCPL
- Le langage OCaml peut être compilé de manière optionnelle en un format de bytecode compact.
- Code p de l'implémentation Pascal de l'UCSD du langage Pascal
- Machine virtuelle Parrot
- Choisissez BASIC, également appelé Data BASIC ou MultiValue BASIC
- L' environnement R pour le calcul statistique offre un compilateur de bytecode via le package compiler, désormais standard avec la version 2.13.0 de R. Il est possible de compiler cette version de R afin que les packages de base et recommandés l'exploitent.
- Jeu d'aventure Pyramid 2000
- Les scripts Python sont compilés lors de leur exécution en bytecode, le langage de Python, et les fichiers compilés (.pyc) sont mis en cache dans le dossier du script.
- Le code compilé peut être analysé et examiné à l'aide d'un outil intégré de débogage du bytecode de bas niveau. Cet outil peut être initialisé depuis l'interpréteur de commandes, par exemple :
>>> import dis # "dis" - Désassembleur de bytecode Python en mnémoniques. >>> dis . dis ( 'print("Hello, World!")' ) 1 0 LOAD_NAME 0 (print) 2 LOAD_CONST 0 ('Hello, World!') 4 CALL_FUNCTION 1 6 RETURN_VALUE
- Implémentation de Scheme 48 utilisant un interpréteur de bytecode
- Bytecodes de nombreuses implémentations du langage Smalltalk
- L' interpréteur Spin intégré au microcontrôleur Parallax Propeller
- Le moteur de base de données SQLite traduit les instructions SQL en un format de bytecode personnalisé.
- Pomme SWEET16
- Tcl
- TIMI est utilisé par les compilateurs sur la plateforme IBM i .
- Petit BASIC
- Visual Basic pour Applications est compilé en bytecode.
- Visual FoxPro est compilé en bytecode
- WebAssembly
- YARV et Rubinius pour Ruby
- ZCODE
- Opcodes Zend Engine pour PHP