Байт-код 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]]:


<source lang="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 може транслювати цей вищенаведений код у байт-код наступним чином:
<source lang="jasmin">
<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</source>
44: return</syntaxhighlight>
==Генерування==
==Генерування==
Java байт-код генерується переважно із мови Java для виконання віртуальною машиною Java. Спочатку існував лише один компілятор [[javac]] від[[Sun Microsystems]], який кампілював код на Java у байт-код Java; проте оскільки вся специфікація на байт-код Java доступна, з'явилися компілятори і від інших виробників, що здатні генерувати Java байт-код. Наприклад, це такі компілятори як:
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]

Джерела

[ред. | ред. код]
  1. а б в Lindholm, Tim; Yellin, Frank; Bracha, Gilad; Buckley, Alex (13 лютого 2015). The Java Virtual Machine Specification (вид. Java SE 8). Архів оригіналу за 16 квітня 2019. Процитовано 30 березня 2019.
  2. Free Pascal 3.0 release notes. Архів оригіналу за 20 квітня 2019. Процитовано 20 квітня 2019.
  3. Free Pascal JVM Target. Архів оригіналу за 18 квітня 2019. Процитовано 20 квітня 2019.