Байт-код Java: відмінності між версіями
[перевірена версія] | [очікує на перевірку] |
Мітки: Редагування з мобільного пристрою Редагування через мобільну версію |
|||
(Не показані 10 проміжних версій 3 користувачів) | |||
Рядок 1: | Рядок 1: | ||
'''Байт-код Java''' — набір інструкцій [[Віртуальна машина Java|віртуальної машини Java]] (JVM). |
'''Байт-код Java''' — набір інструкцій [[Віртуальна машина Java|віртуальної машини Java]] (JVM). |
||
==Набір інструкцій== |
==Набір інструкцій== |
||
Кожен [[байт-код]] складається з одного байта - [[код операції|коду операції]] та від нуля та більше байт операндів <ref name="jvm">{{cite book |last1=Lindholm |first1=Tim |last2=Yellin |first2=Frank |last3=Bracha |first3=Gilad |last4=Buckley |first4=Alex |title=The Java Virtual Machine Specification |edition=Java SE 8 |date=2015-02-13 |url=http://docs.oracle.com/javase/specs/jvms/se8/html/}}</ref>. З 256 можливих байтових кодів операцій використано 202 (~79%), 51 зарезервовано для майбутнього застосування (~20%) та 3 інструкції (~1%) зарезервовано для специфічних потреб віртуальної машини.<ref name="jvm"/>. |
Кожен [[байт-код]] складається з одного байта - [[код операції|коду операції]] та від нуля та більше байт операндів <ref name="jvm">{{cite book |last1=Lindholm |first1=Tim |last2=Yellin |first2=Frank |last3=Bracha |first3=Gilad |last4=Buckley |first4=Alex |title=The Java Virtual Machine Specification |edition=Java SE 8 |date=2015-02-13 |url=http://docs.oracle.com/javase/specs/jvms/se8/html/ |accessdate=30 березня 2019 |archive-date=16 квітня 2019 |archive-url=https://web.archive.org/web/20190416075731/https://docs.oracle.com/javase/specs/jvms/se8/html/ }}</ref>. З 256 можливих байтових кодів операцій використано 202 (~79%), 51 зарезервовано для майбутнього застосування (~20%) та 3 інструкції (~1%) зарезервовано для специфічних потреб віртуальної машини.<ref name="jvm"/>. |
||
Інструкції поділяються на ряд груп: |
Інструкції поділяються на ряд груп: |
||
Рядок 42: | Рядок 42: | ||
Розглянемо наступний код на мові програмування [[Java]]: |
Розглянемо наступний код на мові програмування [[Java]]: |
||
< |
<syntaxhighlight lang="java"> |
||
outer: |
outer: |
||
for (int i = 2; i < 1000; i++) { |
for (int i = 2; i < 1000; i++) { |
||
Рядок 51: | Рядок 51: | ||
System.out.println (i); |
System.out.println (i); |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
Компілятор java може транслювати цей вищенаведений код у байт-код наступним чином: |
Компілятор java може транслювати цей вищенаведений код у байт-код наступним чином: |
||
< |
<syntaxhighlight lang="jasmin"> |
||
0: iconst_2 |
0: iconst_2 |
||
1: istore_1 |
1: istore_1 |
||
Рядок 77: | Рядок 77: | ||
38: iinc 1, 1 |
38: iinc 1, 1 |
||
41: goto 2 |
41: goto 2 |
||
44: return</ |
44: return</syntaxhighlight> |
||
==Генерування== |
==Генерування== |
||
Java байт-код генерується переважно із мови Java для виконання віртуальною машиною Java. Спочатку існував лише один компілятор [[javac]] від[[Sun Microsystems]], який |
Java байт-код генерується переважно із мови Java для виконання віртуальною машиною Java. Спочатку існував лише один компілятор [[javac]] від [[Sun Microsystems]], який компілював код на Java у байт-код Java; проте оскільки вся специфікація на байт-код Java доступна, з'явилися компілятори і від інших виробників, що здатні генерувати Java байт-код. Наприклад, це такі компілятори як: |
||
*[[Jikes]] - компілює із Java у байт-код Java (розроблено [[IBM]], реалізовано у [[C++]]) |
*[[Jikes]] - компілює із Java у байт-код Java (розроблено [[IBM]], реалізовано у [[C++]]) |
||
*Espresso - компілює із Java у байт-код Java(лише Java 1.0) |
*Espresso - компілює із Java у байт-код Java(лише Java 1.0) |
||
*[[GNU Compiler for Java]] (GCJ) - компілює із Java у байт-код Java; може також компілювати у рідний [[машинний код]] і був частиною [[GNU Compiler Collection]] (GCC) аж до версії 6. |
*[[GNU Compiler for Java]] (GCJ) - компілює із Java у байт-код Java; може також компілювати у рідний [[машинний код]] і був частиною [[GNU Compiler Collection]] (GCC) аж до версії 6. |
||
Існують компілятори здатні генерувати байт-код Java для JVM із інших мов таких як: |
|||
*[[ColdFusion]] |
|||
*[[JRuby]] та [[Jython]], дві скріптові мови базовані на [[Ruby]] та [[Python]] |
|||
*[[Groovy|Apache Groovy]] - скриптова мова базована на Java |
|||
*[[Scala]] - мова загального призначення з безпечними типами даних, що підтримує об'єктно-орієнтоване та функціональне програмування |
|||
*[[JGNAT]] та AppletMagic - компілюють із мови [[Ada]] у байт-код Java |
|||
*[[Java virtual machine#C to bytecode compilers|C to Java byte-code compiler]] |
|||
*[[Clojure]] - функціональна мова закального призначення з родини мов програмування [[Lisp]] із акцентом на паралельності виконання |
|||
*[[Kawa]] - реалізація мови Scheme, діалекту мови Lisp |
|||
*[[MIDletPascal]] |
|||
*[[JavaFX Script]] |
|||
*[[Kotlin]] |
|||
*[[Object Pascal]] - код програми компілюється у байт код Java з використанням компілятора [[Free Pascal]] 3.0+.<ref>{{Cite web |url=http://wiki.freepascal.org/FPC_New_Features_3.0#Support_for_the_Java_Virtual_Machine_and_Dalvik_targets |title=Free Pascal 3.0 release notes |accessdate=20 квітня 2019 |archive-date=20 квітня 2019 |archive-url=https://web.archive.org/web/20190420172522/http://wiki.freepascal.org/FPC_New_Features_3.0#Support_for_the_Java_Virtual_Machine_and_Dalvik_targets }}</ref><ref>{{Cite web |url=http://wiki.freepascal.org/FPC_JVM |title=Free Pascal JVM Target |accessdate=20 квітня 2019 |archive-date=18 квітня 2019 |archive-url=https://web.archive.org/web/20190418131244/http://wiki.freepascal.org/FPC_JVM }}</ref> |
|||
==Джерела== |
==Джерела== |
||
Рядок 88: | Рядок 102: | ||
{{Мови програмування}} |
{{Мови програмування}} |
||
[[Категорія:Java]] |
[[Категорія:Java]] |
||
[[Категорія:Статті з прикладами коду мовою Java]] |
|||
[[Категорія:Асемблер]] |
Поточна версія на 09:24, 4 липня 2023
Байт-код Java — набір інструкцій віртуальної машини Java (JVM).
Кожен байт-код складається з одного байта - коду операції та від нуля та більше байт операндів [1]. З 256 можливих байтових кодів операцій використано 202 (~79%), 51 зарезервовано для майбутнього застосування (~20%) та 3 інструкції (~1%) зарезервовано для специфічних потреб віртуальної машини.[1].
Інструкції поділяються на ряд груп:
- Завантаження і зберігання (наприклад,
aload_0
,istore
) - Арифметичні та логічні (наприклад,
ladd
,fcmpl
) - Перетворення типів (наприклад,
i2b
,d2i
) - Створення та маніпулювання об'єктами (
new
,putfield
) - Управління операндами стеку (наприклад,
swap
,dup2
) - Передачі контролю (наприклад,
ifeq
,goto
) - Виклику методів та повернення (наприклад,
invokespecial
,areturn
)
Також є декілька інструкцій для деяких спеціалізованих задач як то викидання винятків, синхронізації, тощо.
Багато інструкцій мають спеціальні префікси і/або суфікси в залежності від типів операндів, якими вони маніпулюють.[1] А саме такі:
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. Спочатку існував лише один компілятор javac від Sun Microsystems, який компілював код на Java у байт-код Java; проте оскільки вся специфікація на байт-код Java доступна, з'явилися компілятори і від інших виробників, що здатні генерувати Java байт-код. Наприклад, це такі компілятори як:
- Jikes - компілює із Java у байт-код Java (розроблено IBM, реалізовано у C++)
- 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 - мова загального призначення з безпечними типами даних, що підтримує об'єктно-орієнтоване та функціональне програмування
- JGNAT та AppletMagic - компілюють із мови Ada у байт-код Java
- C to Java byte-code compiler
- Clojure - функціональна мова закального призначення з родини мов програмування Lisp із акцентом на паралельності виконання
- Kawa - реалізація мови Scheme, діалекту мови Lisp
- MIDletPascal
- JavaFX Script
- Kotlin
- Object Pascal - код програми компілюється у байт код Java з використанням компілятора Free Pascal 3.0+.[2][3]
- ↑ а б в 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.