какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

Java Bytecode Fundamentals

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Java ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Π·Π½Π°Π½ΠΈΠΈ ΠΎ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΌΡΡ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ занимаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ соврСмСнных Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², компиляторов ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ инструмСнтов Java ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своих цСлях. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠ° ASM, cglib, Javassist ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π² использовании Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ основ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ эффСктивно.
Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ описаны самыС основы, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² дальнСйшСм раскапывании Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹ (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.).

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Ρ‘ΠΌ с простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ POJO с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΠ»Π΅ΠΌ ΠΈ Π³Π΅Ρ‚Ρ‚Π΅Ρ€ΠΎΠΌ ΠΈ сСттСром для Π½Π΅Π³ΠΎ.

Когда Π²Ρ‹ скомпилируСтС класс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ javac Foo.java, Ρƒ вас появится Ρ„Π°ΠΉΠ» Foo.class, содСрТащий Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π΅Π³ΠΎ содСрТаниС выглядит Π² HEX-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅:

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

КаТдая ΠΏΠ°Ρ€Π° ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… чисСл (Π±Π°ΠΉΡ‚) пСрСводится Π² ΠΎΠΏΠΊΠΎΠ΄Ρ‹ (ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°). Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ТСстоко ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ это Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ.

Класс ΠΎΡ‡Π΅Π½ΡŒ простой, поэтому Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π³ΠΊΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ сгСнСрированным Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄-вСрсии класса компилятор Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (ΠΊΠ°ΠΊ ΠΈ написано Π² спСцификациях JVM).

Π”Π°Π»Π΅Π΅, изучая Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ инструкции (Ρƒ нас это aload_0 ΠΈ aload_1), ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅ΡŽΡ‚ прСфиксы Ρ‚ΠΈΠΏΠ° aload_0 ΠΈ istore_2. Π­Ρ‚ΠΎ относится ΠΊ Ρ‚ΠΈΠΏΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ инструкция. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ Β«aΒ» ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠΊΠΎΠ΄ управляСт ссылкой Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Β«iΒ», соотвСтствСнно, управляСт integer.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ это Π·Π° странныС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹. НапримСр, #2:

const #2 = Field #3.#18; // Foo.bar:Ljava/lang/String;

const #3 = class #19; // Foo
const #18 = NameAndType #5:#6;// bar:Ljava/lang/String;

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ (0: aload_0). Π­Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ инструкции Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ° β€” дальшС объясню, Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, достаточно Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° модСль выполнСния. JVM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ модСль выполнСния Π½Π° основС стСков. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π΅Ρ‚ JVM-стСк, содСрТащий Ρ„Ρ€Π΅ΠΉΠΌΡ‹. НапримСр, Ссли ΠΌΡ‹ запустим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π΄Π΅Π±Π°Π³Π³Π΅Ρ€Π΅, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΡ‹:
какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° создаСтся Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ. Π€Ρ€Π΅ΠΉΠΌ состоит ΠΈΠ· стСка ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°, массива Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ссылку Π½Π° ΠΏΡƒΠ» констант класса выполняСмого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.
какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

Π Π°Π·ΠΌΠ΅Ρ€ массива Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… опрСдСляСтся Π²ΠΎ врСмя компиляции Π² зависимости ΠΎΡ‚ количСства ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² β€” LIFO-стСк для записи ΠΈ удалСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² стСкС; Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСтся Π²ΠΎ врСмя компиляции. НСкоторыС ΠΎΠΏΠΊΠΎΠ΄Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ значСния Π² стСк, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±Π΅Ρ€ΡƒΡ‚ ΠΈΠ· стСка ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈΡ… состояниС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π² стСк. Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ (return values).

Π‘Π°ΠΉΡ‚ΠΊΠΎΠ΄ для этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° состоит ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠΊΠΎΠ΄, aload_0, ΠΏΡ€ΠΎΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ Π² стСк Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с индСксом 0 ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Бсылка this Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для конструкторов ΠΈ instance-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² всСгда ΠΈΠΌΠ΅Π΅Ρ‚ индСкс 0. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠΊΠΎΠ΄, getfield, достаСт ΠΏΠΎΠ»Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ПослСдняя инструкция, areturn, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

Π’Π°ΠΊ, Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° getBar β€” 2A B4 00 02 B0. 2A относится ΠΊ инструкции aload_0, B0 β€” ΠΊ areturn. ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Ρ‡Ρ‚ΠΎ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ инструкции, Π° Π² массивС Π±Π°ΠΉΡ‚ 5 элСмСнтов. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ getfield (B4) нуТдаСтся Π² Π΄Π²ΡƒΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… (00 02), Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 2 ΠΈ 3 Π² массивС, ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ 5 элСмСнтов Π² массивС. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ areturn сдвигаСтся Π½Π° 4 ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.
Π’Π°Π±Π»ΠΈΡ†Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ происходит с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ:

Π—Π΄Π΅ΡΡŒ Π΄Π²Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ локальная пСрСмСнная int b. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄:

LocalVariableTable:
Start Length Slot Name Signature
0 6 0 this LExample;
0 6 1 a I
2 4 2 b I

ΠœΠ΅Ρ‚ΠΎΠ΄ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ константу 1 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ iconst_1 ΠΈ Π»ΠΎΠΆΠΈΡ‚ Π΅Ρ‘ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ 2 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ istore_2. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… слот 2 занят ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ b, ΠΊΠ°ΠΊ ΠΈ оТидалось. Π”Π°Π»Π΅Π΅, iload_1 Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² стСк, iload_2 Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ b. iadd Π²Ρ‹Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ 2 ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° ΠΈΠ· стСка, добавляСт ΠΈΡ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.
ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ получаСтся Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Π² случаС с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для конструкции try-catch-finally.

Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° foo():

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ для всСх сцСнариСв, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° try-catch-finally: finallyMethod() вызываСтся Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π°(!). Π‘Π»ΠΎΠΊ try скомпилировался Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ try Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΈ ΠΎΠ½ Π±Ρ‹Π» ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½ с finally:
0: aload_0
1: invokespecial #2; //Method tryMethod:()V
4: aload_0
5: invokespecial #3; //Method finallyMethod:()V
Если Π±Π»ΠΎΠΊ выполняСтся, Ρ‚ΠΎ инструкция goto ΠΏΠ΅Ρ€Π΅ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° 30-ю ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ с ΠΎΠΏΠΊΠΎΠ΄ΠΎΠΌ return.

Если tryMethod бросит Exception, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ подходящий (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ) ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Из Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ позиция с ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΎΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π°Π²Π½Π° 11:

0 4 11 Class java/lang/Exception

Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° catchMethod() ΠΈ finallyMethod():

11: astore_1
12: aload_0
13: invokespecial #5; //ΠΌΠ΅Ρ‚ΠΎΠ΄ catchMethod:()V
16: aload_0
17: invokespecial #3; //ΠΌΠ΅Ρ‚ΠΎΠ΄ finallyMethod:()V

Если Π² процСссС выполнСния Π±ΡƒΠ΄Π΅Ρ‚ Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ позиция Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° 23:

0 4 23 any
11 16 23 any
23 24 23 any

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ, начиная с 23:

23: astore_2
24: aload_0
25: invokespecial #3; //Method finallyMethod:()V
28: aload_2
29: athrow
30: return

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ finallyMethod() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π² любом случаС, с aload_2 ΠΈ athrow, Π±Ρ€ΠΎΡΠ°ΡŽΡ‰ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π­Ρ‚ΠΎ всСго лишь нСсколько ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· области Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° JVM. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‡Π΅Ρ€ΠΏΠ½ΡƒΡ‚ΠΎ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ developerWorks Peter Haggar β€” Java bytecode: Understanding bytecode makes you a better programmer. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ устарСла, Π½ΠΎ Π΄ΠΎ сих ΠΏΠΎΡ€ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°. Руководство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ BCEL содСрТит достойноС описаниС основ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, поэтому я ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Π±Ρ‹ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΌΡΡ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, спСцификация Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ источником ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½ΠΎ Π΅Π΅ Π½Π΅Π»Π΅Π³ΠΊΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, ΠΊΡ€ΠΎΠΌΠ΅ этого отсутствуСт графичСский ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ.

Π’ Ρ†Π΅Π»ΠΎΠΌ, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, являСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π² ΡƒΠ³Π»ΡƒΠ±Π»Π΅Π½ΠΈΠΈ своих Π·Π½Π°Π½ΠΈΠΉ Π² Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, особСнно для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ присматриваСтся ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌ, компиляторам JVM-языков ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

May 15 Β· 6 min read

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ извСстно, ΠΊΠ°ΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² экосистСмС языка ΠΈΠ³Ρ€Π°Π΅Ρ‚ JVM. Однако Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π½Π΅ разбираСтся Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JVM ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ. Π₯отя для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Java это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ΄ станСт Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π²Ρ‹ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅ JVM, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ каТдая строка ΠΊΠΎΠ΄Π° влияСт Π½Π° процСссы Π²Π½ΡƒΡ‚Ρ€ΠΈ JVM.

Однако для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Π²ΠΎΠ΄Π΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Java ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ влияСт Π½Π° JVM Π²ΠΎ врСмя запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java?

Если Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ Π²Ρ‹ ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΏΠΎΠ²Π΅Π΄ΡƒΡŽΡ‚ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, скаТитС спасибо Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρƒ.

Как гСнСрируСтся Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄?

Как ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java?

Если Π²Π°ΠΌ хочСтся ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ сам Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ β€” Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкой.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JVM

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, стоит ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ JVM Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄Π° для JVM. Π‘Ρ€Π΅Π΄Π° выполнСния Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ β€” это, ΠΏΠΎ сути, Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… JVM. JVM создаСт Ρ„Ρ€Π΅ΠΉΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ созданный Ρ„Ρ€Π΅ΠΉΠΌ Π½Π°Π²Π΅Ρ€Ρ… стСка Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° для выполнСния.

Π€Ρ€Π΅ΠΉΠΌ состоит ΠΈΠ· локальной срСды, которая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для поддСрТания Π΅Π³ΠΎ выполнСния. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ½ содСрТит массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ стСк ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти элСмСнты ΠΈΠ· сСбя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚.

Массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· названия, Π½ΡƒΠΆΠ΅Π½ для хранСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: ΠΎΠ΄ΠΈΠ½ статичСский ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра, Π½ΠΎ схоТиС Π²ΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ массивы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ²

Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² β€” это Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ пространство Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это стСк, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ значСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π΅Π³ΠΎ части. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π»ΠΈΠ±ΠΎ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² стСк, Π»ΠΈΠ±ΠΎ Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚ значСния ΠΈΠ· стСка для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° load ΠΈ Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½ΡƒΠΆΠ½Ρ‹ для пСрСмСщСния значСния, хранящСгося Π² массивС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π² стСк. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ store примСняСтся для извлСчСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· стСка ΠΈ сохранСния Π² массивС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ значСния ΠΈΠ· стСка для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄

Π Π°Π΄ΠΈ возмоТности Π²Π³Π»ΡΠ΄Π΅Ρ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, я написал простой Java-класс:

ДСконструкция Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°

Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ: индСксы, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ инструкциям Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° β€” ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ½ΠΈ Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ инструкции.

Число ΠΏΠ΅Ρ€Π΅Π΄ инструкциСй ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° индСкс Π΅Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°. А любой Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ², Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ слСдуСт ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ².

Π’Ρ‹Π²ΠΎΠ΄

НадСюсь, Π²Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java. Π‘ этим Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΈΠΌ Π·Π½Π°Π½ΠΈΠ΅ΠΌ Π²Ρ‹ смоТСтС Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с самим Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, воспользовавшись Ρ‚Π°ΠΊΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ ASM.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ извСстно, ΠΊΠ°ΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² экосистСмС языка ΠΈΠ³Ρ€Π°Π΅Ρ‚ JVM. Однако Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π½Π΅ разбираСтся Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JVM ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ. Π₯отя для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Java это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ΄ станСт Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π²Ρ‹ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅ JVM, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ каТдая строка ΠΊΠΎΠ΄Π° влияСт Π½Π° процСссы Π²Π½ΡƒΡ‚Ρ€ΠΈ JVM.

Однако для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Π²ΠΎΠ΄Π΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Java ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ влияСт Π½Π° JVM Π²ΠΎ врСмя запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java?

Если Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ Π²Ρ‹ ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΏΠΎΠ²Π΅Π΄ΡƒΡŽΡ‚ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, скаТитС спасибо Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρƒ.

Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄ β€” это Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ JVM примСняСт для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, сгСнСрированный для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π΅ зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π³Π΄Π΅ ΠΎΠ½Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° любой машинС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ JVM для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°.

Как гСнСрируСтся Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄?

Как ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java?

Если Π²Π°ΠΌ хочСтся ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ сам Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ β€” Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкой.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JVM

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, стоит ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ JVM Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄Π° для JVM. Π‘Ρ€Π΅Π΄Π° выполнСния Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ β€” это, ΠΏΠΎ сути, Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… JVM. JVM создаСт Ρ„Ρ€Π΅ΠΉΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ созданный Ρ„Ρ€Π΅ΠΉΠΌ Π½Π°Π²Π΅Ρ€Ρ… стСка Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° для выполнСния.

Π€Ρ€Π΅ΠΉΠΌ состоит ΠΈΠ· локальной срСды, которая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для поддСрТания Π΅Π³ΠΎ выполнСния. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ½ содСрТит массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ стСк ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти элСмСнты ΠΈΠ· сСбя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚.

Массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· названия, Π½ΡƒΠΆΠ΅Π½ для хранСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: ΠΎΠ΄ΠΈΠ½ статичСский ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра, Π½ΠΎ схоТиС Π²ΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ массивы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ²

Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² β€” это Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ пространство Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это стСк, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ значСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π΅Π³ΠΎ части. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π»ΠΈΠ±ΠΎ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² стСк, Π»ΠΈΠ±ΠΎ Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚ значСния ΠΈΠ· стСка для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° load ΠΈ Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½ΡƒΠΆΠ½Ρ‹ для пСрСмСщСния значСния, хранящСгося Π² массивС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π² стСк. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ store примСняСтся для извлСчСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· стСка ΠΈ сохранСния Π² массивС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ значСния ΠΈΠ· стСка для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄

Π Π°Π΄ΠΈ возмоТности Π²Π³Π»ΡΠ΄Π΅Ρ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, я написал простой Java-класс:

ДСконструкция Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°

Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ: индСксы, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ инструкциям Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° β€” ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ½ΠΈ Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ инструкции.

Число ΠΏΠ΅Ρ€Π΅Π΄ инструкциСй ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° индСкс Π΅Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°. А любой Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ², Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ слСдуСт ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ².

Π’Ρ‹Π²ΠΎΠ΄

НадСюсь, Π²Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java. Π‘ этим Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΈΠΌ Π·Π½Π°Π½ΠΈΠ΅ΠΌ Π²Ρ‹ смоТСтС Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с самим Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, воспользовавшись Ρ‚Π°ΠΊΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ ASM.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ извСстно, ΠΊΠ°ΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² экосистСмС языка ΠΈΠ³Ρ€Π°Π΅Ρ‚ JVM. Однако Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π½Π΅ разбираСтся Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JVM ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ. Π₯отя для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Java это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ΄ станСт Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π²Ρ‹ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅ JVM, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ каТдая строка ΠΊΠΎΠ΄Π° влияСт Π½Π° процСссы Π²Π½ΡƒΡ‚Ρ€ΠΈ JVM.

Однако для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Π²ΠΎΠ΄Π΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Java ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ влияСт Π½Π° JVM Π²ΠΎ врСмя запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java?

Если Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ Π²Ρ‹ ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΏΠΎΠ²Π΅Π΄ΡƒΡŽΡ‚ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, скаТитС спасибо Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρƒ.

Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄ β€” это Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ JVM примСняСт для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, сгСнСрированный для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π΅ зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π³Π΄Π΅ ΠΎΠ½Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° любой машинС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ JVM для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°.

Как гСнСрируСтся Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄?

Как ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java?

Если Π²Π°ΠΌ хочСтся ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ сам Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ β€” Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкой.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JVM

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, стоит ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ JVM Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄Π° для JVM. Π‘Ρ€Π΅Π΄Π° выполнСния Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ β€” это, ΠΏΠΎ сути, Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… JVM. JVM создаСт Ρ„Ρ€Π΅ΠΉΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ созданный Ρ„Ρ€Π΅ΠΉΠΌ Π½Π°Π²Π΅Ρ€Ρ… стСка Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° для выполнСния.

Π€Ρ€Π΅ΠΉΠΌ состоит ΠΈΠ· локальной срСды, которая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для поддСрТания Π΅Π³ΠΎ выполнСния. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ½ содСрТит массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ стСк ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти элСмСнты ΠΈΠ· сСбя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚.

Массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· названия, Π½ΡƒΠΆΠ΅Π½ для хранСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: ΠΎΠ΄ΠΈΠ½ статичСский ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра, Π½ΠΎ схоТиС Π²ΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ массивы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ²

Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² β€” это Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ пространство Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это стСк, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ значСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π΅Π³ΠΎ части. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π»ΠΈΠ±ΠΎ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² стСк, Π»ΠΈΠ±ΠΎ Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚ значСния ΠΈΠ· стСка для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° load ΠΈ Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½ΡƒΠΆΠ½Ρ‹ для пСрСмСщСния значСния, хранящСгося Π² массивС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π² стСк. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ store примСняСтся для извлСчСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· стСка ΠΈ сохранСния Π² массивС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ значСния ΠΈΠ· стСка для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄

Π Π°Π΄ΠΈ возмоТности Π²Π³Π»ΡΠ΄Π΅Ρ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, я написал простой Java-класс:

ДСконструкция Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°

Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ: индСксы, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ инструкциям Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° β€” ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ½ΠΈ Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ инструкции.

Число ΠΏΠ΅Ρ€Π΅Π΄ инструкциСй ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° индСкс Π΅Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°. А любой Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ², Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ слСдуСт ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ².

Π’Ρ‹Π²ΠΎΠ΄

НадСюсь, Π²Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java. Π‘ этим Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΈΠΌ Π·Π½Π°Π½ΠΈΠ΅ΠΌ Π²Ρ‹ смоТСтС Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с самим Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, воспользовавшись Ρ‚Π°ΠΊΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ ASM.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΡΠ½ΠΎΠ²Ρ‹ Java Bytecode

Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ ΠΊΠΎΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡ‚Π°Ρ‚ΡŒΡ содСрТит довольно ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ довольно тяТСлой ΠΈ объСмной

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основы Java Bytecode. Если Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π΅Π³ΠΎ основами, ΡΡ‚Π°Ρ‚ΡŒΡ вряд Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°ΠΌ интСрСсна, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ практичСски всС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π΅ рассмотрСны ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„Ρ€Π΅ΠΉΠΌΡ‹, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹), ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ Π΅Ρ‰Π΅ большС

Π—Π°Ρ‡Π΅ΠΌ Π·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎ Bytecode

Π’Π΅ΠΌΠ° bytecode довольно скучная ΠΈ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ срСднСстатистичСского программиста практичСски Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Π’Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ стоит Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ основы bytecode:

какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ с этим Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Java Machine ΠΈ хочСтся ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π»Π΅ΠΆΠΈΡ‚ Π² основС

    ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ соврСмСнныС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΡ…ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ bytecode ΠΈ часто ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚Π°ΠΌ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ (ΠΏΡ€ΠΈΠ²Π΅Ρ‚, Lombok)

    ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ просто стало скучно πŸ™‚

    Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ содСрТимоС, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартной ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ

    javap ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим основныС ΠΈΠ· Π½ΠΈΡ….

    Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±ΡƒΠ΄Π΅ΠΌ Π½Π° стандартном классС java.lang.Object

    Π‘Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

    Выводится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основная информация ΠΏΠΎ классам, ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΈ полям (ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ)

    ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

    ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (verbose), Ρ‚Π°ΠΊΡƒΡŽ, ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², вСрсии ΠΈ Ρ‚.Π΄.

    Π’ IDEA ΠΈΠΌΠ΅Π΅Ρ‚ встроСнныС срСдства для просмотра:

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ для Java какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ для Kotlin

    ВСрсии class Ρ„Π°ΠΉΠ»ΠΎΠ²

    Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ вСрсии class Ρ„Π°ΠΉΠ»ΠΎΠ² какая jvm ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

    ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ major вСрсии

    Для вСрсии Java, начиная с 5, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° Major-44=ВСрсия Java

    access_flags

    Flag Name (Имя Ρ„Π»Π°Π³Π°)

    public, Π²ΠΈΠ΄Π΅Π½ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°

    final ; Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ наслСдован

    ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² супСр-класса ΠΊΠΎΠ³Π΄Π° вызываСтся инструкция invokespecial. (ссылка Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС)

    Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ, Π½Π΅ класс

    Абстрактный, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ наслСдован

    БинтСтичСский, Π½Π΅ ΠΈΠ· ΠΊΠΎΠ΄Π°

    ΠœΠΎΠ΄ΡƒΠ»ΡŒ, Π½Π΅ класс ΠΈΠ»ΠΈ интСрфСйс

    Π’Π½ΡƒΡ‚Ρ€ΡŒ Bytecode

    Рассмотрим ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ простой Ρ„Π°ΠΉΠ»:

    ВСрсия 55.0, Ρ‡Ρ‚ΠΎ соотвСтствуСт вСрсии Java 11 (55-44=11)

    Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„Π°ΠΉΠ» с ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠ»Π΅ΠΌ :

    Π§Π°ΡΡ‚ΡŒ bytecode, ΠΊΠ°ΡΠ°ΡŽΡ‰Π°ΡΡΡ поля:

    Для ΠΏΠΎΠ»Π΅ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ„Π»Π°Π³ΠΈ доступа, имя, описаниС (сигнатура поля) ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (здСсь, ConstantValue)

    Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Ρ‹ (descriptor) для ΠΏΠΎΠ»Π΅ΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

    ОписаниС структуры ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

    Рассмотрим простой класс:

    Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚ΡƒΡ‚.

    Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

    ΠžΡΠ½ΠΎΠ²Ρ‹

    ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ.

    Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ JVM Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ 1 Π±Π°ΠΉΡ‚, Π·Π°Ρ‚Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ инструкции (Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ).

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    iconst_1. ΠšΠ»Π°Π΄Π΅Ρ‚ Π½Π° стСк 1.

    istore_1. Π‘Π½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка ΠΈ записываСт Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄ индСксом 1

    iload_1. ЗаписываСт Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ индСксом 1.

    iconst_2. ЗаписываСт Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2.

    iadd. Π‘Π½ΠΈΠΌΠ°Π΅Ρ‚ с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа, суммируСт ΠΈΡ… ΠΈ ΠΊΠ»Π°Π΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка

    istore_2. Π‘Π½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка ΠΈ записываСт Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄ индСксом 2

    getstatic #2. Находит ссылку Π½Π° статичСскоС ΠΏΠΎΠ»Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎΠ΄ индСксом #2 ΠΈ ΠΊΠ»Π°Π΄Π΅Ρ‚ Π΅Π΅ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка

    iload_2. ЗаписываСт Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ индСксом 2.

    invokevirtual #3. Находит ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎΠ΄ #3, снимаСт Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка для использования ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, снимаСт ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ выполняСт ΠΌΠ΅Ρ‚ΠΎΠ΄. Если ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚, ΠΊΠ»Π°Π΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

    Как это выглядит Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅ (анимация):

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    РСализация if

    Рассмотрим Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    РСализация Ρ†ΠΈΠΊΠ»ΠΎΠ²

    Π¦ΠΈΠΊΠ»Ρ‹ стандартно Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ if.

    Рассмотрим исходный ΠΊΠΎΠ΄ ΠΈ Π΅Π³ΠΎ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄:

    РСализация switch

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    РСализация throw

    ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠ½ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚:

    Π—Π΄Π΅ΡΡŒ добавилась Exception table, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ строки отсортированы Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина провСряСт соотвСтствиС строки ΠΈ Π²ΠΈΠ΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ свСрху Π²Π½ΠΈΠ· с послСднСй Ρ‚ΠΎΡ‡ΠΊΠΈ, Π³Π΄Π΅ ΠΎΠ½Π° ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»Π°ΡΡŒ.

    Когда ΠΌΡ‹ дошли Π΄ΠΎ 9 строчки, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина выбросила ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. И Π½Π°Ρ‡Π°Π»Π° ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Exception table. ΠŸΠ΅Ρ€Π²Π°Ρ запись удовлСтворяСт условиям использования (строчка 9 находится Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 10 ΠΈ ΡƒΠΊΠ°Π·Π°Π½ RuntimeException) ΠΈ поэтому выполняСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° строчку 10.

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΠΌ Π΄ΠΎ строчки 31 ΠΈ снова выполняСтся выброс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΌΡ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с 2 строчки ExceptionTable. Она Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈ поэтому ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° 3, которая ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, ΠΈ выполняСм ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° 32 строчку.

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    Π’Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (opcode: invokestatic, invokespecial, invokevirtual, invokeinterface, invokedynamic)

    invokestatic

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. (Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ статичСскоС связываниС /Static Dispatch)

    invokespecial

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прямого Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ класса, конструкторов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса (Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ статичСскоС связываниС/Static Dispatch).

    ΠŸΡ€ΠΈ этом ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ пСрСдаСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

    Bytecode для конструктора класса Son

    какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°. Π€ΠΎΡ‚ΠΎ какая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π°

    invokevirtual

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса, ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ динамичСский поиск ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° классС (Dynamic Dispatch). Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ρ‚ΠΎ сначала провСряСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌ классС, ΠΏΠΎΡ‚ΠΎΠΌ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Для поиска Π² HotSpot ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚ΡƒΡ‚. ΠŸΡ€ΠΈ этом ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ пСрСдаСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

    НСмного ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

    Bytecode для конструктора класса Son

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² строчках 5 ΠΈ 10 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ invokevirtual.

    invokeinterface

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² интСрфСйса (Dynamic Dispatch). ΠŸΡ€ΠΈ этом ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ пСрСдаСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

    На 9 строчкС вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ интСрфСйса

    invokedynamic

    Π’Ρ‹Π·ΠΎΠ² динамичСски-вычисляСмых call sites. БСйчас, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Java для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для лямбд. ОписаниС, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ opcode, Π·Π°ΠΉΠΌΠ΅Ρ‚ Π½Π΅ ΠΎΠ΄Π½Ρƒ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚ΡƒΡ‚

    Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ основных opcode

    Полная ΠΈ СдинствСнно достовСрная информация находится Π½Π° сайтС Oracle.

    aconst_null (0x1)

    ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° стСк null

    Π€ΠΎΡ€ΠΌΠ°Ρ‚: dload index

    Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

    Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

    Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *