Le bytecode (également appelé code portable ou p-code ) est une forme d' ensemble d'instructions conçu pour une exécution efficace par un interpréteur de logiciel . Contrairement au code source lisible par l'homme , les bytecodes sont des codes numériques compacts, des constantes et des références (généralement des adresses numériques) qui codent le résultat de l'analyse du compilateur et de l'exécution d' une analyse sémantique d'éléments tels que le type, la portée et la profondeur d'imbrication des objets du programme.
Le nom bytecode provient des ensembles d'instructions qui ont des opcodes d'un octet suivis de paramètres facultatifs. Les représentations intermédiaires telles que le bytecode peuvent être générées par des implémentations de langage de programmation pour faciliter l'interprétation , ou elles peuvent être utilisées pour réduire la dépendance au matériel et au système d'exploitation en permettant au même code de s'exécuter sur plusieurs plates-formes , sur différents appareils. Le bytecode peut souvent être exécuté directement sur une machine virtuelle (une machine p-code , c'est-à-dire un interpréteur), ou il peut être compilé en code machine pour de meilleures performances.
Étant donné que les instructions de bytecode sont traitées par logiciel, elles peuvent être arbitrairement complexes, mais sont néanmoins souvent apparentées aux instructions matérielles traditionnelles : les machines à pile virtuelle sont les plus courantes, mais des machines à registre virtuel ont également été construites. Différentes parties peuvent souvent être stockées dans des fichiers séparés, similaires aux modules d'objet , mais chargées dynamiquement pendant l'exécution.
Exécution
Un programme de bytecode peut être exécuté en analysant et en exécutant directement les instructions, une à la fois. Ce type d' interpréteur de bytecode est très portable. Certains systèmes, appelés traducteurs dynamiques ou compilateurs juste-à-temps (JIT), traduisent le bytecode en code machine selon les besoins au moment de l'exécution . Cela rend la machine virtuelle spécifique au matériel, mais ne perd pas la portabilité du bytecode. Par exemple, le code Java et Smalltalk est généralement stocké au format bytecode, qui est généralement ensuite compilé JIT pour traduire le bytecode en code machine avant l'exécution. Cela introduit un délai avant l'exécution d'un programme, lorsque le bytecode est compilé en code machine natif, mais améliore considérablement la vitesse d'exécution par rapport à l'interprétation directe du code source, normalement d'environ un ordre de grandeur (10x).
En raison de son avantage en termes de performances, de nombreuses implémentations de langages exécutent aujourd'hui un programme en deux phases, en compilant d'abord le code source en bytecode, puis en transmettant le bytecode à la machine virtuelle. Il existe des machines virtuelles basées sur le bytecode de ce type pour Java , Raku , Python , PHP , Tcl , mawk et Forth (cependant, Forth est rarement compilé via des bytecodes de cette manière, et sa machine virtuelle est plutôt générique). L'implémentation de Perl et Ruby 1.8 fonctionne plutôt en parcourant une représentation abstraite de l'arbre syntaxique dérivée du code source.
Plus récemment, les auteurs de V8 et de Dart ont remis en question l'idée selon laquelle un bytecode intermédiaire est nécessaire pour une implémentation rapide et efficace de la machine virtuelle. Ces deux implémentations de langage effectuent actuellement une compilation JIT directe du code source au 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 format bytecode par un compilateur . Parmi les exemples de compilateurs, on peut citer celui intégré à Adobe Flash Professional et celui intégré à Adobe Flash Builder et disponible dans le SDK Adobe Flex .
- Objets Adobe Flash
- BANCStar, à l'origine un bytecode pour un outil de création d'interface, mais également utilisé comme langage
- Filtre de paquets Berkeley
- EBPF
- Pascal de Berkeley
- Bibliothèque d'ingénierie de code octet
- Compilateurs de machines virtuelles C vers Java
- L'implémentation CLISP de Common Lisp a été utilisée pendant de nombreuses années pour compiler uniquement en bytecode ; désormais, elle prend également en charge la compilation en code natif à l'aide de GNU Lightning
- Les implémentations Common Lisp de CMUCL et Scieneer Common Lisp peuvent être compilées soit en code natif, soit en bytecode, ce qui est beaucoup plus compact
- Langage intermédiaire commun exécuté par Common Language Runtime , utilisé par les langages .NET tels que C#
- Le bytecode Dalvik , conçu pour la plate-forme Android , est exécuté par la machine virtuelle Dalvik
- Le bytecode Dis, conçu pour l' 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 utilisée comme langage de compilation intermédiaire et comme langage 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 après compilation en bytecode offre des performances raisonnables.
- L'implémentation Common Lisp intégrable de Common Lisp peut être compilée en bytecode ou en code C
- Common Lisp fournit une
disassemblefonction qui imprime 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 se résoudre en bytecode. Son inspection peut être utilisée à des fins de débogage et d'optimisation. Steel Bank Common Lisp , par exemple, produit :
( désassembler ' ( lambda ( x ) ( imprimer x ))) ; désassemblage pour (LAMBDA (X)) ; 2436F6DF : 850500000F22 TEST EAX, [#x220F0000] ; point d'entrée sans analyse d'argument ; 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 ; interruption d'erreur ; FA : 02 BYTE #X02 ; FB : 18 OCTETS #X18 ; ERREUR DE COMPTAGE D'ARG NON VALIDE ; 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 Z-machine pour rendre ses applications logicielles plus portables
- Bytecode Java , qui est exécuté par la machine virtuelle Java
- Bytecode Keiko utilisé par le langage de programmation Oberon-2 pour le rendre, ainsi que le système d'exploitation Oberon, plus portable.
- 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 p-code 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, se compile en bytecode exécuté sur une machine virtuelle. Second Life possède la version originale Mono, Inworldz a développé la version Phlox.
- Le langage Lua utilise une machine virtuelle à bytecode basée sur des registres
- m-code du langage MATLAB
- Malbolge est un langage machine ésotérique pour une machine virtuelle ternaire.
- Code P Microsoft utilisé dans Visual C++ et Visual Basic
- Multiplan
- Code O du langage de programmation BCPL
- Le langage OCaml compile éventuellement sous une forme de bytecode compact
- p-code de l'implémentation UCSD Pascal du langage Pascal
- Machine virtuelle Parrot
- Choisissez BASIC également appelé Data BASIC ou MultiValue BASIC
- L' environnement R pour le calcul statistique propose un compilateur de bytecode via le package compilateur, désormais standard avec la version 2.13.0 de R. Il est possible de compiler cette version de R pour que les packages de base et recommandés l'exploitent.
- Jeu d'aventure Pyramid 2000
- Les scripts Python sont compilés lors de l'exécution dans le langage bytecode de Python, et les fichiers compilés (.pyc) sont mis en cache dans le dossier du script
- Le code compilé peut être analysé et étudié à l'aide d'un outil intégré de débogage du bytecode de bas niveau. L'outil peut être initialisé à partir du shell, par exemple :
>>> import dis # "dis" - Désassembleur de byte code 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
- Schéma 48 implémentation du schéma à l'aide d'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 dans un format de byte-code personnalisé.
- Pomme SWEET16
- Tcl
- TIMI est utilisé par les compilateurs sur la plateforme IBM i .
- Petit BASIC
- Visual FoxPro compile en bytecode
- WebAssembly
- YARV et Rubinius pour Ruby
- Code Z
- Opcodes Zend Engine pour PHP