
Cet articlene cite pas suffisamment ses sources().
Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant lesréférences utiles à savérifiabilité et en les liant à la section « Notes et références ».
En pratique :Quelles sources sont attendues ?Comment ajouter mes sources ?
Eninformatique, lebytecode (termeanglais signifiant « code enbytes ») est un code intermédiaire entre lesinstructions machines et lecode source, qui n'est pas directement exécutable. Lebytecode (également appelé code portable ou p-code) peut être créé à la volée et résider en mémoire (compilation à la volée, JIT (Just-In-Time compilation) en anglais) ou bien résider dans un fichier, généralementbinaire qui représente leprogramme, tout comme un fichier decode objet produit par uncompilateur.
Puisque c'est un code qui n'est pas exécutable directement par unprocesseur (à l'exception de certains processeurs gérant lebytecode Java nativement), il est utilisé par les créateurs delangages de programmation en guise de code intermédiaire réduisant la dépendance vis-à-vis dumatériel et facilitant soninterprétation sur plusieurs architectures.
Certains compilateurs, commeLLVM, et langages de scripts, commeSmallTalk,Java ou certaines implémentations deRuby (telles queJRuby, Ruby.NET ou SmallRuby), utilisent lebytecode commereprésentation intermédiaire avant la transformation en code machine vers l'architecture cible (x86,ARM,MIPS, etc.).
Certains systèmes, appelés « traducteurs dynamiques » ou « compilateurs à la volée » (JIT (just-in-time) compilers en anglais), traduisent lebytecode en code machine au fur et à mesure de l’exécution, cela permet d’accélérer l’exécution sur les boucles ou les fonctions appelées plusieurs fois tout en évitant de stocker sur disque ou de transférer via les réseaux des données précompilées. Cette technique est notamment utilisée dans le langage Java et dans les émulateurs de systèmes (ordinateurs ou consoles de jeu par exemple), retranscrivant les instructions d'un langage machine à un autre et plus généralement d'une architecture matérielle à une autre.
Un programme à base debytecode est exécuté par uninterpréteur appelémachine virtuelle, car elle exécute le code tout comme un microprocesseur. L'avantage est la portabilité : le mêmebytecode peut être exécuté sur diversesplates-formes ouarchitectures pour lesquelles un interpréteur existe. Un programme sous forme debytecode peut donc être transmis d'une machine à une autre, et être interprété puis exécuté sans modification de celui-ci par différents types d'architectures matérielles. L'avantage est le même que pour lesscripts, qui sont directement interprétés (et non compilés enbytecode). Cependant, lebytecode est plus concret, plus compact et plus facile à manipuler qu'un script, prévu pour être intelligible par l'homme. Pour ces raisons, les performances des interpréteurs debytecode sont généralement bien meilleures que celles des interpréteurs de scripts.
Pour bénéficier de ces avantages, aujourd'hui de nombreux langages interprétés sont en fait compilés enbytecode avant d'être exécutés par un interpréteur. C'est le cas par exemple dePHP (lorsqu'il est utilisé pour des applications), deTcl, dePython. Un programmeJava est habituellement transmis sous forme debytecode à une machine hôte qui utilisera une compilation à la volée pour traduire lebytecode en code machine avant exécution. Les implémentations actuelles dePerl et deRuby utilisent non pas dubytecode, mais une structure en arbre qui se rapproche de la représentation intermédiaire des compilateurs.
Lesp-codes diffèrent desbytecodes par le codage de leurs opérations, qui peut être de plusieurs octets avec une taille variable, tout comme lesopcodes de nombreux processeurs. Ils ont un plus haut niveau descriptif, comme « afficher cette chaine de caractères » ou encore « effacer l'écran ». LeBASIC et quelques versions dePascal utilisent unp-code.
>>>importdis#"dis" - Disassembler of Python byte code into mnemonics.>>>dis.dis('print("Hello, World!")')10LOAD_NAME0(print)2LOAD_CONST0('Hello, World!')4CALL_FUNCTION16RETURN_VALUE
Sur les autres projets Wikimedia :
| Concepts généraux | |||||||
|---|---|---|---|---|---|---|---|
| Types de code | |||||||
| Compilation |
| ||||||
| Machines virtuelles | |||||||