Байт-код Java — набір інструкцій віртуальної машини Java (JVM).
Набір інструкцій
Кожен байт-код складається з одного байта - коду операції та від нуля та більше байт операндів . З 256 можливих байтових кодів операцій використано 202 (~79%), 51 зарезервовано для майбутнього застосування (~20%) та 3 інструкції (~1%) зарезервовано для специфічних потреб віртуальної машини..
Інструкції поділяються на ряд груп:
- Завантаження і зберігання (наприклад,
aload_0
,istore
) - Арифметичні та логічні (наприклад,
ladd
,fcmpl
) - Перетворення типів (наприклад,
i2b
,d2i
) - Створення та маніпулювання об'єктами (
new
,putfield
) - Управління операндами стеку (наприклад,
swap
,dup2
) - Передачі контролю (наприклад,
ifeq
,goto
) - Виклику методів та повернення (наприклад,
invokespecial
,areturn
)
Також є декілька інструкцій для деяких спеціалізованих задач як то викидання винятків, синхронізації, тощо.
Багато інструкцій мають спеціальні префікси і/або суфікси в залежності від типів операндів, якими вони маніпулюють. А саме такі:
Prefix/suffix | Operand type |
---|---|
i | integer |
l | long |
s | short |
b | byte |
c | character |
f | float |
d | double |
a | reference |
Наприклад, iadd
- додає дві цілочисельні (integer) змінні , dadd
- додає два значення типу double.
Приклад
Розглянемо наступний код на мові програмування Java:
outer: for (int i = 2; i < 1000; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) continue outer; } System.out.println (i); }
Компілятор java може транслювати цей вищенаведений код у байт-код наступним чином:
0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2 12: iload_1 13: if_icmpge 31 16: iload_1 17: iload_2 18: irem 19: ifne 25 22: goto 38 25: iinc 2, 1 28: goto 11 31: getstatic #84; // Field java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85; // Method java/io/PrintStream.println:(I)V 38: iinc 1, 1 41: goto 2 44: return
Генерування
Java байт-код генерується переважно із мови Java для виконання віртуальною машиною Java. Спочатку існував лише один компілятор від Sun Microsystems, який компілював код на Java у байт-код Java; проте оскільки вся специфікація на байт-код Java доступна, з'явилися компілятори і від інших виробників, що здатні генерувати Java байт-код. Наприклад, це такі компілятори як:
- - компілює із Java у байт-код Java (розроблено IBM, реалізовано у )
- Espresso - компілює із Java у байт-код Java(лише Java 1.0)
- GNU Compiler for Java (GCJ) - компілює із Java у байт-код Java; може також компілювати у рідний машинний код і був частиною GNU Compiler Collection (GCC) аж до версії 6.
Існують компілятори здатні генерувати байт-код Java для JVM із інших мов таких як:
- ColdFusion
- JRuby та Jython, дві скріптові мови базовані на Ruby та Python
- Apache Groovy - скриптова мова базована на Java
- Scala - мова загального призначення з безпечними типами даних, що підтримує об'єктно-орієнтоване та функціональне програмування
- та AppletMagic - компілюють із мови Ada у байт-код Java
- Clojure - функціональна мова закального призначення з родини мов програмування Lisp із акцентом на паралельності виконання
- - реалізація мови Scheme, діалекту мови Lisp
- Kotlin
- Object Pascal - код програми компілюється у байт код Java з використанням компілятора Free Pascal 3.0+.
Джерела
- Lindholm, Tim; Yellin, Frank; Bracha, Gilad; Buckley, Alex (13 лютого 2015). The Java Virtual Machine Specification (вид. Java SE 8). Архів оригіналу за 16 квітня 2019. Процитовано 30 березня 2019.
- Free Pascal 3.0 release notes. Архів оригіналу за 20 квітня 2019. Процитовано 20 квітня 2019.
- Free Pascal JVM Target. Архів оригіналу за 18 квітня 2019. Процитовано 20 квітня 2019.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Bajt kod Java nabir instrukcij virtualnoyi mashini Java JVM Zmist 1 Nabir instrukcij 2 Priklad 3 Generuvannya 4 DzherelaNabir instrukcijred Kozhen bajt kod skladayetsya z odnogo bajta kodu operaciyi ta vid nulya ta bilshe bajt operandiv 1 Z 256 mozhlivih bajtovih kodiv operacij vikoristano 202 79 51 zarezervovano dlya majbutnogo zastosuvannya 20 ta 3 instrukciyi 1 zarezervovano dlya specifichnih potreb virtualnoyi mashini 1 Instrukciyi podilyayutsya na ryad grup Zavantazhennya i zberigannya napriklad aload 0 istore Arifmetichni ta logichni napriklad ladd fcmpl Peretvorennya tipiv napriklad i2b d2i Stvorennya ta manipulyuvannya ob yektami new putfield Upravlinnya operandami steku napriklad swap dup2 Peredachi kontrolyu napriklad ifeq goto Vikliku metodiv ta povernennya napriklad invokespecial areturn Takozh ye dekilka instrukcij dlya deyakih specializovanih zadach yak to vikidannya vinyatkiv sinhronizaciyi tosho Bagato instrukcij mayut specialni prefiksi i abo sufiksi v zalezhnosti vid tipiv operandiv yakimi voni manipulyuyut 1 A same taki Prefix suffix Operand type i integer l long s short b byte c character f float d double a reference Napriklad iadd dodaye dvi cilochiselni integer zminni dadd dodaye dva znachennya tipu double Prikladred Rozglyanemo nastupnij kod na movi programuvannya Java outer for int i 2 i lt 1000 i for int j 2 j lt i j if i j 0 continue outer System out println i Kompilyator java mozhe translyuvati cej vishenavedenij kod u bajt kod nastupnim chinom 0 iconst 2 1 istore 1 2 iload 1 3 sipush 1000 6 if icmpge 44 9 iconst 2 10 istore 2 11 iload 2 12 iload 1 13 if icmpge 31 16 iload 1 17 iload 2 18 irem 19 ifne 25 22 goto 38 25 iinc 2 1 28 goto 11 31 getstatic 84 Field java lang System out Ljava io PrintStream 34 iload 1 35 invokevirtual 85 Method java io PrintStream println I V 38 iinc 1 1 41 goto 2 44 returnGeneruvannyared Java bajt kod generuyetsya perevazhno iz movi Java dlya vikonannya virtualnoyu mashinoyu Java Spochatku isnuvav lishe odin kompilyator javac vid Sun Microsystems yakij kompilyuvav kod na Java u bajt kod Java prote oskilki vsya specifikaciya na bajt kod Java dostupna z yavilisya kompilyatori i vid inshih virobnikiv sho zdatni generuvati Java bajt kod Napriklad ce taki kompilyatori yak Jikes kompilyuye iz Java u bajt kod Java rozrobleno IBM realizovano u C Espresso kompilyuye iz Java u bajt kod Java lishe Java 1 0 GNU Compiler for Java GCJ kompilyuye iz Java u bajt kod Java mozhe takozh kompilyuvati u ridnij mashinnij kod i buv chastinoyu GNU Compiler Collection GCC azh do versiyi 6 Isnuyut kompilyatori zdatni generuvati bajt kod Java dlya JVM iz inshih mov takih yak ColdFusion JRuby ta Jython dvi skriptovi movi bazovani na Ruby ta Python Apache Groovy skriptova mova bazovana na Java Scala mova zagalnogo priznachennya z bezpechnimi tipami danih sho pidtrimuye ob yektno oriyentovane ta funkcionalne programuvannya JGNAT ta AppletMagic kompilyuyut iz movi Ada u bajt kod Java C to Java byte code compiler Clojure funkcionalna mova zakalnogo priznachennya z rodini mov programuvannya Lisp iz akcentom na paralelnosti vikonannya Kawa realizaciya movi Scheme dialektu movi Lisp MIDletPascal JavaFX Script Kotlin Object Pascal kod programi kompilyuyetsya u bajt kod Java z vikoristannyam kompilyatora Free Pascal 3 0 2 3 Dzherelared a b v Lindholm Tim Yellin Frank Bracha Gilad Buckley Alex 13 lyutogo 2015 The Java Virtual Machine Specification vid Java SE 8 Arhiv originalu za 16 kvitnya 2019 Procitovano 30 bereznya 2019 Free Pascal 3 0 release notes Arhiv originalu za 20 kvitnya 2019 Procitovano 20 kvitnya 2019 Free Pascal JVM Target Arhiv originalu za 18 kvitnya 2019 Procitovano 20 kvitnya 2019 Otrimano z https uk wikipedia org w index php title Bajt kod Java amp oldid 39853100